Servlet技术

Servlet的工作过程

         Servlet的主要功能在于交互式的浏览和修改数据,生成动态Web内容。这个基本工作过程如下:

        (1) 客户端发送请求至服务器端。

        (2) 服务器上的Web容器装入Servlet,并为Servlet进程创建线程。请注意,Servlet是在出现第一个请求时装入的,在服务器关闭之前不会卸载它。Servlet也可以配置为Web应用程序启动时自动装载。

        (3)Web容器将请求信息发送至Servlet。

        (4)Servlet生成响应内容并将其返回给Web容器。响应内容动态生成,通常取决于客户端的请求。

        (5)Web容器将响应返回给客户端。

        (6)服务器关闭或者Servlet空闲时间超过一定限度时,调用destroy()方法退出。

Servlet的生命周期

        在每个Servlet实例的生命中有三种类型事件,这三种事件分别对应于由Servlet引擎所唤醒的三个方法。
        (1) init()
       当Servlet第一次被装载时,Servlet引擎调用这个Servlet的init()方法,只调用一次。如果某个Servlet需要特殊的初始化需要,那么Servlet编写人员可以重写该方法来执行初始化任务。这是个可选的方法。如果某个Servlet不需要初始化,那么默认情况下将调用它的父类的init方法。系统保证,在init方法完成前,是不会调用Servlet去处理任何请求的。
        (2)service()
           这是Servlet最重要的方法,是真正处理请求的地方。对于每个请求,Servlet引擎将调用Servlet的service方法,并把Servlet请求对象和Servlet响应对象作为参数传递给它。
        (3)destroy()    

        这是相对于init的可选方法,当Servlet即将被卸载时由Servlet引擎来调用,这个方法用来清除并释放在init方法中分配的资源。

     Servlet的生命周期可以分以下几步:

          1 装载Servlet,这一项操作一般是动态执行的。然而,Servlet通常会提供一个管理的选项,用于在Servlet启动时强制转载和初始化特定的Servlet。

          2 服务器创建一个Servlet实例。

          3 服务器调用Servlet的init方法。

          4 一个客户端请求到达服务器端。

          5 服务器创建一个请求对象。

          6 服务器创建一个响应对象。

             7 服务器激活Servlet的service()方法,传递请求对象和响应对象作为参数。

          8 service()方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息。

          9 service()方法使用响应对象的方法。将响应传回服务器,最终到达客户端。service()方法可以激活其他方法以处理请求。如doGet(),doPost()或者程序员自己开发的其他方法。

         10 对于更多的客户端请求,服务器创建新的请求和响应对象,仍然激活此Servlet的service()方法,将这两个对象作为参数传给它,如此重复以上的循环,但无需再次调用init()方法,Servlet一般只初始化一次。

         11 当服务器不再需要Servlet时,比如当服务器要关闭时,服务器调用Servlet的destroy()方法。

Servlet的常用API :

Servlet的类和接口可以从以下几个方面进行分类:

       (1) Servlet 实现相关:定义了用于实现Servlet相关的类和接口。

       (2) Servlet 配置相关:主要包括ServletConfig接口。

       (3) Servlet 异常相关:Servlet API 定义了两个异常,他们是ServletException和UnavailableException。

       (4) 请求和响应相关: 接收客户端请求,并且作出响应的类和接口。

       (5) 会话跟踪:用于跟踪和客户端的会话。

       (6) Servlet上下文: 通过这个接口,可以在多个Web应用程序中共享数据。

         (7) Servlet协作: 主要是RequestDispatcher接口,用于进行视图派发。

       (8) 其他类: Filter , Cookie 和HttpUtils类。

1 Servlet实现相关的类和接口:

  • Servlet接口

      声明:public interface Servlet

      这个接口是Servlet必须直接或者间接实现的接口。它定义了以下方法:

      init(ServletConfig config): 用于初始化Servlet。

      getServletInfo(): 获取Servlet的信息。

      getServletConfig(): 获得Servlet配置相关信息。

      service(ServletRequest request , ServletResponse response): 运行应用程序逻辑的入口点,它接受两个参数,ServletRequest表示客户端请求的信息,ServletResponse表示对客户端的响应。

      destory(): 销毁Servlet。

  • GenericServlet类

      声明:public abstract class GenericServlet

      GenericServlet提供了对Servlet接口的基本实现。它是一个抽象类,它的service()方法是一个抽象方法,GenericServlet的派生类必须直接或间接实现该方法。

  • HttpServlet类

      声明:public abstract class HttpServlet extends GenericServlet implements Serializable

      HttpServlet 类是针对使用Http协议的Web服务器的Servlet类,HttpServlet类通过执行Servlet接口,能够提供Http协议的功能。

      HttpServlet子类必须实现下面方法中的某一个:

      doGet(): 支持Http Get请求。

      doPost(): 支持Http Post请求。

      doPut(): 支持Http Put请求。

      doDelete(): 支持Http Delete请求。

      init()和distory(): 管理Servlet占用的资源。

      getServletInfo(): 获得Servlet自身的信息。

 

2 Servlet配置相关:

        javax.servlet.ServletConfig接口代表了Servlet的配置,Servlet配置包括Servlet的名字,初始化和上下文。

  •   ServletConfig接口

       声明:public interface ServletConfig

       这个接口的主要方法有以下几个:

       getInitParameter(String name): 返回特定名字的初始化参数。

       getInitParameterNames(): 返回所有的初始化参数的名字。

       getServletContext(): 返回Servlet上下文对象的引用。

 

3 Servlet异常相关:

  •   ServletException类

       声明:public class ServletException extends Exception

       它包含几个构造方法和一个获取异常原因的方法,这个方法如下:

        getRootCause(): 返回造成这个ServletException的原因。

  •    UnavailableException类

       声明:public class  UnavailableException extends ServletException

       当Servlet或Filter暂时或者永久不能使用时,就会抛出这个异常。

 

4 请求和响应相关:

       和请求响应相关的接口非常多,主要有以下几种。

       ServletRequest: 代表了Servlet的请求,它是一个高层的接口,HttpServletRequest是它的子接口。

       ServletResponse: 代表了Servlet的响应,它是一个高层的接口,HttpServletResponse是它的子接口。

       ServletInputStream: Servlet的输入流。

       ServletOutputStream: Servlet的输出流。

       ServletRequestWrapper: 它是ServletRequest的实现。

       HttpServletRequest:代表了Http请求,继承了ServletRequest。

       HttpServletResponse: 代表了Http响应,继承了ServletResponse。

       HttpServletRequestWrapper: 它是HttpServletRequest的实现。

       HttpServletResponseWrapper: 它是HttpServletResponse的实现。

       下面我们着重介绍HttpServletRequest和HttpServletResponse两个接口:

  • HttpServletRequest接口

        声明:public interface HttpServletRequest extends ServletRequest

        这个接口中最常用的方法是获得请求中的参数,这个请求中的参数是客户端表单中的数据,HttpServletRequest接口可以获取客户端正在使用的通信协议,还可以获取产生请求并且接收请求的服务器远程主机名和IP地址等一些这样的信息。

        HttpServletRequest接口提供获取数据流的Servlet、ServletInputStream方法,这些数据是客户端引用中使用Http Post 和 Put方法提交的。一个ServletRequest的子类可以让Servlet获得更多的协议特性数据。

        JSP中的内建对象request是一个HttpServletRequest实例,我们来看下它的一些重要方法:

        getCookies(): 获得客户端发送的Cookie。返回一个数组,该数组包含这个请求中当前的所以Cookie。如果这个请求中没有Cookie,则返回一个空数组。

        getSession(): 返回和客户端关联的Session。如果没给客户端分配Session,则返回null。

        getSession(Boolean create): 和上一个方法类似,不同的是,如果没有给客户端分配Session,则创建一个新的Session并返回。

         getParameter(String name): 获取请求中名为name的参数。如果请求中没有这个参数,则返回null。

         getParameterValues(String name): 返回请求中名为name的参数值,这个值往往是checkbox或者select控件提交的,获得的值是一个String数组。

  • HttpServletResponse接口

       声明:public interface HttpServletResponse extends ServletResponse

       它代表了对客户端的Http响应。HttpServletResponse接口给出响应客户端的Servlet方法。它允许Servlet设置内容长度和响应的MIME类型,并且提供输出流ServletOutputStream。

        常用的方法有以下几种:

         addCookie(Cookie cookie): 在响应中添加一个Cookie。

         encodeRUL(String url): 使用URL和一个SessionId重写这个URL。

         sendRedirect(String location): 把响应发送给另一个页面或Servlet进行处理。

         setContent(String type): 设置响应的MIME类型。

         setCharecterEncoding(String charset): 设置响应的字符编码类型。 

 

5 会话跟踪

      和会话跟踪相关的类和接口如下。

  • HttpSession接口

          声明:public interface HttpSession

        这个接口被Servlet引擎用来实现Http客户端和Http会话两者之间的连接关系,这种关联可能在多处连接和请求中持续一段给定的时间。Session用来在无状态Http协议下越过多个请求页面来维护状态和识别用户。

        一个Session可以通过Cookie或重写URL来维持。

        它的常用方法有以下几种:

         getCreationTime(): 返回创建Session的时间。

         getId(): 返回分配给这个Session的标识符。一个Http Session的标识符是一个由服务器来建立和维持的唯一的字符串。

         getLastAccessTime(): 返回客户端最后一次发出与这个Session有关的请求的时间。如果这个Session是新建的,则返回-1

         getMaxInactiveInterval(): 返回一个秒数,这个秒数表示客户端不发出请求时,Session被Servlet引擎维持的最长时间。在这个时间以后,Session可能被Servlet引擎终止。如果这个Session不会被终止,则这个方法返回-1.

         getValue(String name): 返回一个给定的名字绑定到Session上的对象,如果不存在这样的绑定则返回空值。

         getValueNames(): 以一个数组返回绑定到Session上的所有数据的名称。

         invalidate(): 这个方法会终止这个Session。所有绑定到这个Session上的数据都会被清除。

         inNew(): 返回一个布尔值以判断这个Session是不是新的,如果一个Session已经被服务器创建但是还没有收到相应的客户端的请求,这个Session将会被认为是新的。这意味着,这个客户端还没有加入会话或者被会话公认。

         putValue(String name , Object value): 以给定的名字绑定到给定的对象到Session中。已存在的同名绑定会被重置,这时会调用HttpServletBindingListener接口的valueBound方法。

         removeValue(String name): 取消给定名字的对象在Session上的绑定。如果未找到给定名字的绑定对象,这个方法什么也不做。

         setMaxInactiveInterval(int interval): 设置一个秒数,这个秒数表示客户端在不发出请求时,Session被Servlet引擎维持的最长时间。

 

6 Servlet上下文

            和Servlet上下文相关的接口有:

  •  ServletContext接口

        声明:public interface ServletContext

        在服务器上使用Session对象维持与单个客户相关的状态,而当为多个用户的Web应用维持一个状态时,则应该使用Servlet环境(Context)。

        ServletContext表示一组Servlet共享的资源。在Servlet API的1.0和2.0的版本中,ServletContext对象仅仅提供了访问有关Servlet环境信息的方法。例如:提供了访问服务器名称,MIME类型映射等方法,可以将信息写入到服务器日志文件的log()方法,大部分实现程序都会为一台主机中的所有的Servlet或每个虚拟机提供一个Servlet环境。

        它的常用方法有以下几种:

         getAttribute(String name): 获得ServletContext中名称为name的属性。

         getContext(String uripath): 返回给定的uripath的应用的Servlet上下文,如ServletContext test=getContext("/test")。

         removeAttribute(String name): 删除名称为name的属性。       

         setAttribute(String name , Object object): 在ServletContext中设置一个值属性,这个属性的名称为name,值为object对象。

 

7 Servlet协作

         Servlet协作主要是RequestDispatcher接口,它可以把一个请求转发到另一个Servlet。

  • RequestDispatcher接口

         声明:public interface RequestDispatcher

         它包含两个方法,如下所示。

         forword(ServletRequest request , ServletResponse response): 把请求发送到服务器上的另一个资源,这个资源可以是Servlet 、JSP页面或者HTML文档。

         include(ServletRequest request , ServletResponse response): 引用其他Servlet、JSP页面和位于当前输出缓冲区的HTML文档的内容。此被引用的资源可能没有设置任何响应头标。

 

8 Filter

        在Web应用中实施过滤是我们常用的技术。通过过滤,可以对请求进行统一编码、对请求进行认证等。每个Filter可能只承担很少的任务,多个Filter可以相互合作,通过这种协作,可以完成一个复杂的功能。

  • Filter接口

        声明:public interface Filter

        它是Filter必须实现的接口,它包含以下方法。

        init(FilterConfig filterConfig) : 这个方法初始化Filter。

        doFilter(ServletRequest request , ServletResponse response , FilterChain chain): 一旦请求经由Filter链传递,则Servlet引擎就调用此方法。

        destroy(): 释放Filter占用的资源。

  • FilterChain接口

        声明:public interface FilterChain

        它是代码的过滤链,通过这个接口把过滤的任务在不同的Filter之间转换。

        它包含下面一个方法。

        doFilter(ServletRequest request , ServletResponse response): 通过这个方法激活链中下一个Filter。如果没有下一个Filter,那么调用目标的资源。

  • FilterConfig接口

        声明:public interface FilterConfig

        它代表了Filter的配置,和Servlet一样,Filter也有一些配置信息,比如Filter的名字和初始化参数等。

        它包含了以下方法。

         getFilterName():  返回Filter的名字。

         getInitParameter(String name): 获取名字为name的初始化参数的值,如果该参数不存在就返回null。

         getServletContext(): 返回这个Filter所在的Servlet上下文对象。

         getInitParameterNames(): 获得Filter配置中的所有初始化参数的名字。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值