2014-07-03 Java Web的学习(3)-----Servlet的知识

1.什么是Servlet

SUN公司定义Servlet规范,其中Servlet API是这样定义的:A servlet is a small Java program that runs withina Web server. Servlets receive and respond to requests from Web clients, usually across HTTP, theHyperText Transfer Protocol.

2.编写本身的Servlet而且部署

a、直接或间接地实现javax.servlet.Servlet接口(或继承javax.servlet.GenricServlet)html

b、在web.xml中对自定义的Servlet进行配置,映射到URL地址上.java

To implement this interface, you can write a generic servlet that extends javax.servlet.GenericServlet or an HTTP servlet that extends javax.servlet.http.HttpServlet.

3.Servlet的执行流程

Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
1.Web服务器首先检查是否已经装载并建立了该Servlet的实例对象。若是是,则直接执行第④步,不然,执行第②步。
2.装载并建立该Servlet的一个实例对象。 
3.调用Servlet实例对象的init()方法。
4.建立一个用于封装HTTP请求消息的HttpServletRequest对象和一个表明HTTP响应消息的HttpServletResponse对象,  而后调用Servlet的service()方法并将请求和响应对象做为参数传递进去。
5.WEB应用程序被中止或从新启动以前,Servlet引擎将卸载Servlet,并在卸载以前调用Servlet的destroy()方法。

4.Servlet的生命周期

因为Servlet是一个供其余Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行彻底由Servlet引擎来控制和调度。web

针对客户端的屡次Servlet请求,一般状况下,服务器只会建立一个Servlet实例对象,也就是说Servlet实例对象一旦建立,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。数据库

在Servlet的整个生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都致使Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会建立一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,而后将这两个对象做为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用do相关方法。 apache

总结:
    什么时候建立?用户第一次访问Servlet时。由容器进行实例化,接着调用init(ServletConfig config)方法.
    什么时候活着?只要建立一次,就主流服务器内存。即一个Servlet对象被建立一次,初始化也是一次.
    什么时候销毁?应用被卸载时,服务器就会调用destory()方法.

若是在<servlet>元素中配置了一个<load-on-startup>元素,那么WEB应用程序在启动时,就会装载并建立Servlet的实例对象、以及调用Servlet实例对象的init()方法。
举例:
	<servlet>
		<servlet-name>invoker</servlet-name>
		<servlet-class>
			org.apache.catalina.servlets.InvokerServlet
		</servlet-class>
		<load-on-startup>2</load-on-startup>
	</servlet>

用途:为web应用写一个InitServlet,这个servlet配置为启动时装载,为整个web应用建立必要的数据库表和数据.

<servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
</servlet>
在${CATALINA_HOME}\conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个Servlet设置为了缺省Servlet。当访问Tomcat服务器中的某个静态HTML文件和图片时,其实是在访问这个缺省Servlet。

5.Servlet的的小细节

     1.URL的映射设计模式

   2.线程安全问题安全

解决并发出现的问题,能够采用如下方式:
1.使用Java同步机制对多线程同步:运行效率低
2.使用SingleThreadModel接口
3.合理决定在Servlet中定义的变量的做用域

6.Servlet体系结构

咱们知道 Java Web 应用是基于 Servlet 规范运转的,那么 Servlet 自己又是如何运转的呢?为什么要设计这样的体系结构。服务器


从上图能够看出 Servlet 规范就是基于这几个类运转的,与 Servlet 主动关联的是三个类,分别是 ServletConfig、ServletRequest 和 ServletResponse。这三个类都是经过容器传递给 Servlet 的,其中 ServletConfig 是在 Servlet 初始化时就传给 Servlet 了,然后两个是在请求达到时调用 Servlet 时传递过来的。咱们很清楚 ServletRequest 和 ServletResponse 在 Servlet 运行的意义,可是 ServletConfig 和 ServletContext 对 Servlet 有何价值?仔细查看 ServletConfig 接口中声明的方法发现,这些方法都是为了获取这个 Servlet 的一些配置属性,而这些配置属性可能在 Servlet 运行时被用到。而 ServletContext 又是干什么的呢? Servlet 的运行模式是一个典型的“握手型的交互式”运行模式。所谓“握手型的交互式”就是两个模块为了交换数据一般都会准备一个交易场景,这个场景一直跟随个这个交易过程直到这个交易完成为止。这个交易场景的初始化是根据此次交易对象指定的参数来定制的,这些指定参数一般就会是一个配置类。因此对号入座,交易场景就由 ServletContext 来描述,而定制的参数集合就由 ServletConfig 来描述。而 ServletRequest 和 ServletResponse 就是要交互的具体对象了,它们一般都是做为运输工具来传递交互结果。多线程

ServletConfig 是在 Servlet init 时由容器传过来的,那么 ServletConfig 究竟是个什么对象呢?并发

下图是 ServletConfig 和 ServletContext 在 Tomcat 容器中的类关系图。

上图能够看出 StandardWrapper 和 StandardWrapperFacade 都实现了 ServletConfig 接口,而 StandardWrapperFacade 是 StandardWrapper 门面类。因此传给 Servlet 的是 StandardWrapperFacade 对象,这个类可以保证从 StandardWrapper 中拿到 ServletConfig 所规定的数据,而又不把 ServletConfig 不关心的数据暴露给 Servlet。

一样 ServletContext 也与 ServletConfig 有相似的结构,Servlet 中能拿到的 ServletContext 的实际对象也是 ApplicationContextFacade 对象。ApplicationContextFacade 一样保证 ServletContex 只能从容器中拿到它该拿的数据,它们都起到对数据的封装做用,它们使用的都是门面设计模式。

经过 ServletContext 能够拿到 Context 容器中一些必要信息,好比应用的工做路径,容器支持的 Servlet 最小版本等。

    ServletContext对象WEB容器在启动时,它会为每一个WEB应用程序都建立一个对应的ServletContext对象,它表明当前web应用。 ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,能够经过ServletConfig.getServletContext方法得到ServletContext对象。 因为一个WEB应用中的全部Servlet共享同一个ServletContext对象,所以Servlet对象之间能够经过ServletContext对象来实现通信。ServletContext对象一般也被称之为context域对象。

获取域中的存的值:
ServletContext sc = getServletConfig().getSerlvetContext();
Void setAttribute(String key,Object v);
Object getAttribute(String key);
Void removeAttribute(String key);

经过ServletContext对象的经常使用的应用情景:
1.获取WEB应用的初始化参数。
2.实现Servlet的转发
3.利用ServletContext对象读取资源文件。
    .properties文件(属性文件)
    获得文件路径(ServletContext.getRealPath(), getReaourceAsStream()),URL方式(中文路径)。
    读取资源文件的三种方式
4.实现文件的下载

参考博客:1. Servlet 工做原理解析

            2.http://www.ibm.com/developerworks/cn/education/java/j-intserv/index.html

 API:Servlet-API 2.3

结束......

相关文章
相关标签/搜索