本文共 2899 字,大约阅读时间需要 9 分钟。
Servlet是使用java Servlet应用程序设计接口及相关类和方法的java程序。
Servlet的生命周期主要分为3个阶段;
注意:init()方法只有在Servlet第一次被请求加载的时候被调用一次,当有客户发出请求Servlet服务时,Web服务器将启动一个新的线程,在该线程中,调用service方法响应客户的请求;在Servlet的整个生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
若对Servlet生命周期有啥不懂的可以参考以下图片:
接下来举一个简单的描述Servlet生命周期的实例,下面是代码:
分为两步:第一步编写Servlet的java程序;
package cn.itcast.servlet;import java.io.IOException;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class ServletLifeDemo implements Servlet {/** * Servlet实例被创建后,调用init方法进行初始化 * Servlet什么时候被创建呢? * *并不是服务器一启动,实例就创建,第一次访问的时候,实例才被创建。 * init方法调用几次? * *只被调用一次 */ @Override public void init(ServletConfig config) throws ServletException { // TODO Auto-generated method stub System.out.println("调用了init方法"); }/** * Servlet服务什么时候被调用呢? *有一次请求调用一次 */ @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("调用了service方法"); } @Override public void destroy() { // TODO Auto-generated method stub System.out.println("调用了destroy方法"); } @Override public ServletConfig getServletConfig() { // TODO Auto-generated method stub return null; }/** * Servlet实例什么时候被销毁呢? * *服务器关闭,手动移除。 * destroy调用几次? * *一次 */ @Override public String getServletInfo() { // TODO Auto-generated method stub return null; }}
第二步:配置Servlet的web.xml配置文件;
ServletLifeDemo cn.itcast.servlet.ServletLifeDemo ServletLifeDemo /servletLife
Servlet虚拟路径的三种配置方法:
*以完全路径开头
*以/开头 格式是“*.扩展名” 可以命名为 /demo 也可以命名为 /servlet/demo ,然后通过虚拟路径访问
*目录匹配
*以/开头 格式是以正斜杠(/)开头并以“/*”结尾。可以命名为 /* 也可以命名为 /aa/* 然后可以通过 /demo或者 /servlet/demo都能访问
*扩展名匹配
*不能以/开头 可以命名为 *.do 也可以命名为 *.action 然后可以通过 demo.do或者 /servlet/demo.do都能访问,但必须以.do结尾
*虚拟路径优先级:完全优先级>目录匹配>扩展名匹配
如果想更深刻的理解虚拟文件路径的优先级顺序:
对于如下的一些映射关系:
Servlet1 映射到 /abc/* Servlet2 映射到 /* Servlet3 映射到 /abc Servlet4 映射到 *.do 问题:
当请求URL为“/abc/a.html”,“/abc/*”和“/*”都匹配,哪个servlet响应 Servlet引擎将调用Servlet1。
当请求URL为“/abc”时,“/abc/*”和“/abc”都匹配,哪个servlet响应 Servlet引擎将调用Servlet3。
当请求URL为“/abc/a.do”时,“/abc/*”和“*.do”都匹配,哪个servlet响应 Servlet引擎将调用Servlet1。
当请求URL为“/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应 Servlet引擎将调用Servlet2.
当请求URL为“/xxx/yyy/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应 Servlet引擎将调用Servlet2。
参考:传智播客 www.itcast.cn
转载地址:http://kzdqb.baihongyu.com/