Servlet API 2.2 的新特征

Comments

在介绍 Servet 2.2 规范之前,我们首先应该了解一个重要概念 ― Web 应用程序( Web Application)。 Web 应用程序是包含了Servlets,HTML页面,或者其它资源的集合。 Web 应用程序有自己的URL根路径,它标识了调用 Web 应用程序下的资源的URL前缀。每个 Web 应用程序都有一个唯一的ServletContext对象,ServletContext对象可以看作是一个 Web 应用程序的程序级别的对象影射,我们可以利用它来存取基于 Web 应用程序级别的数据。 Web 应用程序所包含比较详细的元素是:

  • Servlets
  • Java Server Page
  • Java Classes
  • 静态内容(HTML页面、图象文件、声音文件等)
  • 客户端的 Java 代码,如 Applets,Beans 等
  • 组织以上这些元素的发布描述文件

Web 应用程序还有自己的目录结构,出错处理机制,初始化的参数等。Servet 2.2 规范所提出的 Web Application Archive(WAR)的概念可以帮助我们把 Web 应用程序所有的元素集成在一起,在下面的章节我们对它有详细的描述。我们可以从 Web 应用程序的发布描述文件定义来了解 Web 应用程序配置参数:

  • ServletContext 的初始化参数
  • Session 设置
  • Servlet / JSP 的定义
  • Servlet / JSP 的影射关系
  • MIME 类型的定义
  • “Welcome” 页面的设置
  • 出错页面的设置

Servlet API 2.2规范相对于版本2.1来讲,主要引入了以下的新特征:

  • Web 应用程序的引入
  • 利用 Web Application Archive(WAR)来帮助用户发布 Web 应用程序
  • 对 Response 中的缓存控制的能力
  • 按名字获得 RequestDispatcher 对象的能力
  • 按相对路径获得 RequestDispather 对象的能力
  • 对国际化支持的提高
  • ......

下面我们我们将从四个方面来了解一下 Servlet 2.2 规范的新的与以前不同的而比较重要的部分,所以这里不是说对 Servlet 2.2 的规范的所有描述,关于 Servlet 2.2 的规范,我们可以去阅读 Sun 关于它的详细说明。

  1. Servlet API V2.2 中增加的一些新 API

    Servlet 2.2 的规范主要体现在 Servlet API V2.2 中增加的一些新API,Servlet API V2.2中所增加的新特征很少是为了替代原有的相同的功能。在规范中标记为“deprecated”方法你应该把他们移植到新的方法上,下面是一些主要的增加的API的简单说明:

    • 对 Response 中的缓存进行处理的能力-Response buffering ServletReponse对象包含了getBufferSize(),setBufferSize(), flushBuffer(), isCommitted()和reset()等方法使得Servlet可以访问、设置或者获得缓存的信息来提高用户的应用程序的效率。
    • 增加了获得RequestDispatcher对象的方法 在ServletContext对象中除了用绝对URL路径作为参数通过getRequestDispatcher()方法来获得RequestDispatcher对象外,在在ServletContext对象中增加了两个新方法:
      • 相对URL路径作为参数通过getRequestDispatcher()方法来获得RequestDispatcher对象
      • 通过getNamedDispatcher()方法按名字来获得RequestDispatcher对象
    • 处理基于 Web 应用程序的初始化参数

      在 ServletContext 对象中提供了以下方法来处理与 Web 应用程序相关联的初始化参数

      • getInitParameter
      • getInitParameterNames
    • 改变了访问HttpSession中的所存储的对象方法的名字

      用户应该使用getAttribute()等方法来替代getValue()等方法去访问HttpSession中的对象。原来的方法依然可用,但是应用程序应该把getValue(), getValueNames() 和 setValue()等方法移植到对应的getAttribute(), getAttributeNames()和setAttribute()方法上。

    • 在 HTTP 请求中增加的对于路径的处理新方法

      HttpServletRequest 增加了新方法getRequestHeaders(),程序可以使用它通过指定名字来来获得在HTTP请求中所包含的对应名字的头信息列表。例如对于“Cache-Control”来说,它就有多个头信息。HttpServletRequest 增加了新方法getContextPath(),程序可以使用它来获得包含此Servlet的 Web 应用程序的 Web 路径。例如,一个 Web 应用程序的 Web 路径可能配置为/webapp/itso,在此 Web 应用程序中的某一个Servlet的 Web 路径配置为/webapp/itso/request/resign,程序可以利用HttpServletRequest 所提供的API来抽取关于路径的不同部分,如下表所示:

      方法结果
      getRequestURI()/webapp/itso/request/resign
      GetServletPath()/request/resign
      getContextPath/webapp/itso
    • HTTP回应中头信息的处理

      HttpSerlvetResponse增加的新方法addHeader()使得程序用同一个名字在HTTP回应中输出多条头信息。同样可以使用方法addIntHeader()和addDateHeader()来处理非字符类型的头信息。

    • 在ServletConfig增加了方法getServletName来获得Servlet的名字。
    • 在ServletRequest中的方法getLocale来帮助程序判断客户端的语言环境。
    • 与安全性相关的API
      • ServletRequest包含的isSecure方法来判断请求是否是通过安全断口来传递的,例如HTTPS。
      • ServletRequest包含的isUserInRole和getUserPrinciple方法来处理关于用户角色和授权的信息。
  2. Web Application Archive (WAR) 的概念

    Servlet API V2.2 规范引入了一个新的概念帮助用户来发布用户的应用程序― Web Application Archive (WAR)。 一个WAR文件包含了一个 Web 应用程序中所含有的元素(Servlet代码, HTML和JSP页面等) 和应用程序描述文件来指定如何建立 Web 应用程序中所含有的元素,我们可以将一个WAR文件的内容分为三类:

    • 静态内容如HTML, JSP文件和图象文件
    • 执行代码如Java class文件和包含Java库的jar文件
    • 描述如何发布 Web 应用程序的发布描述符
    1. 创建WAR文件建议流程:
      1. 建立一个目录以存放所有WAR文件中的内容,暂且称为WAS_ROOT,在WAS_ROOT创建一个名为WEB_INF的目录。
      2. 按照层次关系在WAS_ROOT下存放静态文件。
      3. 在WEB-INF/classes目录下按照包的名字放置Java Class文件。
      4. 在WEB-INF/lib目录下放置JAR文件。
      5. 在WEB-INF下目录下创建发布描述文件,发布描述文件是XML格式的文件,关于对应的DTD的定义在Servlet API V2.2有详细的描述。
      6. 创建WAR文件,你可以使用JDK提供的JAR工具。

      按照此流程,我们给出一个简单的例子,假使WAS_ROOT的名字为BuildWar,在 BuildWar 下的内容为

      index.html
      Tournament/Player.html
      Tournament/Player.jsp
      Tournament/PlayerDetails.html
      Tournament/PlayerDetails.jsp
      WEB-INF/classes/com/myCompany/MyServlet.class
      WEB-INF/web.xml

      相应的发布描述文件为web.xml,其内容为:

      ITSO
      <servlet>
      <servlet-name>MyServlet</servlet-name>
      <servlet-class>com.myCompany.MyServlet</servlet-class>
      </servlet>
      <servlet-mapping>
      <servlet-name>MyServlet</servlet-name>
      /runMyServlet
      </servlet-mapping>

      使用JDK提供的JAR工具来创建WAR文件的例子:

      C:\>cd BuildWar
      C:\BuildWar>jar -cvf c:/TargetWar/myapp.war .
      added manifest
      adding: Tournament/(in = 0) (out= 0)(stored 0%)
      adding: Tournament/PlayerDetails.jsp(in = 1230) (out= 540)(deflated 56%)
      adding: Tournament/Player.jsp(in = 211) (out= 153)(deflated 27%)
      adding: Tournament/PlayerDetails.html(in = 994) (out= 439)(deflated 55%)
      adding: Tournament/Player.html(in = 612) (out= 351)(deflated 42%)
      adding: WEB-INF/(in = 0) (out= 0)(stored 0%)
      adding: WEB-INF/web.xml(in = 1092) (out= 306)(deflated 71%)
      adding: WEB-INF/classes/(in = 0) (out= 0)(stored 0%)
      adding: WEB-INF/classes/com/(in = 0) (out= 0)(stored 0%)
      adding: WEB-INF/classes/com/myCompany/(in = 0) (out= 0)(stored 0%)
      adding: WEB-INF/classes/com/myCompany/MyServlet.class(in = 5822) (out= 2638)(de
      flated 54%)
      adding: asimple.jsp(in = 107) (out= 69)(deflated 35%)
      adding: index.html(in = 237) (out= 168)(deflated 29%)
      C:\>dir /s C:\TargetWar
      Volume in drive C is WINDOWS2000
      Volume Serial Number is 0A72-0FE1
      Directory of C:\TargetWar
      10/13/2000 02:31p  .
      10/13/2000 02:31p  ..
      10/13/2000 02:46p 6,916 myapp.war
      1 File(s) 6,916 bytes
      Total Files Listed:
      1 File(s) 6,916 bytes
    2. 如何从一个WAR来发布用户的应用程序

      在形成我们的WAR文件后,我们可以利用它来发布我们自己的 Web 应用程序,这个过程和具体实现Servlet 2.2 API的Servlet运行环境相关,每一个Servlet运行环境都可能提供了相应的工具来帮助用户来完成这项工作,我们可以参照具体的产品的文挡来获得关于这类工具的说明。我们以IBM Web Sphere 3.5.2为例来解释这个过程。IBM Web Sphere 3.5.2提供了一个基于命令行的工具:wartoxmlconfig可以完成从一个WAR来发布用户的应用程序的工作。它命令行的具体参数为:

      参数意义
      WAR文件所在的目录c:\TargetWar\template.war
      发布目录c:\DeployedWar\as3\se3
      管理服务器的节点Myhost
      Servlet引擎的节点Myhost
      应用程序服务器的名字as3
      Servlet引擎Se3
      虚拟主机V2
      Web 应用程序的 Web 路径/webapp/newTemplate
      Web 应用程序的名字NewTemplate

      对应上表所示的情况,使用wartoxmlconfig的具体命令是:

      wartoxmlconfig c:\TargetWar\template.war c:\DeployedWar\as3\se3 myHost myhost as3 se3 v2 /webapp/newTemplate newTemplate

    3. Servlet API V2.2增强了对错误的支持

      Servlet API V2.2增强了对错误的支持,用户可以为一个 Web 应用程序指定:

      • 一个缺省的出错页面
      • 为某个特定的条件发生时指定的出错页面。例如当某个Exception或状态发生时显示的出错页面。 假使一个我们有一个名字为DefApp的 Web 应用程序,在 Web 应用程序下有一个名为TestServlet的Servlet程序。DefApp 的出错页面配置为:
        404/error/err404.jsp
        java.io.IOException/error/errIOException.jsp
        Javax.servlet.ServletException/error/errServletException.jsp
        Other/ErrorReporter

        TestServlet的源码为:

        import java.io.*;
        import javax.servlet.*;
        import javax.servlet.http.*;
        public class TestServlet extends HttpServlet {
        public void service(ServletRequest req, ServletResponse res) throws
        ServletException,IOException
        {
        String eType = req.getParameter("e");
        if (eType == null) {
        PrintWriter out=res.getWriter();
        res.setContentType("text/html");
        out.println("<html><head></head><body><h2>This the TestServlet
        for Error Pages.<br> Please specify the Exception
        Type.<br></h2></body></html>");
        out.close();return;
        }
        if (eType.equals("ioe")) {
        System.out.println("Exception Type == IOException");
        IOException ioe = new IOException();
        throw ioe;
        } else if (eType.equals("se")) {
        System.out.println("Exception Type == ServletException");
        ServletException se = new ServletException();
        throw se;
        } else {
        System.out.println("Other Exception");
        EOFException e = new EOFException();
        throw e;
        }
        }

        当我们按照特定的格式来调用处于DefApp下的资源,不同的格式会触发不同的出错条件,相应的的页面会显示出来。

        • http:///DefApp/x.jsp去调用一个不存在的资源会触发"404"的错误,"/error/err404.jsp"会显示出来。
        • http:///DefApp/servlet/TestServlet?e=ioe 会触发"java.io.IOException"的错误,"/error/errIOException.jsp" 会显示出来。
        • http:///DefApp/servlet/TestServlet?e=se 会触发javax.servlet.ServletException,"/error/errServletException.jsp"会显示出来。
        • http:///DefApp/servlet/TestServlet?e=e 会触发其它没有指定的错误,系统会调用"/ErrorReporter",缺省页面会显示出来。
  3. Servlet API V2.2 关于 Web 应用程序的“Welcome”页面的定义

    Servlet API V2.2为一个 Web 应用程序定义了一组"Welcome"页面,这组页面可以是HTML文件、JSP页面。当你按照 Web 应用程序的URL路径去调用一个处于 Web 应用程序下的资源而没有指定特定的文件名字时, Web 应用程序会显示一个"Welcome"页面。例如,有一个 Web 应用程序名字为DefApp,此 Web 应用程序的"Welcome"页面配置了两个文件"index1.html"和"index1.jsp"。当我们按照下面的URL格式去调用时:http://myHost/webapp/myApp,按照顺序"index1.html"页面会显示出来,如果我们把实际的index1.html文件更名或者删除,再次按照相同的格式调用时,"index1.jsp"就会显示出来。当两者都不存在,系统应该去寻找缺省的页面"index.html"。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Java technology, Web development
ArticleID=53489
ArticleTitle=Servlet API 2.2 的新特征
publish-date=12012000