Servlet原理解析

jopen 7年前

         1.什么是servlet?

         Servlet是一种服务器端的Java应用程序,Server + Applet =Servlet 意为服务器端的小程序,具有独立于平台和协议的特性,可以生成动态的Web页面。 它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。 Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。

         2.servlet有什么作用?

         Servlet主要是驻留在 Web 服务器上,处理用户的请求和输出的响应,处理web页面和业务逻辑层的数据交流。当使用交互式 Web 站点时,您所看到的所有内容都是在浏览器中显示的。当用户访问页面时,产生一个请求发送到web服务器,

         在这些场景背后,有一个 Web 服务器接收会话 中来自于您的请求,可能要切换到其他代码(可能位于其他服务器上)来处理该请求和访问数据,并生成在浏览器中显示的结果。servlet 就是用于该过程的网守(gatekeeper)。

         当用户通过 URL 发出一个请求时,这些 Java servlet 类就将之转换成一个 HttpServletRequest,并发送给 URL 所指向的目标。当服务器端完成其工作时,Java 运行时环境(Java Runtime Environment)就将结果包装在一个 HttpServletResponse 中,然后将原 HTTP 响应送回给发出该请求的客户机。在与 Web 应用程序进行交互时,通常会发出多个请求并获得多个响应。所有这些都是在一个会话语境中,Java 语言将之包装在一个 HttpSession 对象中。在处理响应时,您可以访问该对象,并在创建响应时向其添加事件。

         3.servlet容器

         负责处理客户请求、把请求传送给Servlet并把结果返回给客户。不同程序的容器实际实现可能有所变化,但容器与Servlet之间的接口是由 Servlet API定义好的,这个接口定义了Servlet容器在Servlet上要调用的方法及传递给Servlet的对象类。

         Tomcat 的容器模型中,Context 容器是直接管理 Servlet 在容器中的包装类 Wrapper,所以 Context 容器如何运行将直接影响 Servlet 的工作方式。

Servlet原理解析

Tomcat启动之后,初始化“load on startup”的 Servlet

         4.web应用的初始化工作

         应用的初始化主要是要解析 web.xml 文件,这个文件描述了一个 Web 应用的关键信息,也是一个 Web 应用的入口。接下去将会将 WebXml 对象中的属性设置到 Context 容器中,这里包括创建 Servlet 对象、filter、listener 等等。

         之后就是Servlet 包装成 Context 容器中的 StandardWrapper,为什么要将 Servlet 包装成 StandardWrapper 而不直接是 Servlet 对象。这里 StandardWrapper 是 Tomcat 容器中的一部分,它具有容器的特征,而 Servlet 为了一个独立的 web 开发标准,不应该强耦合在 Tomcat 中。

         所有 web.xml 属性都被解析到 Context 中,所以说 Context 容器才是真正运行 Servlet 的 Servlet 容器。一个 Web 应用对应一个 Context 容器,容器的配置属性由应用的 web.xml 决定。

         5.servlet生命周期

         1.完成了 Servlet 的解析工作,并且被包装成 StandardWrapper 添加在 Context 容器中,但是它仍然不能为我们工作,它还没有被实例化。下面我们将介绍 Servlet 对象是如何创建的,以及如何被初始化的。如果 Servlet 的 load-on-startup 配置项大于 0,那么在 Context 容器启动的时候就会被实例化

         2.(1).用户在浏览器中输入一个 URL。Web 服务器配置文件确定该 URL 是否指向一个由运行于服务器上的 servlet 容器所管理的 servlet。

         (2).如果还没有创建该 servlet 的一个实例(一个应用程序只有一个 servlet 实例),那么该容器就加载该类,并将之实例化。

该容器调用 servlet 上的 init()。

         (3).该容器调用 servlet 上的 service(),并在包装的 HttpServletRequest 和 HttpServletResponse 中进行传递。

         (4).该 servlet 通常访问请求中的元素,代表其他服务器端类来执行所请求的服务并访问诸如数据库之类的资源,然后使用该信息填充响应。

         (5).如果有必要,在 servlet 的有用生命结束时,该容器会调用 servlet 上的 destroy() 来清除它。

         6.配置Servlet

         配置servlet一般是在web.xml文件中加入的

        <servlet>    <!--给servlet命名为FlowCardServlet  -->    <servlet-name>FlowCardServlet</servlet-name>    <!--将FlowCardServlet映射到特定的类,类的实际路径 -->    <servlet-class>com.andy.drp.flowcard.web.FlowCardServlet</servlet-class>   </servlet>   <servlet-mapping>    <servlet-name>FlowCardServlet</servlet-name>    <!--以“工程名/servlet/flowcard/FlowCardServlet”形式的 URL 映射我们的servlet-->    <url-pattern>/servlet/flowcard/FlowCardServlet</url-pattern>     <!-- 映射路径,都是以servlet为虚拟路径 -->   </servlet-mapping>