JavaWeb之Servlet详解

本文详细介绍了Servlet的各个方面,包括其概念、工作原理、生命周期、ServletConfig、ServletContext、GenericServlet、HttpServlet及其执行流程。此外,还讲解了HTTP协议、HttpServletRequest和HttpServletResponse接口、请求转发与重定向、Cookie、HttpSession、以及处理乱码和路径问题的方法。最后提到了Servlet 3.0的注解配置。
摘要由CSDN通过智能技术生成

文章目录

一,什么是Servlet

Servlet字面意思即服务端小程序
Servlet是一组接口、一组规范、一个协议;用于开发Web项目

一个工程的搭建通常由各模块组成;各个模块分工协作、相互配合可以高效率地构建大型项目。各个模块之间需要一组规范来连接,Servlet就是这样一组规范

B/S架构中涉及到的协议、标准、规范:

  • 浏览器和Web服务器之间的请求和响应遵循HTTP协议
  • WEB服务器和web项目的开发者(我们)之间有一些规范,例如:Servlet、JSP规范
  • Web项目的开发者(我们)和数据库服务器之间有一个规范,叫做JDBC规范

二,Servlet

1,Servlet是如何起作用的

每一个url都对应着互联网中的一个资源,分为静态资源和动态资源,例如:

  • http://202.108.251.34:8080/egov/login.html请求路径对应着一个html网页资源
  • http://202.108.251.34:8080/oa/delete?empno=7369请求路径对应着一个动态资源、一段程序

这段程序就是Servlet程序,当浏览器发送某个请求时,服务器找到该请求对应的servlet程序并执行servlet对象的service()方法。请求路径与servlet程序的对应信息配置在web.xml文件中,如图:
在这里插入图片描述

2,Servlet接口中的方法

javax.servlet.Servlet接口

public interface Servlet {
   
	/**
	初始化方法,servlet对象创建之后会执行该方法;servlet对象为单例对象,故该方法只执行一次
	*/
    void init(ServletConfig config) throws ServletException;
	/**
	获取servletConfig对象,该对象由服务器创建并传入
	*/
    ServletConfig getServletConfig();
	/**
	主体方法,用于处理业务逻辑,服务器通过请求路径找到对应的servlet对象并执行该方法;由服务器传入请求和响应对象
	*/
    void service(ServletRequest request, ServletResponse response) throws ServletException, IOException;
	/**
	返回有关servlet的信息,例如作者,版本和版权
	*/
    String getServletInfo();
	/**
	销毁前的准备,servlet对象销毁前会执行该方法
	*/
    void destroy();
}

3,Servlet对象的生命周期

Servlet对象从最初的创建,方法的调用,到最后被销毁,都是由web容器来管理的,javaweb程序员无权干涉

具体过程:

  1. Web容器启动,解析web.xml文件,将请求路径与对应的servlet类名放到一个map集合中,如图:在这里插入图片描述
    大多数web容器还会维护一个请求路径与对应的servlet对象的集合,如图:在这里插入图片描述
    默认情况 下,servlet对象在Web容器启动阶段不会被实例化,而是在接收到第一次请求之后实例化;若想要在web容器启动时实例化,可进行如下配置:在这里插入图片描述
  2. 浏览器发送请求,web容器截取请求路径,通过请求路径在Map<String, Servlet>中查找对应的servlet对象;
    如果没有找到对应的servlet对象,则:
    1,通过请求路径在Map<String, String>找到对应的servlet全类名
    2,通过反射机制加载该类并调用无参构造方法完成servlet对象实例化
    3,调用servlet对象的init()方法完成初始化
    4,调用servlet对象的service()方法提供服务
    若找到了对应的servlet对象,则调用该对象的service()方法提供服务
  3. servlet对象销毁:web容器关闭的时候、webApp重新部署的时候、该servlet对象长时间没有用户访问的时候,web容器会将servlet对象销毁,在销毁servlet对象前,会调用对象的destroy()方法进行销毁前的准备

注意:servlet对象是单例,web容器为每个Servlet类只创建一个servlet对象

三,ServletConfig

1,什么是ServletConfig

  1. ServletConfig指javax.servlet.ServletConfig接口
  2. 【了解】Apache Tomcat服务器实现了Servlet规范,Tomcat服务器写了一个ServletConfig接口的实现类,实现类的完整类名是org.apache.catalina.core.StandardWrapperFacade
  3. ServletConfig对象封装了Servlet对象的配置信息,每个Servlet对象对应着一个ServletConfig对象;在web.xml中,ServletConfig对象对应着<servlet>标签中的所有内容,例如:
    在这里插入图片描述
  4. ServletConfig对象由服务器创建并在servlet对象初始化时传入: void init(ServletConfig servletConfig) throws ServletException;
  5. 在service()方法体中,可以通过getServletConfig()方法获取ServletConfig对象:在这里插入图片描述

2,ServletConfig中的方法

public interface ServletConfig {
   
	//获取servletName: <servlet-name>servletName</servlet-name>
    String getServletName();
	//获取ServletContext对象,ServletContext为Servlet的上下文环境,下章节讲
    ServletContext getServletContext();
    /**
    获取初始化参数name对应的value
	<init-param>
            <param-name>driver</param-name>
            <param-value>com.mysql.jdbc.driver</param-value>
    </init-param>
    */
    String getInitParameter(String paranmae);
	/**
	获取初始化参数的name集合的枚举(类似迭代器):
	Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
	通过name集合循环遍历拿出name,通过name获取value
	while (initParameterNames.hasMoreElements()) {
    	String name = initParameterNames.nextElement();
    	String value = servletConfig.getInitParameter(name);
	}
	*/
    Enumeration<String> getInitParameterNames();
}

三,ServletContext

1,什么是ServletContext

  1. ServletContext指javax.servlet.ServletConfig接口

  2. ServletContext对象由服务器创建,Tomcat服务器对ServletContext接口的实现类完整类名是:org.apache.catalina.core.ApplicationContextFacade

  3. ServletContext意为servlet的上下文环境,servletContext对象对应着整个项目,该对象只有一个且被所有servlet共享,servletContext对象对应着web.xml文件,例如:在这里插入图片描述

  4. web.xml文件服务器启动阶段被解析,servletContext对象在服务器启动阶段被创建,在服务器关闭时被销毁

2 ,ServletContext中的常用方法

/**
根据参数的名称获取value,均为字符串
<context-param>
        <param-name>driver</param-name>
        <param-value>com.mysql.jdbc.driver</param-value>
</context-param>
*/
String getInitParameter(String paraname);
//与ServletConfig中的方法作用相同
Enumeration<String> getInitParameterNames();
//向ServletContext对象中添加数据
void setAttribute(String name, Object obj);
//根据name从ServletContext对象中获取数据
Object getAttribute(String name);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我待Java如初恋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值