Servlet容器

1.Servlet简介

Servlet容器为JavaWeb应用提供运行时环境,它负责管理Servlet和JSP的生命周期,以及管理它们的共享数据。 Servlet容器也称为JavaWeb应用容器,或者Servlet/JSP容器。

目前最流行的Servlet容器软件包括: Tomcat Jetty Weblogic Jboss等。

Servlet是和平台无关的服务器端组件(java编写的,跨平台),它运行在Servlet容器中。

Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式 Servlet可完成如下功能:

  • 创建并返回基于客户请求的动态HTML页面
  • 创建可嵌入到现有HTML 页面中的部分HTML 页面(HTML 片段)
  • 与其它服务器资源(如数据库或基于Java的应用程序)进行通信

Servlet容器响应客户请求过程:

1.1 Servlet生命周期

Web容器维护servlet实例的生命周期。

servlet的生命周期主要分为以下几个步骤:

1. 加载Servlet类

2. 创建Servlet实例

3. 调用Servlet类的init方法

4. 调用Servlet类的service方法

5. 调用Servlet类的destroy方法

1.2 加载Servlet类

类加载器负责加载servlet类。

当Web容器接收到servlet的第一个请求时,将加载servlet类。

或者在容器启动的时候加载Servlet类

1.3 创建Servlet实例

Web容器在加载servlet类之后创建一个servlet的实例。

servlet实例在servlet生命周期中只创建一次。

1.4 调用init方法

Web容器在创建servlet实例后调用init方法一次。

init方法用于初始化servlet。

它是javax.servlet.Servlet接口的生命周期方法。init方法的语法:

public void init(ServletConfig config) throws ServletException

1.5 调用service方法

每当接收到servlet的请求时,Web容器都会调用service方法。

如果servlet未初始化,则遵循上述前三个步骤,然后调用service方法。

如果servlet被初始化,它调用service方法。

请注意,servlet仅初始化一次。

Servlet接口的service方法的语法如下:

public void service(ServletRequest request, ServletResponse response)   

  throws ServletException, IOException

1.6 调用destroy方法

从服务中删除servlet实例之前,Web容器调用destroy方法。它使servlet有机会清理所有资源,例如内存,线程等。Servlet接口的destroy方法的语法如下:

public void destroy()

2. Servlet工作机制

2.1 Servlet初始化和销毁

服务器检查servlet是否为第一次被请求

如果是第一次被请求,则 -

· 加载servlet类。

· 实例化servlet类。

· 调用init方法传递ServletConfig对象

如果不是第一次被请求,则 -

· 调用service方法传递请求和响应对象

Web容器在需要删除servlet时调用destroy方法,

例如:在停止服务器或取消部署项目时。

2.2 Web容器处理Servlet请求

Web容器负责处理请求。下面来看看看它如何处理请求。

· 将请求与web.xml文件中的servlet进行映射。

· 为请求创建请求和响应对象

· 调用线程上的service方法

· 公共service方法内部调用受保护的service方法

· 受保护的service方法根据请求的类型调用doGet或doPost方法。

· doGet或doPost方法生成响应,并将其传递给客户端。

· 发送响应后,Web容器将删除请求和响应对象。

2.3 公共service方法

公共service方法

将ServletRequest对象转换为HttpServletRequest对象

将ServletResponse对象转为HttpServletResponse对象

然后调用传递这些对象的受保护的service方法。下面来看看内部代码:

public void service(ServletRequest req, ServletResponse res)  

        throws ServletException, IOException  {  

        HttpServletRequest request;  

        HttpServletResponse response;  

        try  {  

            request = (HttpServletRequest)req;  

            response = (HttpServletResponse)res;  

        }  

        catch(ClassCastException e)  {  

            throw new ServletException("non-HTTP request or response");  

        }  

        service(request, response); //受保护的

2.4 受保护的service方法

受保护的service方法检查请求的类型,

如果请求类型为get,则调用doGet方法

如果请求类型为post,则调用doPost方法

下面来看看内部代码:

protected void service(HttpServletRequest req, HttpServletResponse resp)  

        throws ServletException, IOException {  

    String method = req.getMethod();  

    if(method.equals("GET")) {  

        long lastModified = getLastModified(req);  

        if(lastModified == -1L) {  

            doGet(req, resp);  

        }   

        ....  

        //rest of the code  

    }  

}

 

转载于:https://my.oschina.net/u/3839775/blog/1798098

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值