该篇文章记录了Servlet配置相关用法及Servlet在Servlet容器中生命周期方法。
- Tomcat是一个Servlet容器:
1、Servlet容器管理了Servlet的整个生命周期,并调用servlet的生命周期的方法。
2、Servlet容器不只是Servlet的生命周期,而且还是Jsp,Filter,Listener,Tag等生命周期管理容器。
- Servlet的注册与运行
1、Servlet程序必须通过Servlet容器来启动运行,并且存储目录有特殊要求,通常servlet编译好的.class文件要存储在<WEB应用程序目录>\WEB-INF\classes\目录中。
2、Servlet程序必须在WEB应用程序的web.xml文件中进行注册和映射其访问路径,才可以被Servlet引擎加载被外界访问。
3、一个<servlet>元素用户注册一个Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用户设置Servlet的注册名称和Servlet的完整类名。
4、一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用户指定Servlet的注册名称和Servlet的对外访问路径。
- Servlet容器相应客户请求的过程:
1、servlet引擎检查是否已经装载被创建该servlet的实例对象。如果已经创建,则直接执行第4步;否则,执行第2步。
2、装载并创建该servlet的一个实例对象:调用该servlet的构造函数。
3、调用servlet实例对象的init方法。
4、创建一个用于封装请求的ServletRequest对象和一个代表相应消息的ServletResponse对象,然后调用Servlet的service方法并将请求和相应对象作为参数传递进去。
5、web应用程序被停止或者重启之前,servlet引擎将卸载servlet,并在卸载之前调用servlet的destory方法。
- Servlet生命周期的方法(以下方法都是有Servlet容器负责调用):
1、首先是创建实例时调用构造器:只被调用一次,只有第一次请求Servlet时,创建Servlet的实例,调用构造器。
2、init方法:只被调用一次,在创建好Servlet实例后立即调用init函数,用户初始化当前Servlet实例
3、service方法:被多次调用,每次请求都会被调用,用于相应请求。
4、destory方法:只被调用一次,在当前servlet所在的web应用被卸载前调用,用于释放servlet所占用的资源。
- Servlet配置需要注意事项:
servlet节点下的load-on-startup配置:
1、可以指定servlet被创建的时机;
2、默认该参数为负数,在加载web应用时,不加载servlet实例,而在第一次请求时被创建;
3、若为0或者正数,则在当前WEB应用被servlet加载时创建家实例,且值越小越早被创建。
配置示例:
<!-- 配置和映射 servlet -->
<servlet>
<!-- Servlet注册的名字 -->
<servlet-name>helloServlet</servlet-name>
<!-- Servlet全类名 -->
<servlet-class>com.dx.hello.HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!-- 对应servlet节点下的servlet-name的注册名字一致 -->
<servlet-name>helloServlet</servlet-name>
<!-- 映射具体的访问路径,其中/代表当前web的根目录 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
- Servlet映射的细节:
1、同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。
比如:
<!-- 配置和映射 servlet -->
<servlet>
<!-- Servlet注册的名字 -->
<servlet-name>helloServlet</servlet-name>
<!-- Servlet全类名 -->
<servlet-class>com.dx.hello.HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!-- 对应servlet节点下的servlet-name的注册名字一致 -->
<servlet-name>helloServlet</servlet-name>
<!-- 映射具体的访问路径,其中/代表当前web的根目录 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<!-- 对应servlet节点下的servlet-name的注册名字一致 -->
<servlet-name>helloServlet</servlet-name>
<!-- 映射具体的访问路径,其中/代表当前web的根目录 -->
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
这样子就可以通过http://localhost:8080/MyServlet001/hello和http://localhost:8080/MyServlet001/hello2访问同一个servlet。
2、在Servlet映射到URL中也可以使用*通配符,但是只能有两种固定的格式:一种是“*.扩展名”,另外一种是以正斜杠“/”开头并以“/”结尾。
比如:
<servlet-mapping>
<!-- 对应servlet节点下的servlet-name的注册名字一致 -->
<servlet-name>helloServlet2</servlet-name>
<!-- 映射具体的访问路径,其中/代表当前web的根目录 -->
<url-pattern>*.do</url-pattern>
<!-- <url-pattern>*.html</url-pattern> -->
</servlet-mapping>
<servlet-mapping>
<!-- 对应servlet节点下的servlet-name的注册名字一致 -->
<servlet-name>helloServlet1</servlet-name>
<!-- 映射具体的访问路径,其中/代表当前web的根目录 -->
<url-pattern>/hello2/*</url-pattern>
<!-- <url-pattern>/*</url-pattern> -->
</servlet-mapping>
但需要注意事项:
1、*.html这样写是没有问题的,如果配置为/*.html或者/*.action、/*.do等格式的,是错误的配置,加载时会跑出异常信息。
2、若果配置为*没有后缀名,则必须浅表带/,格式为:/*或者/a/*等等。