Servlet工作原理

一、Servlet执行过程

   当客户端向服务器发送一个http请求后,web服务器会将这个请求交给Servlet容器去处理,Servlet容器首先对请求的URL进行解析并根据web.xml配置文件找到对应的Servlet去处理,同时将Request、Response对象传递给它,Servlet通过请求对象可知道客户端的请求者、请求信息等,Servlet处理完请求后会把所需要的信息放入Response对象中并返回给客户端,Servlet一旦处理请求,Servlet容器会刷新Response对象,并把控制权重新返回给web服务器。

二、Servlet生命周期

   1、初始化阶段,调用init()方法;

   当客户端第一次向服务器请求Servlet时,Servlet容器启动时会自动装载某些Servlet,Servlet类源文件被更新,重新装载Servelt,Servlet被装载后,Servlet容器创建一个Servelt实例并且调用Servlet的init()方法,在Servlet生命周期内,init()方法只调用一次;

   Servlet容器启动时会自动装载某些Servlet,实现它,只需要在web.xml文件中配置如下代码:

<!-- 
    标记Servlet容器是否启动时就加载这个Servlet,当值>=0时,表示Servlet容器启动时就加载这个Servlet,
    当数值为负数或者没有指定是,表示Servlet容器在该Servlet选择时才加载,正数的值越小,启动该Servlet的优先级越高。
-->
    <load-on-startup>1</load-on-startup>

   2、响应请求阶段,调用service()方法;

   服务器装载并初始化Servlet后,Servlet容器会创建ServletRequest对象与ServletResponse对象,然后调用Servlet的service()方法,service()方法从ServletRequest对象中获取客户请求信息,处理该请求,并通过ServletRespons对象向客户端返回响应信息。在Servlet生命周期内,service()方法调用多次;

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

   response.setContentType("text/html");
   PrintWriter out = response.getWriter();
   // 页面跳转
   request.getRequestDispatcher("/alluser.jsp").forward(request, response);
   out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
   out.println("<HTML>");
   out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
   out.println("  <BODY>");
   out.print("    This is ");
   out.print(this.getClass());
   out.println(", using the GET method");
   out.println("  </BODY>");
   out.println("</HTML>");
   out.flush();
   out.close();
}

   3、服务器终止阶段,调用destroy()方法;

   当web应用被终止、Servlet容器终止运行、Servlet容器重新装载Servlet新实例时,Servlet容器会先调用Servlet的destroty()方法来释放Servlet所占用的资源,在Servlet整个生命周期内,destroty()方法被调用一次。

   Servlet生命周期测试:

 public void init() throws ServletException {
    System.out.println("我是init()方法,我在Servlet生命周期中只执行一次...");
    super.init();
}

public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
    System.out.println("我是service()方法,我负责客户端的request请求与response响应,在Servlet生命周期中执行多次...");
    super.service(arg0, arg1);
}

public void destroy() {
    System.out.println("我是destrot()方法,在服务器停在或者卸载时执行此方法,我负责释放资源,在Servlet生命周期中执行一次...");
    super.destroy();
}

  运行效果:


三、Servlet工作原理

 客户端发送一个请求,Servlet调用service()方法对请求进行响应,通过源码可见,service()方法对请求的方式进行了匹配,选择调用doGet、doPost等这些方法,然后在进入对应的方法中调用逻辑的方法,实现对客户端的响应,在Servlet接口中是没有doGet、doPost等等这些方法,HttpServlet中定义了这些方法,但是返回error信息,所以,每次定义一个Servlet时,都必须实现doGet或者doPost等这些方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值