Servlet的生命周期总结及虚拟路径的配置方法

Servlet的生命周期的定义:

Servlet是使用java Servlet应用程序设计接口及相关类和方法的java程序。

Servlet的生命周期过程:

Servlet的生命周期主要分为3个阶段;

  • 初始化阶段:检测web服务器中是否存在Servlet实例,若不存在,则装载Servlet类并创建Servlet实例,调用Servlet的init(ServletConfig config)初始化方法;
  • 服务阶段:初始化完毕,调用Servlet的service(ServletRequest req, ServletResponse res)方法响应客户端的请求;
  • 销毁阶段:服务器调用Servlet的destroy()方法移除servlet对象;

注意: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配置文件;

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
		
	<!-- 先配置Servlet信息 -->
	<servlet>
    <!-- 配置Servlet名称,名称必须唯一 -->
		<servlet-name>ServletLifeDemo</servlet-name>
    <!-- 配置Servlet的完全路径(包名+类名) -->
		<servlet-class>cn.itcast.servlet.ServletLifeDemo</servlet-class>
	</servlet>
    <!-- 配置Servlet映射(访问路径) -->
	<servlet-mapping>
    <!-- 配置Servlet名称,和上面的名称相同 -->
		<servlet-name>ServletLifeDemo</servlet-name>
    <!-- 配置虚拟路径 (访问路径) 可以是/hello,也可以是/helloservlet,也可以是其他虚拟路径,随便定义-->
		<!-- 但在浏览器访问的时候必须加上这个虚拟路径 -->
		<url-pattern>/servletLife</url-pattern>
	</servlet-mapping>
</web-app>

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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值