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)

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

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的执行流程

2014-07-03 Java Web的学习(3)-----Servlet的知识_第1张图片

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引擎来控制和调度。

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

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

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

2014-07-03 Java Web的学习(3)-----Servlet的知识_第2张图片

如果在<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的映射

2014-07-03 Java Web的学习(3)-----Servlet的知识_第3张图片

   2.线程安全问题

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

6.Servlet体系结构

我们知道 Java Web 应用是基于 Servlet 规范运转的,那么 Servlet 本身又是如何运转的呢?为何要设计这样的体系结构。

2014-07-03 Java Web的学习(3)-----Servlet的知识_第4张图片


从上图可以看出 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 容器中的类关系图。

2014-07-03 Java Web的学习(3)-----Servlet的知识_第5张图片

上图可以看出 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

结束......


你可能感兴趣的:(2014-07-03 Java Web的学习(3)-----Servlet的知识)