Servlet_2

Servlet_2

     1.Servlet的生命周期

         在 Java 中,任何对象都有生命周期,Servlet 也不例外。Servlet 的生命周期如图 1 所示。

         Servlet的生命周期,按照功能的不同,大致可以将Servlet的生命周期分为四个阶段,分别是加载实例化阶段、初始化阶段、运行阶段【处理请求】和销毁阶段。

         1.加载实例化阶段

            当Servlet容器启动以后,会加载项目的web.xml配置文件,并解析得到所有配置好的servlet-class中配置的包名+类名,通过反射机制就实例化好了包名+类名对应的Servlet类对象。

         2.初始化阶段

            当客户端向 Servlet 容器发出 HTTP 请求要求访问 Servlet 时,Servlet 容器首先会解析请求,检查内存中是否已经有了该 Servlet 对象,如果有,则直接使用该 Servlet 对象,如果没有,

则创建 Servlet 实例对象,然后通过调用 init() 方法实现 Servlet 的初始化工作。需要注意的是,在 Servlet 的整个生命周期内,它的 init() 方法只能被调用一次。

         3.运行阶段

            这是 Servlet 生命周期中最重要的阶段,在这个阶段中,Servlet 容器会为这个请求创建代表 HTTP 请求的 ServletRequest 对象和代表 HTTP 响应的 ServletResponse 对象,然后将它们

作为参数传递给 Servlet 的 service() 方法。 service() 方法从 ServletRequest 对象中获得客户请求信息并处理该请求,通过 ServletResponse 对象生成响应结果。


            在 Servlet 的整个生命周期内,对于 Servlet 的每一次访问请求,Servlet 容器都会调用一次 Servlet 的 service() 方法,并且创建新的 ServletRequest 和 ServletResponse 对象,也就是

说,service() 方法在 Servlet 的整个生命周期中会被调用多次。

         4.销毁阶段

            当服务器关闭或 Web 应用被移除出容器时,Servlet 随着 Web 应用的关闭而销毁。在销毁 Servlet 之前,Servlet 容器会调用 Servlet 的 destroy() 方法,以便让 Servlet 对象释放它所占

用的资源。在 Servlet 的整个生命周期中,destroy() 方法也只能被调用一次。

           需要注意的是,Servlet 对象一旦创建就会驻留在内存中等待客户端的访问,直到服务器关闭或 Web 应用被移除出容器时,Servlet 对象才会销毁。

package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;

public class TestServlet2 extends HttpServlet{
	@Override
	public void init() throws ServletException {
		System.out.println("初始化阶段调用 init() 方法实现 Servlet 的初始化工作");
	}
	@Override
	public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
		System.out.println("运行阶段Servlet 容器都会调用一次 Servlet 的 service() 方法,完成请求处理");
	}
	@Override
	public void destroy() {
		System.out.println("Servlet 容器会调用 Servlet 的 destroy() 方法,以便让 Servlet 对象释放它所占用的资源");
	}
}

      2.Servlet的service方法与doGet/doPost方法的关系

          1.service方法与doGet/doPost方法都是HttpServlet类的方法

              1.service(ServletRequest req, ServletResponse resp)---来自于Servlet接口

              2.service(HttpServletRequest req, HttpServletResponse resp)---自己定义的

              3.doGet(HttpServletRequest req, HttpServletResponse resp)----自己定义的

              4.doPost(HttpServletRequest req, HttpServletResponse resp)----自己定义的

            在具体处理请求的时候Servlet容器会默认调用来自于Servlet接口的.service(ServletRequest req, ServletResponse resp)方法来出里请求。HttpServlet类中会在用来自于Servlet接口

的.service(ServletRequest req, ServletResponse resp)方法中调用HttpServlet自己定义的service(HttpServletRequest req, HttpServletResponse resp),这是处理请求的时候,HttpServlet自己定

义的service(HttpServletRequest req, HttpServletResponse resp)就执行了,此时HttpServlet自己定义的service(HttpServletRequest req, HttpServletResponse resp)方法中用过

HttpServletRequest 对象得到请求提交方式,判断请求提交方式调用对应的doGet/doPost方法处理请求。

public abstract class HttpServlet extends GenericServlet {
    private static final String METHOD_GET = "GET";
    private static final String METHOD_POST = "POST";
    @Override
	public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
		HttpServletRequest arg0=(HttpServletRequest)req;
		HttpServletResponse arg1=(HttpServletResponse)resp;
		service(arg0,  arg1); 
	}
    protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
		String method=arg0.getMethod();
		if(method.equals("get")){
			doGet(arg0, arg1);
		}
		if(method.equals("post")){
			doPost(arg0, arg1);
		}
	}
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doGet(req, resp);
	}
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPost(req, resp);
	}
   
}

     3.Servlet配置虚拟路径映射

          Servlet 的多重映射指同一个 Servlet 可以被映射成多条虚拟路径。也就是说,客户端可以通过多条路径实现对同一个 Servlet 的访问。Servlet 多重映射的实现方式有以下两种。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值