一、Servlet生命周期
生命周期图示:
Servlet生命周期大致分为三个阶段,分别是初始化阶段,运行阶段,销毁阶段
1、初始化阶段:
当客户端向Servlet容器发出HTTP请求访问Servlet时,Servlet容器首先解析请求,检查内存中是否已经有了该Servlet对象,如果有,直接使用该Servlet对象;如果没有,就创建Servlet实例对象,然后通过调用init()方法完成Servlet初始化。需要注意,在Servlet整个生命周期内,它的init()方法只被调用一次
2、运行阶段:
Servlet容器会为客户端请求创建代表HTTP请求的ServletRequest对象和代表HTTP响应的ServletResponse对象,然后将它们作为参数传递给Servlet的service()方法。service()方法从ServletRequest对象中获取客户端请求并处理该请求,通过ServletResponse对象生成响应结果。在Servlet整个生命周期内,对于Servlet的每一次访问请求,Servlet容器都会调用一次Servlet的service()方法,并且创建新的ServletRequest和ServletResponse对象。即service()方法在Servlet整个生命周期中会被调用多次
3、销毁阶段:
当服务器关闭或者Web应用被移除出容器时,Servlet随着Web应用的销毁而销毁。在销毁Servlet之前,Servlet容器会调用Servlet的destroy()方法,以便让Servlet对象释放它所占用的资源。在Servlet的整个生命周期中,destroy()方法也只被调用一次。注意,Servlet对象一旦创建就会驻留在内存中等待客户端的访问,直到服务器关闭或Web应用被移除出容器时Servlet对象才会销毁
二、Servlet配置
使用web.xml配置Servlet
1、在web.xml文件中,通过 <servlet></servlet> 标签进行注册,<servlet>标签下包含若干个子元素,功能如下
元素 | 类型 | 描述 |
<servlet-name></servlet-name> | String | 指定Servlet名称,一般与Servlet类同名,要求唯一 |
<servlet-class></servlet-class> | String | 指定Servlet位置,一般是全类名 |
<description> </description> | String | 指定Servlet的描述信息 |
<display-name></display-name> | String | 指定Servlet的显示名 |
2、 把Servlet映射到URL地址,使用 <servlet-mapping></servlet-mapping> 进行映射,在<servlet-mapping>元素下使用 <servlet-name></servlet-name> 指出Servlet的名称,需要和之前在<servlet>标签下注册的相同;使用 <url-pattern></url-pattern> 映射URL地址,地址前必须添加/
3、实例
<servlet> <!--指出Servlet名称--> <servlet-name>ServletDemo01</servlet-name> <!--指出Servlet全类名--> <servlet-class>com.demo.ServletDemo01</servlet-class> </servlet> <servlet-mapping> <!--和servlet标签下的名称一致--> <servlet-name>ServletDemo01</servlet-name> <!--映射地址,必须加斜杠--> <url-pattern>/ServletDemo01</url-pattern> </servlet-mapping>
使用注解配置Servlet
1、@WebServlet注解用于代替web.xml文件中的 <servlet> 、 <servlet-mapping> 等标签,该注解会在项目部署时被容器处理,容器会根据具体的属性配置将相应的类部署为Servlet,@WebServlet注解常用属性如下
2、常用属性
属性声明 | 功能 |
String name | 指定Servlet的name属性,等价于<servlet-name>,如果没有显式指定则取值为类的全限定名 |
String[] value | 等价于<url-pattern> |
String[] urlPatterns | 和value功能一样,value和urlPatterns不能同时使用 |
int loadOnStartup | 指定Servlet的加载时机,等价于<load-on-startup> |
WebInitParam[] initParams | 指定一组Servlet初始化参数,等价于<init-param>,其中WebInitParam也是一种注解 |
3、实例
@WebServlet(name = "ServletDemo01",urlPatterns = "/ServletDemo01",initParams = {@WebInitParam(name = "encoding",value = "UTF-8"),@WebInitParam(name = "desc",value = "this is ServletDemo01")}) public class ServletDemo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("ServletDemo01运行了"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } }
三、Servlet创建时机
● 第一次访问时创建
优势:减少服务器内存的浪费
弊端:如果有一些需要在应用加载时就做的初始化操作,无法完成
● 服务器加载时创建
优势:提前创建好对象,提高首次执行时的效率,可以完成一些应用加载时要做的初始化工作
弊端:对服务器内存占用较多,影响服务器启动效率
● 修改Servlet创建时机:在web.xml文件的<servlet>标签中添加 <load-on-startup></load-on-startup> 标签,标签中间填写的是整数,正整数表示在服务器加载时创建,值越小优先级越高,负整数或者不填表示第一次访问时创建
四、默认Servlet
● 默认Servlet是服务器提供的一个Servlet,它配置在Tomcat的conf目录中的web.xml文件中
● 它的映射路径是 <url-pattern>/</url-pattern> ,在接收请求时,首先会在项目中的web.xml文件查找映射配置,找到则执行,找不到时再去找默认的Servlet,由默认Servlet处理