天天看点

Servlet中使用到的模式

一:Servlet简介 

Servlet的最广泛用途是建造动态的网页,没有Servlet或相应的动态技术(如CGI,ASP,JSP),一个Web服务器只能提供静态的网页,不能针对用户的请求提供相应的服务器端的操作,如查询数据库并根据查询结果构造一个新的结果网页等.所有的Servlet必须遵循Java Servlet API,这个API是由两个库包及一系列类组成的: 

javax.servlet:这个库包提供了普通Servlet模型 

javax.servlet.http:这个库包提供了http和https的Servlet模式 

普通的Servlet模型只是假定协议是建立在TCP/IP之上的,并没有对请求-回答(request-response)的协议(protocol) 作出任何具体的假设,所有与http和https有关的逻辑均在javax .servlet.http库里面,这种办法可以最大程度上把可能发生变化的部分与一般逻辑分开。 

二:Servlet的主要类 

servlet库中有三个类提供了主要的Servlet技术的架构,这三个类是:Servlet接口,GenericServlet类和 HttpServlet类: 

(A)Servlet接口声明了三个方法,init(),destroy()和service()方法,这三个方法决定了Servlet的生命周期 

(B)GenericServlet是一个抽象类,它提供了Servlet接口的默认实现,但是却留下一个service()方法,这个方法仍然是一个抽象方法,任何个体的Servlet类均必须提供service()方法,以便提供必要的具体行为. 

(C)HttpServlet类继承自GenericServlet,虽然它本身也是一个抽象类,但是它为所有行为包括service和七个do方法都提供了默认的实现:doGet,doHead,doPost,doPut,doDelete,doOption,doTrace,这七个do方法基本涵盖了 http协议的各种请求的种类. 

三:HttpServlet的生命周期 

Servlet的生命周期描述一个Servlet如何被加载和被初始化,它是怎么样接收请求,响应请求以提供服务,java的HttpServlet类必须在一个Servlet引擎所提供的容器环境里面运行,因此,它的生命周期是由容器环境管理的. 

Servlet生命周期由接口javax.servlet.Servlet所定义,所有的Servlet必须实现它才能在Servlet容器环境里面运行.它的生命周其大概如下: 

(A)加载:Servlet容器可以同时创建一个或多个Servlet实例,这个过程可以在Servlet容器加载Servlet类时执行,或者在 Servlet对象响应请求时执行,也可以在两者之间的任何时候执行. 

(B)初始化:Servlet容器调用一个init()方法将此Servlet初始化,初始化时,Servlet对象可以从数据库中读取初始数据,建立 Connection,或者建立对其他有价值的资源的引用. 

(C)就绪:Servlet被初始化后,处于能响应请求的就绪状态,当客户端有一个请求时,Servlet容器将SevletRequest和 ServletResponse对象都转发给Servlet,这两个对象以参数的形式传给service方法,这样,service方法会进一步调用 doGet和doPost等方法处理相应的http处理请求 

(D)释放:调用destroy()方法,系统将释放相应的资源,所有失去引用的Java对象都会被垃圾收集器收集. 

四:模板方法模式的使用 

Servlet在几个地方法采用了模板方法模式的设计 

(A)service()方法是一个模板方法,这个方法调用了七个do方法中的一个或几个,完成对客户端的请求,下面是示意源码: 

protexted void service(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{

String method = req.getMethod(); 

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

}else if(method.equals("POST")){ 

...... 

当然,这个service方法可以被子类置换掉. 

五:观察者模式的应用 

Servlet引擎的事件可以分成Servlet环境事件和Session事件两种,通过Servlet引擎的事件机制可以做如下的工作:

(A)管理数据库的各种资源的使用和释放 

(B)建立计数机制 

(C)监视Http Session的状态及属性 

Servlet引擎的事件机制与AWT和Swing库中的事件模型是一样的事件委派模型。 

(1)Servlet环境事件 

当Servlet环境被创建,关闭,或者一个属性被加入到环境里,一个已经在环境里的属性被删除或修改时,都会产生Servlet事件: 

事件类型接口方法 

servlet环境被创建javax.servlet.ServletContextListener contextInitialized 

Servlet环境被关闭javax.servlet.ServletContextListener contextDestroyed 

........................ 

(2)Session的事件 

当Session被激活,钝化,或者一个属性被加入到Session对象里,一个已经在Session里的属性被删除或者修改时,都会产生Session 事件,下面的表给出了Session事件的清单,每一个事件对应的事件监听器(listener)接口,以及所对应的方法: 

事件类型接口方法 

一个session被激活javax.servlet.http.HttpSessionListener sessionCreated 

一个session被钝化javax.servlet.http.HttPSessionListener sessionDestroyed 

一个属性被加入javax.servlet.http.HttpSessionAttributesListener attributeAdded 

............................ 

要对某一个事件做出响应,就要准备一个谓的监听器,这个类实际上扮演的就是观察者模式的角色,那么怎么才能准备一监听器类呢? 

(1)针对某个事件的监听类必须实现所对应的事件接口 

(2)一个监听器类必须有一个公开的默认构造子 

(3)必须实现监听器接口所要求的方法 

下面分为Servlet环境的舰艇器和Session属性监听器 

import javax.servlet.*; 

public final class myListener implements ServletContextListener 

     /** This method is called when the servlet context is 

      * initialized(when the Web Application is deployed). 

      * You can initialize servlet context related data here. 

      */ 

     public void contextInitialized(ServletContextEvent event) 

     { 

         //write your code here 

     } 

     /** This method is invoked when the Servlet Context 

      * (the Web Application) is undeployed or 

      * WebLogic Server shuts down. 

      */ 

     public void contextDestroyed(ServletContextEvent event) 

     { 

         //write your code here 

     } 

import javax.servlet.*; 

import javax.servlet.http.HttpSessionAttributeListener; 

import javax.servlet.http.HttpSessionBindingEvent; 

public final class myListener implements HttpSessionAttributeListener 

     /** This method is called when an attribute 

      *﹛is added to a session. 

      */ 

     public void attributeAdded(HttpSessionBindingEvent sbe) 

     { 

     } 

     /** This method is called when an attribute 

      * is removed from a session. 

      */ 

     public void attributeRemoved(HttpSessionBindingEvent sbe) 

     { 

     } 

     /** This method is invoked when an attibute 

      * is replaced in a session. 

      */ 

     public void attributeReplaced(HttpSessionBindingEvent sbe) 

     { 

     } 

}