user-data-constraint元素用于表明数据在客L到服务器端是怎么保护的?/div>
Used in :security-constraint
-->
<!ELEMENT user-data-constraint (description?,transport-guarantee)>
<!--
web-resource-collection元素用于web应用中安全限制的资源被那些方法用,如果没有指定Q就可以被web用的所有方法调用?/span>
Used in:security-constraint
-->
<!ELEMENT web-resource-collection (web-resource-name,description?,url-pattern*,http-method*)>
<!--
web-resource-name 包含一?span>web资源集合的名U?/span>
Used in:web-resource-collection
-->
<!ELEMENT web-resource-name (#PCDATA)>
<!--
welcome-file元素包含?span>web应用中默认的讉K文gQ如index.html
Used in:welcome-file-list
-->
<!ELEMENT welcome-file (#PCDATA)>
<!--
welcome-file-list包含welcome-file的列?/span>
Used in:web-app
-->
<!ELEMENT welcome-file-list (welcome-file+)>
<!--
ID机制可以增加额外的部|信息,不允许加一个非标准的元素到标准的部|描qC
-->
<!ATTLIST auth-constraint id ID #IMPLIED>
<!ATTLIST auth-method id ID #IMPLIED>
<!ATTLIST context-param id ID #IMPLIED>
<!ATTLIST description id ID #IMPLIED>
<!ATTLIST display-name id ID #IMPLIED>
<!ATTLIST ejb-link id ID #IMPLIED>
<!ATTLIST ejb-local-ref id ID #IMPLIED>
<!ATTLIST ejb-ref id ID #IMPLIED>
<!ATTLIST ejb-ref-name id ID #IMPLIED>
<!ATTLIST ejb-ref-type id ID #IMPLIED>
<!ATTLIST env-entry id ID #IMPLIED>
<!ATTLIST env-entry-name id ID #IMPLIED>
<!ATTLIST env-entry-type id ID #IMPLIED>
<!ATTLIST env-enry-value id ID #IMPLIED>
<!ATTLIST error-code id ID #IMPLIED>
<!ATTLIST error-page id ID #IMPLIED>
<!ATTLIST exception-type id ID #IMPLIED>
<!ATTLIST extension id ID #IMPLIED>
<!ATTLIST filter id ID #IMPLIED>
<!ATTLIST filter-class id ID #IMPLIED>
<!ATTLIST filtere-mapping id ID #IMPLIED>
<!ATTLIST filter-name id ID #IMPLIED>
<!ATTLIST form-error-page id ID #IMPLIED>
<!ATTLIST form-login-config id ID #IMPLIED>
<!ATTLIST form-login-page id ID #IMPLIED>
<!ATTLIST home id ID #IMPLIED>
<!ATTLIST http-method id ID #IMPLIED>
<!ATTLIST icon id ID #IMPLIED>
<!ATTLIST init-param id ID #IMPLIED>
<!ATTLIST jsp-file id ID #IMPLIED>
<!ATTLIST large-icon id ID #IMPLIED>
<!ATTLIST listener id ID #IMPLIED>
<!ATTLIST listener-class id ID #IMPLIED>
<!ATTLIST load-on-startup id ID #IMPLIED>
<!ATTLIST local id ID #IMPLIED>
<!ATTLIST local-home id ID #IMPLIED>
<!ATTLIST location id ID #IMPLIED>
<!ATTLIST login-config id ID #IMPLIED>
<!ATTLIST mime-mapping id ID #IMPLIED>
<!ATTLIST mime-type id ID #IMPLIED>
<!ATTLIST param-name id ID #IMPLIED>
<!ATTLIST param-value id ID #IMPLIED>
<!ATTLIST realm-name id ID #IMPLIED>
<!ATTLIST remote id ID #IMPLIED>
<!ATTLIST res-auth id ID #IMPLIED>
<!ATTLIST res-ref-name id ID #IMPLIED>
<!ATTLIST res-sharing-scope id ID #IMPLIED>
<!ATTLIST res-type id ID #IMPLIED>
<!ATTLIST resource-env-ref id ID #IMPLIED>
<!ATTLIST resource-env-ref-name id ID #IMPLIED>
<!ATTLIST resource-env-ref-type id ID #IMPLIED>
<!ATTLIST resource-ref id ID #IMPLIED>
<!ATTLIST role-link id ID #IMPLIED>
<!ATTLIST role-name id ID #IMPLIED>
<!ATTLIST run-as id ID #IMPLIED>
<!ATTLIST security-constraint id ID #IMPLIED>
<!ATTLIST security-role id ID #IMPLIED>
<!ATTLIST security-role-ref id ID #IMPLIED>
<!ATTLIST sevlet id ID #IMPLIED>
<!ATTLIST servlet-class id ID #IMPLIED>
<!ATTLIST servlet-mapping id ID #IMPLIED>
<!ATTLIST servlet-name id ID #IMPLIED>
<!ATTLIST session-config id ID #IMPLIED>
<!ATTLIST session-timeout id ID #IMPLIED>
<!ATTLIST small-icon id ID #IMPLIED>
<!ATTLIST taglib id ID #IMPLIED>
<!ATTLIST taglib-location id ID #IMPLIED>
<!ATTLIST taglib-uri id ID #IMPLIED>
<!ATTLIST transport-guarantee id ID #IMPLIED>
<!ATTLIST rul-pattern id ID #IMPLIED>
<!ATTLIST user-data-constraint id ID #IMPLIED>
<!ATTLIST web-app id ID #IMPLIED>
<!ATTLIST web-resource-collection id ID #IMPLIED>
<!ATTLIST web-resource-name id ID #IMPLIED>
<!ATTLIST welcome-file id ID #IMPLIED>
<!ATTLIST welcome-file-list id ID #IMPLIED>
13.4 例子
13.4.1 基本的例?/div>
<web-app>
<display-name>A Simple Application</display-name>
<context-param>
<param-name>Webmaster</param-name>
<param-value>webmaster@mycorp.com</param-value>
</context-param>
<servlet>
<servlet-name>catalog</servlet-name>
<serrvlet-class>com.mycorp.Catalogservlet</servlet-class>
<init-param>
<param-name>catalog</param-name>
<param-value>Spring</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>catalog</servlet-name>
<url-pattern>/catalog/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<mime-mapping>
<extension>pdf</extension>
<mime-type>application/pdf</mime-type>
</mime-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
<error-page>
</web-app>
13.4.2 一个安全的例子
<web-app>
<display-name>A Secure Application</display-name>
<security-role>
<role-name>manager</role-name>
</security-role>
<servlet>
<servlet-name>catalog</servlet-name>
<servlet-class>com.mycorp.CatalogServlet</servlet-class>
<init-param>
<param-name>catalog</param-name>
<param-value>Spring</param-value>
</init-param>
<security-role-ref>
<role-name>MGR</role-name>
<!-- 在代码中用的角色名称-->
<role-link>manager</role-link>
</security-role-ref>
</servlet>
<servlet-mapping>
<servlet-name>catalog</servlet-name>
<url-pattern>/catalog/*</url-pattern>
</servlet-mapping>
<security-constraint>
<web-resource-collection>
<web-resource-name>SalesInfo</web-resource-name>
<url-pattern>/salesinfo/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>manager</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
</web-app>
l尾Q?/div>
servlet2.3到此q束了Q至于对接口cȝ解释。这里就不给与了。有兴趣的朋友可?span>down一个servlet2.3的源码包自己研究研究?/span>
]]>
Servlet2.3中文文档(W?Q?Q?0? http://www.tkk7.com/zhuyan/articles/138196.html朱岩 朱岩 Mon, 20 Aug 2007 09:43:00 GMT http://www.tkk7.com/zhuyan/articles/138196.html http://www.tkk7.com/zhuyan/comments/138196.html http://www.tkk7.com/zhuyan/articles/138196.html#Feedback 0 http://www.tkk7.com/zhuyan/comments/commentRss/138196.html http://www.tkk7.com/zhuyan/services/trackbacks/138196.html W八?Dispatching Requests 当徏立一个web应用Ӟ把一个请求传l另一个servlet或在response中包含另一个servlet的输出是l常 使用的。RequestDispatcher接口提供了一些方法?br>8.1 获得RequestDispatcher 实现了接口RequesetDispatcher接口的对象可以在ServletContext的getRequestDispatcher?br>getNamedDispatchcerҎ得到?br>getRequestDispatcher的参数是一个以根目?#8216;/’开始的一个\径,该方法会查找路径下的servletQƈ?br>它封装成RequestDispatchcer对象q回?br>getNamedDispatcherҎ把一个ServletContext知道的servlet名字作ؓ参数Q如果找到servletQ该 servletp装成RequestDispatcher对象q回Q如果没有找到则q回null?br>RequestDispatcher对象中用相对\径也是可以的。在ServletRequest中提供了getRequestDispatcher ҎQ这个方法和ServletContext中同名的Ҏ功能cM。servlet引擎会用request的信息把相对路径?br>化成完整路径的。如ServleltRequest.getRequestDispatcher("header.html")和ServletConext. getRequestDispatcher("/garden/headere.html")是等效的?br>8.1.1 在Request Dispatcher 路径中附加字W串 在ServletContext和ServletRequest创徏RequestDispatcherҎ中参数都可以带字W串如: Context.getRequestDispatcher("/raisons.jsp?orderno=5"); 8.2 Request Dispatcher的?br>对于使用Request Dispatcher 而言是一个servlet调用include或forwardҎQ这些方法的参数?br>Servlet接口传来的request和response对象实例。引擎必ȝ保调用Request Dispatcher的处理过E是?br>同一个JVM的同一个线E中?br>8.3 include Ҏ RequestDispatcher接口的includeҎ可以在Q何时候被调用Q目标servlet可以包含所有外的request?br>象,不过response对象的用是有限制的Q?br>response只能写信息到ServletOutputStream 或者Writer中,调用response对象的flushBufferҎq行?br>交。不能够讄头信息,MҎ都不会媄响到response的头信息?br>8.3.1 被包含的request参数 除了可以用getNamedDispatcherҎ包含一个servlet外,以下的属性可以被讄Q?br>Java.servlet.include.request_uri Java.servlet.include.context_path Java.servlet.include.servlet_path Java.servlet.include.path_info Java.servlet.include.query_string 用request对象的getAttributeҎ可以获取被包含servlet的以上属性?br>如果被包含的servlet能后通过getNamedDispatcherҎ扑ֈ׃必设|以上属性了?br>8.4 Forward Ҏ RequestDispatcher接口中的forwardҎQ只有servlet没有提交响应到客L时才可用Q如果响?br>buffer中有数据q没有提交,当调用forwardҎ中目标servlet的serviceҎ前,buffer中的内容会被?br>I;如果buffer中的数据提交了,则发生IllegalStateException错误?br>request对象的\径必L映获取RequestDispatcher对象的\径?br>有个例外Q如果RequestDispatcher是通过getNamedDispatcherҎ得到的,request对象必须反映原始 request的\径?br>在RequestDispatcher接口Ҏforwardq回前,response的内容必被提交Qƈ由引擎关闭该servlet?br>8.4.1 query String 在Request Dispatcher中创建的路径是可以带参数的?br>8.5 错误 如果request Dispatcher的目标servlet抛出q行旉误或ServletException 或IOExceptionQ错误就会被 传给调用的servletQ在上传之到调用的servlet之前Q所有其他的exception都应该包装成 ServletExceptions?br> W九?web 应用 一个web应用是一堆servletQhtml面Q类和其他资源的集合。web应用可以被发布运行在很多服务?br>供商的多U引擎下?br>9.1 web服务?br>在web服务中一个web应用的根目录是一个特D的路径Q例如:一个网站目录可以以http://www . mycorp.com/dQ所有的h都将以这个作为前~发送到以这个前~描述的servletContext环境中?br>在Q何时候一个web应用的实例只能运行在一个JVM中?br>9.2 和servletContext的关p?br>servlet引擎会强qweb应用和ServletContext的通信Q一个ServletContext对象提供了一个servlet使得?br>应用可见?br>9.3 web应用中的元素 一个web应用包含以下的元素: .Servlets .JSP .Utility Classes .Static documents(html,images,sounds,etc) .Client side Java applets,beans,and classes .Descriptive meta informateion 9.4 部v层次 q个协议定义了一个层ơ结构,用于部v和打包,q个l构存在于一个文件中?br>9.5 目录l构 一个web应用存在一个目录层ơ结构。文件根目录是应用的一部分。例如:一个web应用的上下文路径 ?catalogQweb应用的index.html文gp?catalog/index.htmlh讉K。URL和上下文路径的匹?br>规则在11章讨论。servlet引擎必须拒绝一个具有现在冲H的上下文\径的web应用Q这U情冉|?br>的,如:两个web应用发布在同一个上下文路径中,或一个web应用的上下文路径是另一个web应用?br>下文路径的子路径?br>有一个特D的目录Q?#8220;WEB-INF”Q在应用中存在,q个目录包含所有与应用相关Q又不在根目录中的事 物。可以直接被引擎提供l客L的文件不攑֜WEB-INF中,但WEB-INF目录对于调用ServletContext 的getResource和getResourceAsStreamҎ的servlet 代码是有效的。如果开发者想用servlet代码调用 一个不希望暴露l客L的一个配|信息,可以把q个配置信息攑֜WEB-INF目录下。请求都是和?br>源相匚w的;敏感的匹配如客户端的h?#8220;/WEB-INF/foo”?#8220;/Web-iNf/foo”Q但不应该把定位? WEB-INF下的内容作ؓl果q回?br>WEB-INF目录下的内容有: ./WEB-INF/web.xml 部v描述文g ./WEB-INF/classes/ 存放servlet class ./WEB-INF/lib/*.jar 是jar包的目录 应用的classloader先load WEB-INF/classes目录下的class后load WEB-INF/lib目录下的jar?br>9.5.1 目录l构的一个例?br>一个简单web应用的目录结构: /index.html /howto.jsp /images/banner.gif /images/jumping.gif /WEB-INF/web.xml /WEB-INF/lib/jspbean.jar /WEB-INF/classes/com/mycorp/servlets/MyServlet.class /WEB-INF/classes/com/util/MyUtils.class 9.6 web应用的存档文?br>一个web应用可以被java打包工具打包成war文gQ当被打包后包中׃有一个额外META-INF目录Q该 目录下存放了打包工具的一些信息?br>9.7 web应用部v描述 下面是web应用部v描述中的配置cdQ?br>.ServletContext Init Parameters .Session Configuration .Servlet / JSP Definitions .Servlet / JSP Mappings .MIME Type Mappings .Welcome File list .Error Pages .Security 9.7.1 可靠的扩?br>web容器L供一U机制得web应用知道jar文g中包含的有用资源或代码?br>引擎因该提供~辑、配|库文g的程序?br>在WAR中提供一个MANIFEST.MF文gQ描q扩展名列表是比较好的。标准的JAR是应该有的,q个文g 描述的扩展名应该遵@Http://java.sun.com/j2se/1.3/docs/guide/extensions/versioning.html 中的?br>定。web容器应该能够识别WEB-INF/lib文g夹中的Q何文件的扩展名,如果不能够识别就应该拒绝?br>应用E序Qƈ报出错误?br>9.7.2 web应用的classloader 引擎用于装蝲war中的servlet的装载器必须能够让开发者装载jar库中的Q何资源。但装蝲的资源禁止覆 盖j2se或servlet API中的c;通常的做法是装蝲器不允许war中的servlet去访问web引擎中的cR?br>q有一个被推荐的做法是实现应用c装载器Qwar中被装蝲的类或资源就会被攑ֈcontainer-wide JAR?br>的特定类或资源中?br>9.8 替换web应用 一个服务器可能会在不重新启动引擎的情况下用一个新版本的应用替换原有的应用。当一个应用被替换 Ӟ引擎应提供一个robustҎM存该应用中的session 9.9 错误句柄 9.9.1 request Attributes web应用必须列出在用中资源发生的错误,q些资源在部|描qC都有定义?br>如果错误在一个servlet或一个jsp面中发生,则在W?.1章中的如下的h属性就会被讄Q?br>Request Attributes Type Javax.servlet.error.status_code java.lang.Integer Javax.servlet.error.exception_type java.lang.Class Javax.servlet.error.message java.lang.String Javax.servlet.error.exception java.lang.Throwable Javax.servlet.error.request_uri java.lang.String Javax.servlet.error.servlet_name java.lang.String q些属性允许这个servletҎq些状态码、错误类型、错误信息、被抛出的错误对象、错误生的 servlet被访问的URIQ可以用getRequestURI得到Q、或错误产生的servlet的逻辑名称产生Ҏ的内 宏V?br>?.3版本中错误类型和错误信息属性是多余的,他们被保留只是ؓ了向下兼容以前的版本?br>9.9.2 错误面 当一个servlet产生错误Ӟ开发者可以订刉误内容返回给客户端。部|描q文件定义了一个错误页?br>列表。servlet在response中设|错误状态码或生的异常或错误被引擎支持Ӟ引擎׃从部|描q文 件中调用相应的配|的错误资源?br>如果一个错误码被设|在了response中,引擎在部|描q文件的错误面列表中用status-code方式匚w 对应的资源,如果扑ֈp用本地的资源?br>在一个请求被处理的过E中servlet可以抛出以下的异常: .runtime exceptions or errors .ServletExceptions or subclasses thereof .IOException or subclasses thereof web应用可以用exception-type元素来描q错误页面,在这U情况下引擎会通过比较用exception-type?br>素定义的error-page列表中的异常来匹配生的异常。匹配的l果是返回定义的与错误匹配的本地?br>源。在l承cMQ最q的cd被调用?br>如果没有一个error-page包含的exception-type与class-heirarchy相匹配。抛出的ServletException或其?br>cd常,被引擎通过ServletException.getRootCauseҎ获得Q获得后用这个异常再去配|的error page列表中去匚w?br>在部|描q文件中用exception-type元素定义的Error-page中exception-type的类名必L唯一的?br>当错误发生在servlet调用的RequestDispatcher中时error page机制是不能够q预到的Q这L情况如: 一个servlet用RequestDispatcher去调用另一个有错误的servlet?br>如果一个servlet产生的错误没有被描述的错误页面机制所抓到Q引擎必设|response的状态码?00 9.10 Welcome Files web应用可以在部|描q文件中定义一个welcome files调用的URI列表Q这个机制的目的是允许开发?br>定义自己的访问首c?br>如果没有在部|描qC配置welcome 文g,引擎把局部请求(没有指明具体讉K资源Q如www.cacolg . com/index.html,h讉K时用www.cacolg.com/ 讉K的)发送到适当的资源中Q如Q一个可能默认的 servletQ或列出该目录下的文件列表,或返?04响应错误?br>一个例子: 1Q在部v描述中定义index.html和default.jsp为welcome files 2Q定义一个servlet的mapping路径?foo/ WAR中有的文件如下: /foo/index.html /foo/default.html /foo/orderform.html /foo/home.gif /catalog/default.jsp /catalog/products/shop.jsp /catalog/products/register.jsp 3Q请求的URI?处理后的URI /foo ?/foo/ /foo/index.html /catalog/ /catalog/default.jsp /catalog/index.html 404 not found /catalog/products/ 404 not found 也可能返回shop.jsp and /or register.jsp 列表?br>9.11 web应用环境 j2EE定义的命名环境能够得应用在不需要知道外部信息怎么命名的情况下比较方便的访问资源或外部 信息?br>servlet作ؓj2EE完整的一部分Qweb应用部v描述文g提供了一个servlet可以讉K资源和EJBQ这?br>部v描述元素有: .env-entry .ejb-ref .ejb-local-ref .resource-ref .resource-env-ref 开发者用这些元素描qweb应用中需要用到的对象Q这些对象都要在web容器q行时注册到JNDI命名 I间?br>在J2EE1.3版本j2EE的环境需求中Qservlet引擎不是J2EE技术的一部分Qweb环境要提供的功能在J2EE 规范中有描述。如果没有实现支持环境所要提供的功能Q在发布应用Ӟweb容器׃抛出警告?br>实现servlet引擎在J2EE中是需要的Q应该被U_J2EE1.3中。J2EE1.3应该提供更多的内宏V?br>servlet引擎必须支持对象的lookupҎQ查扑֯象ƈ在引擎控制的U程中实例化?br>servlet引擎应该支持开发者创建的U程Q因为应用创建的U程不是很轻便,开开发者不得不依赖于这?br>功能有限的线E。这些需求将被加入到下一个版本的servlet规范中?br> W十?应用周期事g 10.1 介绍 事g是servlet2.3U新ȝ内容。应用事件得web开发者能够控制ServletContext和HttpSession对象?br>信息交互Q得管理web使用的资源更有效Q方ѝ?br>10.2 事g监听?br>事g监听器是实现了servlet事g监听接口的类。在web发布是这些监听类p实例化和注册在web容器 中?br>servlet事g监听器提供了在ServletContext和HttpSerssion对象状态发生改变时触发的事件。Servlet cotext监听器用于管理应用的资源或虚拟机的状态。HTTP session监听器管理与会话兌的资源?br>可以有多个监听器监听每一个事件类型。开发者可以指定引擎调用监听类的顺序?br>10.2.1 事gcd和监听接?br>Event Type ListenerInterface 说明 Lifecycle javax.servlet.ServletContextListener 当servlet context被创建ƈ有效?br> 接受W一个请或servlet context销毁前 Changes to attributees javax.servlet.ServletContextAttributesListener 当servlet context中的属性发?br> added,removed,replaced Lifecycle javax.servlet.http.HttpSessionListener 当HttpSession被创建,无效或超?br>Changes to attributes javax.servlet.HttpSessionAttributesListener 当属性added,removed或replaced?br>10.2.2 一个用监听的例子 一个简单的web应用中有servlet要访问数据库Q开发者提供一个context 监听cȝ理数据库q接?br>1Qweb应用启动Ӟ监听c被装蝲Q登陆数据库Q在servlet context中保存数据库q接?br>2Qservlet讉K数据库连?br>3Q当web服务销毁时Q或应用从web服务中删除时Q关闭数据库q接?br>10.3 监听cȝ配置 10.3.1 对监听类的规?br>web开发者提供实C以上监听接口的类Q每个类应该有一个没有参数的构造器函数。监听类攑֜ WEB-INF/classes下或以一个jar文g攑֜WEB-INF/lib下都可以?br>10.3.2 部v描述 web容器Ҏ个监听类只会创徏一个实例,在第一个请求到来之前实例化q注册。web容器注册监听c?br>的顺序根据他们实现的接口和在部v描述文g中定义的序。web应用调用监听实例的顺序按照他们注 册的序?br>10.3.4 在销毁时的事?br>当应用销毁时监听事g的执行顺序按部v描述中的序Q先执行session中的监听事g再执行context?br>的监听事件。session的无效事件必dcontext的销毁事件之前被调用?br>10.4 部v描述的例?br>下面l出注册两个servlet cocntext lifecycle监听器和一个HttpSession监听器的例子?br>Com.acme.MyconnectionManager和com.acme.MyLoggingMoudule都实Cjavax. servletServletContextListener接口,com.acme.MyloggingModule另外q实Cjavax.servlet. HttpSessionListener接口。开发者希望com.acme.MyConnectionManager在com.acme. MyLoggingModule之前理者servlet context 的生命周期事件。部|描q文件如下: <web-app> <display-name>MyListeningApplication</display-name> <listener> <listener-class>com.acme.MyConnectionManager</listener-class> </listenrer> <listenrer> <listenrer-class>com.acme.MyLoggingModele</listener-class> </listener> <sevlet> <display-name>RegistrationServlet</display-name> ..etc </servlet> </web-app> 10.5 监听器的实例和线E?br>在第一个请求被web容器接受之前实例化ƈ注册好监听器cL必须的。监听器在整个web应用生命周期 中都要用?br>ServletContext和HttpSession对象属性的改变可能会同时生,引擎不需要同步这些属性类的事件?br>10.6 分布式容器组 在分布式web容器l中QHttpSession和ServletContext实例只活动与它们本地的JVM中。在分布式web?br>器中Q监听实例会在每一个web容器中创建实例?br>10.7 session事g 监听器得开发者可以跟tweb应用中的session。知道session是否变得无效是经常被用到的,因ؓ session时时引擎会使session变得无效Q或应用会调用invalidateҎ?br>
]]> Servlet2.3中文文档(W?,7? http://www.tkk7.com/zhuyan/articles/138195.html朱岩 朱岩 Mon, 20 Aug 2007 09:35:00 GMT http://www.tkk7.com/zhuyan/articles/138195.html http://www.tkk7.com/zhuyan/comments/138195.html http://www.tkk7.com/zhuyan/articles/138195.html#Feedback 0 http://www.tkk7.com/zhuyan/comments/commentRss/138195.html http://www.tkk7.com/zhuyan/services/trackbacks/138195.html W六?br>6 Filtering Fileter是servlet2.3新增的部分。这一章介lFiltercdҎQ以及在web工程中的配置?br>6.1什么是Fileter Filter是重复用的Q用于变换HTTPh和响应以及头信息中的内容。Filter不能像servlet那样创徏 response响应Q但可以修改h和响应的内容?br>6.1.1例D一些Filter 验证Filter 登陆Q审核Filter 囑փ处理Filter 数据压羃Filter 加密Filter XSL/T Filter MIME Filter 6.2 主要观念 开发者通过创徏实现javax.servlet.Filter接口的类Qƈ提供一个没有参数的构造函数来创徏一个Filter?br>在描q文件中Fileter用filter表示Q调用方法用filter-mappingq行配置?br>6.3 Filter生命周期 在web工程发布后,在请求引擎讉K一个web资源之前Q引擎必d位Filter列表Q引擎必ȝ保ؓ?br>表中的每一个Filter建立了一个实例,q调用了他们的init(FilterConfig config)Ҏ。在q过E中可以?br>出异常?br>部v描述文g中定义的所有filterQ仅会在引擎中生一个实例?br>引擎为filter提供了一个FilterConfigc,该类附有ServletContext和一个带有初始化参数的set?br>当引擎接受一个请求时Q引擎就会调用filter列表中第一个filter的doFilterҎQ把ServletRequestQ?br>ServletResponse和FilterChain作ؓ参数传给它?br>filter中doFilterҎ典型的处理步骤是Q?br>1Q检查请求头信息 2Q开发者创Z个实CServletRequest或HttpServletRequest的类Q去包装request对象Q以 便修改请求的头信息或体数据?br>3Q开发者创Z个实CServletReqponse或HttpServletResponse的类Q去包装response?br>象,以便修改h的头信息或体数据?br>4)filter可以调用链中的下一个实体,下一个实体是另一个filterQ如果该filter是列表中最后的一 个,则它的下一个实体就是一个目标web资源。如果要调用下一个filter的doFilterҎQ把 requestQ和response对象传给FilterChain对象的doFilterҎ中就可以了?br>Filter chain 的doFilterҎ是由引擎提供的,引擎在该Ҏ中会定位filter列表中的下一个filterQ?br>调用它的doFilterҎQ把传来的request和response对象传给它?br>5Q在调用chain.doFilter之后Qfilter可以响应的头信?br>6Q在q些q程中,filter可以抛出异常。当在调用doFilterq程中抛出UnavailableException异常 Ӟ引擎重复试处理下面的filter chain的方法,如过时后q没h到filter chain ׃关闭?br>filter chain的请求?br>当filter是列表中最后一个filterӞ它的下一个实体是描述配置文g中filter后面的servlet或其?br>资源?br>在引擎删除一个Filter之前Q引擎必调用Filter的destroyҎQ来释放资源?br>6.3.1 包装Requests 和Responsees qo的中心观忉|对request或response的包装,在这U模式下Q开发者不仅可以改写存在的ҎQ还 可以创徏自己的新ҎQ用于特D的qodQ例如:开发者希望扩展response对象Q希望有个更高层 ơ的输出对象(writerQ?br>Z支持包装模式Q引擎不怿证在整个qo链中Q传递的request和response对象都是同一个对象?br>6.3.2 Filter的环?br>Filter的初始参数可以在描述配置文g中用init-params元素来配|,在运行时中,用FilterConfig?br>getInitParameter和getInitParamesterNamesҎ得到配置参数?br>6.3.3 Filter在web工程中的配置 在部|描q文件中Q?br>filter-name:filter名称 filter-class:filterc\?br>init-params:用于初始化参?br>如果开发者在部v描述中ؓ一个filtercLqC两个定义Q则引擎会创个filtercȝ两个实例?br>下面是个配置的例? <filter> <filter-name>Image Filter</filter-name> <filter-class>com.acme.ImageServlet</fiflter-class> </filter> 一旦filter在部|描qC定义Qfilter-mapping可以被定义了,filter-mapping在web应用中是定义兌 filter的servlet和静态资源的?br>如: <filter-mapping> <filter-name>Image Filter</filter-name> <servlet-name>ImageServlet</servlet-name> </filter-mapping> Image Filter ?Filter和ImageServlet 的Servlet建立了关联?br>Filter 可以和一servlet和静态资源关联,用url-pattern。如Q?br><filter-mapping> <filter-name>Loging Filter</filter-name> <url-pattern>/*</url-pattern> <filter-mapping> 引擎建立ҎhURI的Filter铄序? 1)url-pattern映射fiter-mapping的顺序和描述文g中定义的序是一L?br>2Qservlet-name映射filter-mapping的顺序和描述文g中定义的序是一L?br>q种需求要求引擎在接受hӞ .识别W合SRV.11.2规则的web资源?br>.如果一些filter是servlet和有servlet-name的web资源匚w的,引擎׃创徏一个和描述文g?br>映射servlet-name的顺序一Lfilter链?br>.如果一些filter是rul-pattern兌的,引擎׃创徏一个和描述文g中映url-pattern的顺序一 Lefilter链?br>一个高性能的web容器会~存filter链?br> W七?Sessions 文本传输协议(HTTPQ是无状态的协议。要建立一个有效的web应用Q客L之间的通信是需?br>的。有很多会话跟踪的策略, 但是直接使用q些技术都很难使用。servlet规范中提供了一个简单的HttpSession接口Q不需要开发?br>兛_会话跟踪的具体细节?br>7.1 会话跟踪机制 下面描述了几U会话的跟踪机制 7.1.1 Cookies HTTP cookies是最常用的会话跟t机Ӟ所有的servlet引擎都应该支持这U方法?br>引擎发送一个cookie到客LQ客L׃在以后的h中把q个cookieq回l服务器。用户会话跟t?br>的cookie的名字必LJSESSIONID 7.1.2 SSL Sessions 在安全套接字层,加密技术用在了HTTPS协议Q从一个客L来的多个h允许用一个含p的标识Q?br>servlet引擎qq个数据定义一个Session?br>7.1.3 URL重写 URL重写是最低性能的通用会话跟踪Ҏ。当一个客L不能接受cookieӞURL重写׃作ؓ基本?br>会话跟踪ҎQURL重写包括一个附加的数据Q一个session idQ这LURL会被引擎解析和一个session 相关联。一个session id是作为URL的一个被~码的参C输的Q这个参数名字必Ljsessionid.如下?br>的例子:http://www.myserver.com/catalog/index.html;jsessionid=1234 7.1.4 会话的完整?br>一个web容器必须支持HTTP 会话。而当cookiesҎ不被支持Ӟ通常使用URL重写Ҏ?br>7.2 创徏一个会?br>servlet设计者必考虑C个客L不能加入session的情c?br>7.3 会话范围 HttpSession对象只在应用E序U有效,通常用于session的cookie可以服务于不同的上下文,但一?br>HttpSession实例只服务于一个会话。D个例子:如一个servlet A用RequestDispatcher去调用另一个web 应用中的另一个servlet BQ用于A和B的会话一定是两个不同的会话?br>7.4 Session属性的邦定 一个servlet可以通过一个name邦定一个对象到HttpSession实例中;只要获得包含同一个会话的h?br>象,M邦定C话中的对象在同一个ServletContext中对于其它的servlet都是可用的?br>当把一个对象放入session或从session删除时可能要通知其它对象Q这些信息能够被实现?br>HttpSessionBindingListener接口的对象获得,q个接口定义了一下的一些方法?br>valueBound valueUnbound valueBoundҎ在HttpSession接口调用getAttributeҎ获得一个有效的对象之前调用。valueUnbound Ҏ在HttpSession接口调用getAttributeҎ获得一个不再有效的对象后调用?br>7.5 会话时
在HTTP协议中,当客L不再有效Ӟ没有清楚的定义终止信受这意味着通常只能采用旉时 来表明客L不再有效?br>默认的超时时间是servlet引擎定义的,通过HttpSession的getMaxInactiveIntervalҎ可以得到时?br>旉Q开发者可用用setMaxInactiveIntervalҎ来设|超时的旉Q以U定义的。如果一个session?br>时旉被设|ؓ-1Q则q个session永q有效?br>7.6 最后访问时?br>在当前的h中用HttpSession接口的getLastAccessedTime可以获得最后一ơ访问session的时间?br>7.7 重要session 7.7.1 U程问题 在一个可以配|的应用中,所有的h都是一个会话的一部分Q引擎一定能够取出通过setAttribute?br>putValue攑օHttpSession对象中的对象。注意以下的情况Q?br>.引擎一定能够访问实CSerializable接口的对象?br>.引擎可以选择存储HttpSession对象中指定的对象Q如EJBlg和事务?br>.引擎能够监听C话的变动?br>如果攑օsession中的对象没有被Seializable或没有效Qservlet可以抛出IllegalArgumentExceptionQ如?br>引擎不支持Session存储对象的机Ӟ引擎一定会抛出IllegalArgumentException?br>q些限制意味着Q在一个分布式引擎中,不会有额外的q发问题?br>如果引擎Zservice的品质持l化或迁UsessionQ用本地持l化的HttpSession或它的属性是不受?br>制的Q开发者要想确保放入session中的属性对象能够可用,最好对象实现Serializable接口?br>在迁UM个session时引擎必通知session中实CHttpSessinActivationListener的属性对象,必须通知 在序列化前钝化的或序列化后激zȝsession的监听器?br>开发分布式的开发者应该清楚的是,一旦引擎运行在过一个JVM的时候,׃能用static 表明变量?br>存储应用状态,应该用EJB或数据库赖存储?br>7.7.3客户?br>因ؓcookies或SSL证书都是被web览器访问过E控制的Q与MҎ的window览器是没有关系的?br>所以从所有window客户端到一个servlet引擎的请求是同一个会话的一部分。最好是开发者L设想所 有的window客户端是一起参与同一个会话的?/p>
]]> Servlet2.3中文文档(W?,5? http://www.tkk7.com/zhuyan/articles/138193.html朱岩 朱岩 Mon, 20 Aug 2007 09:31:00 GMT http://www.tkk7.com/zhuyan/articles/138193.html http://www.tkk7.com/zhuyan/comments/138193.html http://www.tkk7.com/zhuyan/articles/138193.html#Feedback 0 http://www.tkk7.com/zhuyan/comments/commentRss/138193.html http://www.tkk7.com/zhuyan/services/trackbacks/138193.html W四?br>4 requeset request对象包含了客L的所有请求信息。在HTTP协议中,客户端发送到服务端的信息都包 含在h的HTTP 头和消息体中 4.1 HTTP 协议的参?br>客户端发送给servlet引擎的参数是包含在请求中的,引擎从客Lh的URI字符串中或POST数据中解 析出h的参数。参Cname-value的Ş式存储的。Q何一个name可以对应多个value。在 ServletRequest接口的方法中Q?br>getParameter getParameterNames getParameterValues getParameterValuesҎq回兌C个name上的一个String对象的数l。getParameterq回name?br>应的values数组中的W一个value。URI和POST体中的参数都会放入请求参数的set对象中。URI中的?br>C在POST体之前被引入Q如URI中的参数“a=hello”post体中的参数是a=goodbye&a=world,则参数set 中的内容是a=(hello,goodbye,world).以HTTP GETh的参数是不隐蔽的Q参数必通过 getRequestURI或getPathInfoҎ获得参数字串?br>4.1.1 参数什么时候有?br>在post form中的数据参数被放入参数set之前的情冉|q样的: 1Q请求是一个HTTP或一个HTTPS 2QHTTPҎ是POST 3Q内容的cd是application/x-www-form-urlencoded 4Q初始化q的servlet从request对象中调用getParameterҎQ或getParameterNamesQ?br>getParameterValuesQ?br>Post form 中的数据W合条g的就攑օ参数set中,不符合的放入request对象的输入流中?br>4.2 属?br>request的属性是一个对象,引擎可以把API不能表达的信息放入属性中Q一个servlet也可以设 |一个属性信息用于servlet之间的通信。request对象中的属性方法有Q?br>getAttribute getAttributeNames setAttribute 一个属性名U只能关联一个value。属性名?#8220;java.”?#8220;javax.”为前~的是规范保留的,cM ?#8220;sun.”“com.sun”是sun公司的保留字Q这些保留的前缀是不能用的。name使用l一?br>包命名规范名U?br>4.3 ?br>servlet通过HttpServletRequest接口的方法获得HTTP的包头信息,q些Ҏ是: getHeader getHeaders getHeaderNames getHeader Ҏq回头的名称。一个名U可以关联多个头信息Q如果在q种情况下,getHeader Ҏq回W一个头信息?br>getHeadersq回与一个名U关联的所有头信息存放在Enumeration对象中。HttpServletRequest 提供了一些提取头信息的类型{换方法,如: getIntHeader 把头信息中的数据转换成int型,如果转换p|会报NumberFormatException?br>误?br>getDateHeader 把头信息中日期的数据转换成date型,如果转换p|会报 IllealArgumentException错误 4.4 h路径 context路径Q这路径是和ServletContext对象兌的,在web服务中默认的上下文\径是I的?/p>
W串Q如果上下文路径不是web服务的根目录Q则路径?#8216;/’字符开始,但不能以‘/’l束?br>Servlet 路径Q与该请求匹配的servlet的\径。该路径?#8216;/’字符开_或以‘/*’开头但后面为空?br>丌Ӏ?br>路径信息Q是h路径的一部分Q但不是context路径的一部分Q也不是Servlet路径的一部分Q?br>它既不ؓnull也不是以‘/’开头的字符丌Ӏ?br>上一路径在HttpServletRequest接口中对应的Ҏ是: getContextPath getServletPath getPathInfo requestURI = contextPath + servletPath + pathInfo 上下文配|的例子Q?br>Conteext Path /catalog Servlet Mapping Pattern:/lawn/* Servlet:LawnServlet Servlet Mapping Pattern:/garden/* Servlet:GardenServlet Servlet Mapping Pattern:*.jsp Servlet:JSPServlet 观察下面的\?br>Request path path Elements /catalog/lawn/index.htm ContextPath:/catalog ServletPath:/lawn PathInfo:/index.html /catalog/garden/implements/ ContextPath:/catalog ServletPath:/garden PathInfo:/implements/ /catalog/help/feedback.jsp ContextPath:/catalog ServletPath:/help/feedback.jsp PathInfo:null 4.5 路径转换 在API中有两个单的Ҏ允许开发者获得文件系l的路径Q?br>ServletContext.getRealPath HttpServletRequet.getPathTranslated getRealPath(String aPath)Ҏq回本地文gpȝ的绝对\径。getPathTranslatedҎ计算 求pathInfo中的l对路径?br>以上的两个方法,servlet引擎不能辨认文g的\径是否有效,当web应用调用一个不定q程 文gpȝQ或数据库\径中的文件时Q会q回null 4.6 Cookies HttpServletRequest接口中提供了getCookiesҎq回h中的cookies数组Q在每次客户端请?br>时cookies数据׃客户端发送给服务。客Lq还的部分cookie信息是cookie的name和cookie 的value。当cookie被送入览器时Qcookie的其它信息就可以讄了?br>4.7 SSL 属?br>如果一个请求被转给一个安全的协议Q如HTTPSQ这些信息必L露给ServletRequest接口?br>isSecureҎ。web引擎必须把下面的信息暴露lservlet开发者: Attribute Attribute Name javaType Cipher suite javax.servlet.request.cipher_suite String bit size of the algo-rithm javax.servlet.request.key_size Integer 如果一个SSL证书伴随着一个请求,servlet引擎必须把它作ؓ一个数l对象暴露给servlet开?br>者,该数l中?br>java.security.cert.X509Certificate对象和放在ServletRequest属性中的javax.servlet.request. X509Certificate对象?br>数组排列的顺序是升序Q在链中的证书的序是客户端设|的序?br>4.8 国际?br>ServletRequest接口的方法中提供了的ҎQ?br>getLocale getLocales getLocaleҎ返回客L从中获得内容的首选的locale。要想知道更多的关于Accept- Language header 怎么解释客户端首选的语言的,L14.4?br>getLocalesҎq回一个Locale objects的Enumeration,从首选的locale开始递减?br>如果客户端没有制定首选的localeQservlet引擎一定要提供一个默认的locale供getLocaleҎq?br>回,getLocalesҎ必须包含一个默认的locale的locale element 4.9 Request 数据的编?br>有许多web览器不能发送一个编码的头内容,所以把~码留给解读HTTPh的Readd。对 于默认的h~码Q引擎通常创徏一个reader?#8220;ISO-8859-1”去解析POST的数据,如果客户?br>没有指明~码Q或者客L发送失败,getCharacterEncodingҎp回null?br>如果客户端没有设|编码,而请求需被另外一U编码,可用ServletRequest接口中的 setCharacterEncoding(String enc) Ҏ。必d解析post数据或读取请求流之前调用q些?br>法?br>4.10 Request对象的生命周?br>每个request对象仅在servlet的serviceҎ或filter中的doFilterҎ中有效,引擎重用request?br>象是Z降低创徏request对象的性能消耗?br>开发者必L楚request对象在给定的范围外的一些不定的行为?br> W五?br>response对象装着服务端送给客户端的信息Q从服务端传回的信息可以包含在请求的头和消息体重?br>5.1 ~存 servlet引擎支持应答~存Q典型的servlet会默认的执行~存Qservlet可以指定~存参数?br>讄~存信息的方法在ServletResponse接口中的Ҏ有: getBufferSize setBufferSize isCommitted Reset resetBuffer flushBuffer q些Ҏ只有在servlet调用ServletOutputStream 或Writer之前有效?br>getBufferSizeq回~存的大,如果没有~存Q该Ҏq回0?br>setBufferSize可以讄~存的大,但不是必ȝ。servlet会根据请求放|适当的缓存大。这?br>法必dservlet调用ServletOutputStream 或WriterҎ之前被调用。如果在之后调用׃抛出 IllegalStateException错误?br>isCommittedq回一个boolen|标志是否有Q何一个字节的数据被返回给客户端了。flushBuffer Ҏ强制把缓存中的信息写到客L?br>当response没有提交~存内容时调用resetҎ׃清除~存中的信息Q包括头信息和状态码?br>resetBufferҎ会清除缓存中的信息,但不会清除头和状态码。在commit之后调用reset?br>resetBuffer都会抛出IllegalStateException错误Q缓存中的内容不受媄响?br>使用~存Ӟ当缓存满时response必ȝd新把~存中的内容发送给客户端;只要W一个字?br>C客户端,commit的状态就为true?br>5.2 Headers servlet能够通过HttpServletResponse的一些方法设|HTTP响应的头信息Q这些方法有Q?br>setHeader addHeader setHeaderҎ会把l定的一个name-values攑ֈ头信息中Q头信息中只能有一个name-valuesQ后?br>setHeader会覆盖前面setHeaderҎ中的内容Q一个name可以有多个value?br>addHeaderҎ可以增加一个value到已有的name上,如果name不同׃新徏一个name-values 头可以包含一些信息,如日期或数字对象?br>以下的一些方法用适当的数据类型设|头信息Q?br>setIntHeader setDateHeader addIntHeader addDateHeader 在响应被发送到客户端之前,头信息是必须被设|的Q如果没有设|头信息Qservlet引擎不会发送该 h到客L。HTTP1.1规范没有规定必须讄响应的头信息。当E序员没有设|响应体的Content- TypeӞservlet引擎也不需要设|一个默认的cd?br>5.3 其他一些方?br>HttpServletResonse接口中还有其他的一些方法: sendRedirect sendError sendRedirectҎ设|合适的头和体信息,用于重定向客L到另一个URL。如果sendRedirect参数 是个相对路径Q则在底层servlet引擎中会把这相对路径转换成绝对\径返回给客户端的?br>如果相对路径不能被引擎{换成l对路径׃抛出IllegalArgumentException错误?br>sendErrorҎ会把一条错误信息作为头和体信息发送给客户端?br>如果在调用sendRedirect或sendError之前讄了头和体信息Q再调用sendRedirect或sendErrorӞ之前 的头和体中的数据信息都将没用Q不会被发送到客户端。如果用了~存Q在调用sendRedirect?br>sendErrorӞ之前的信息都被清除。如果在commit之后调用sendRedirect或sendError׃抛出 IllegalStateException错误?br>5.4 国际?br>当客L用一Ҏ的语aQ或客户端设|了语言Q发求时Qservlet会设|相应的响应语言信息Q?br>ServletResponse接口中设|响应语a的方法是setLocale。这个方法会讄一个合适的Content- Language到头信息中。最好是开发者在调用getWriterҎ之前调用setLocaleҎQ确保返回的 PrintWriter已经被设|好了语a信息。如果在调用setLocale之后又调用了setContentTypeQsetLocale?br>的内容将被setContentType中的字符集覆盖?br>response默认的编码方式是“ISO-8859-1”?br>5.5 response对象的关?br>当response被关闭时Q引擎必d新该response~存中的所有内容到客户端。关闭的序是: 1Q关闭servlet的serviceҎ 2Qresponse 中setContentLengthҎ讄的指定数量的信息被写入response 3Q调用sendErrorҎ 4Q调用sendRedirectҎ 5.6 response对象的生命周?br>每个response对象仅在servlet的serrviceҎ或filter的doFilter的方法中有效。引擎重复用reponse?br>象,是ؓ了降低创建response对象的开销。开发者必L意response对象在指定范围外可能出现的一?br>意外的行为?/p>
]]> Servlet2.3中文文档(W?,2,3? http://www.tkk7.com/zhuyan/articles/138192.html朱岩 朱岩 Mon, 20 Aug 2007 09:28:00 GMT http://www.tkk7.com/zhuyan/articles/138192.html http://www.tkk7.com/zhuyan/comments/138192.html http://www.tkk7.com/zhuyan/articles/138192.html#Feedback 0 http://www.tkk7.com/zhuyan/comments/commentRss/138192.html http://www.tkk7.com/zhuyan/services/trackbacks/138192.html W一?/strong> servlet2.3规范用到了一下的一些规范:J2EE、JSP1.1、JNDI ?4章中讲述了规范中的所有的classescL接口Q改文中不讲qͼ。对开发者而言以下的有些相关的 协议QURI、URL、HTTP/1.0、MIME、HTCPCP/1.0、XML 1.1 什么是servletQ?br>servlet是一个基于java技术的weblgQ该lg被容器管理,能被~译成字节码被web服务?br>用;容器也被UC为引擎,是支持servlet功能的web服务的扩展。servlet之间的通信是通过客户 端请求被引擎执行成request/response对象q行的?br>1.2 什么是servlet引擎Q?br>servlet引擎是web服务器或应用服务器的一部分Q服务器能够支持|络的请?响应Q基于请?br>解析MIMEQ基于响应格式化MIME。servlet引擎是一个servlet容器Q也掌管着servlet的生命周 期?br>所有的servlet引擎都必L持HTTP的请?响应模式Q但HTTPS的请?响应模式也是被支?br>的。HTTP的版本最要HTTP/1.0Q最好是HTTP/1.1。servlet引擎也具有安全和权限的一些特 性,q些Ҏ其服务器应提供?br>1.3 例子 一个典型的事g执行的顺序是Q?br>1) 客户端向web服务器发起一个HTTPh 2) HTTPh被web服务器接受,q移交给servlet引擎Qservlet引擎可以在主机的 同一个进E、不同的q程或其他的web服务L的进E中启动?br>3) servlet引擎Ҏservlet的配|档定调用的servletQƈ把request对象?br>response对象传给它?br>4) 4Qservlet通过request对象知道客户端的使用者是谁,客户的请求信息是什?br>和其他的一些信息。servlet处理完请求后把要q回的信息放入response对象q回?br>客户?br>5Q?一旦servlet完成了请求的处理Qservlet引擎׃hresponseQ把控制权返回给 web服务?/p>
1.4与其它技术的比较 与其它服务相比servlet有以下的一些优?br>1) q行速度上比CGI快,因ؓ使用了多U程 2) servlet使用了标准的apiQ可被许多web服务支持 3) 与系l无x,一ơ编译多ơ?br> W二?br> servlet接口是servlet api核心部分Q所有的servlet都是直接或间接的实现了这些接口。两个最?br>要的servlet api 接口是GenericServlete ?HttpServletQ更多的开发者都l承HttpServletd?br>他们的servlet 2.1 Request 包含的方?br>一个基本的servlet接口应该定义一个方法包含客L的信息,每次servlet引擎把一个request?br>送到一个servlet事例Q这个方法都要被调用?br>对于q发的请求,web应用需要设计者设计的servlet引擎能分配多个线E执行这个方法?br>2.1.1 HTTP h处理的方?br>HttpServlet是实CServlet接口的抽象类Q增加了一些新的方法,q些Ҏ在处理HTTPh?br>会被serviceҎ自动调用Q这些方法是Q?br>doGet 接受 HTTP 的GETh doPost 接受 HTTP 的POSTh doPut 接受 HTTP的PUTh doDelete 接受 HTTP的DELETEh doHead 接受 接受 HTTP的HEADh doOptions 接受 HTTP的OPTIONSh doTrace 接受 HTTP的TRACEh 一个开发者只会涉及到doGet和doPostҎQ其它的Ҏ是ؓ非常熟悉HTTP的设计师准备?/p>
2.1.2 HTTP/1.0只定义了doGetQdoHeadQdoPostҎQ没有定义PUTQDELETEQOPTIOONS?br>TRACEҎ 2.1.3 HttpServlet接口定义了getLastModifiedҎ 2.2 实例?br>2.2.1 在分布式环境中servlet引擎为每个servlet只能声明一个实例,当一个servlet实现?br>SingleThreadModel接口Ӟservlet引擎可以声明多个实例d理请求,servlet在应用服务的?br>|描qC定义发布. 2.2.2单线Eservlet SingleThreadModel接口保证了在同一时刻一个servlet实例的serviceҎ只会被一个线E执行?br>q对于每个请求发送给每个实例是很重要的。引擎可以从对象池中选择Q对象池可以在同一?br>M持多个实例,如HttpSession可以被多个servlet在Q何时候调用包括实C SingleThreadModel接口的servlet 2.3 servlet的生命周?br>一个好的生命周期的定义应该是servlet怎么被引入了Q怎么实例化的Q怎么初始化的Q当h从客 L来的时候,是怎么从服务器中取出来的,q些在javax.servlet.Servlet的接口的initQserviceQ?br>destroyҎ中都有明的定义?br>所有的servlet都必d现GenericServlet或HttpServlet抽象c?br>2.3.1 servlet的引入和实例?br>servlet引擎会可靠的引入和实例化servletQ当servlet引擎被启动时servletp引入和实例化了, 或者当一个servlet被请求时被引擎引入和实例化?br>servlet引擎启动Ӟ需要装载的c通过java的装载类q行装蝲Q被装蝲的类可以在本地文件系 l、远E文件系l或|络服务中。在装蝲完后Q引擎就实例化它们?br>2.3.2 初始?br>在servlet对象实例化后Q引擎必dq个servlet接受客户D请求之前初始化Q在初始化中 servlet可以d固定的配|信息,一些昂늚资源如数据库q接和一ơ性激zȝ资源Q引擎?br>q调用servlet接口的initҎ初始化。每个serlet对象都实CServlet接口和ServletConfig接口, ServletConfig接口允许servlet接受web应用配置档中配置的参敎ͼq向servlet中传入了一个描q?br>servleltq行环境的类QServletContextQ?br>2.3.2.1 在初始化时发生错?br>在初始化q程中,servlet实例能抛出UnavailableException 或ServletException异常。在q样?br>情况下servlet不能被放入服务中Q必被引擎释放QdestroyҎ没有被调用。在初始化失败后 引擎可以在UnavailableException异常规定的最短无效时间后实例化新的一个实例,再初始化?br>2.3.3 request 当servlet初始化完成后Q引擎可以用它d理客L的请求了。请求被装在Servletrequest cd的对象中Q响应信息被装在ServletResponsecd的对象中Q这两个对象以参数的形式?br>lServlet接口中的serviceҎ?br>2.3.3.1 多线E问?br>servlet引擎可以发送ƈ发的hlservlet的serviceҎQservlet开发者必L供够的U程?br>q行serviceҎ?br>对开发者来说一个可以选择的方法是实现SingleThreadModel接口Q以保在同一时刻只有一?br>h在serviceҎ中。一个引擎要保h能够在servlet中持l化Q或l持在一个servlet实例 池中Q如果servlet是web应用服务的一部分Q引擎可以在一个虚拟机中拥有一个servlet实例化的 池?br>对于没有实现SingleThreadModel接口的servletQ如果serviceҎQ或 doGetQdoPostQ被声明 为synchronizedQ引擎将不能用实例池的途径Q而必Ll化hQ强力徏议开发者不能声?br>synchronize serviceҎQ这样会严重影响pȝ的性能?br>2.3.3.2 request中的异常 在处理请求时servlet可以抛出ServletException或UnavailableException异常Q一?br>ServletException异常会在处理一个请求出现错误时抛出Q引擎将清除q个异常。当servlet一?br>或永久地不能获得一个请求时׃抛出UnavailableException异常,如果是一个永久性异常时引擎 调用它的destroyҎ从服务器中消除servlet实例Q如果是暂时性异常时引擎在异常期间不?br>送请求给servlet。如果返回SERVICE_UNAVAILABLE(503)响应Q在q期间引擎将不接受Q何请 求,直到header中出现Retry-After。引擎可以不区分怹性还是暂时性的异常把所有的 UnavailableException作ؓ怹性处理?br>2.3.3.3 U程安全 执行request和response对象不能保证是线E安全的Q意思是说他们只能在h的线E中使用Q?br>不能被其它线E中的对象用?br>2.3.4 l尾 servlet实例可能被引擎保存几毫秒或和引擎一L生命旉或在q两者之间。当引擎军_l束 一个servletӞ调用它的destroyҎQ在destroy中释放Q何长久固定的资源?br>在引擎调用desroyҎ之前Q必M证运行在serviceҎ中的U程都完成处理,或者超q了?br>务定义的执行旉?br>一旦servlet实例的destroyҎ被调用,引擎不在发送Q何请求给q个实例。如果引擎再ơ?br>q个servlet必dZ个这个servlet的实例?br>在destroyҎ执行完成后,引擎释放这个servlet实例Q于是就W合垃圾回收机制的条件了?br> W三?/strong> 3.1 介绍ServletContext接口 ServletContext接口定义了servletq行环境的信息。引擎提供商有义务在servlet引擎中提供一?br>实现了ServletContext接口的对象。通过q个对象servlet能够获得log事gQ资源的URLQ设|或 存储servlet之间通信的变量。ServletContext在web服务中确定了一个所有请求开始的路径Q是 ServletContext的上下文路径?br>3.2 ServletContext 接口的作用范?br>每个web应用配置到容器中都会产生一个实CServvletContext接口的实例。如果是分布?br>的,会在每个java虚拟Z产生一个ServletContext实例。容器中默认固有的web应用Q不?br>发布上来的web应用Q有一个默认的ServletContextQ在分布式中q个默认的ServletContext只存 在于一个虚拟机中,是不可分配的?br>3.3 初始化参?br>ServletContext接口的getInitParameter,getInitParameterNamesҎ接受部v描述文g中的初始 化参敎ͼq些参数可以是的安装信息Q或|站理员的mail或名字或对系l的评论?br>3.4 上下文属?br>servlet可以通过一个名U把对象邦定到servletContext中,帮定到ServletContext中的对象都能?br>同一个web服务中的其它对象引用。ServletContext中的属性方法有Q?br>setAttribute getAttribute getAttributeNames removeAttribute 3.4.1 在分布式pȝ?上下文的属?br>上下文属性是在本地的虚拟Z保存的,q防止了ServletContext属性存在于分布式的内存中?br>当信息需要在一个分布式环境中共享的时候,信息应该被放在session中,或存在数据库中,?br>存在一个实体bean中?br>3.5 资源 ServletContext接口提供了获取web服务中的静态资源的ҎQ?br>getResource getResourceAsStream q些Ҏ以一?#8220;/”作ؓ上下文的根目录,后跟着资源路径的\径ؓ参数。这些资源可以在本地 服务pȝ中也可以在另个web应用中,或在一个远E的文gpȝ中?br>q些Ҏ不能用于去获得一个动态的资源Q如要调用一个jsp面QgetResource("/index.jsp")?br>q回index.jsp的原代码Q不能web昄index.jsp?br>要获得资源列表可以用getResourcePaths(String path)Ҏ 3.6 多主??Servlet 上下?br>web服务中可能在一个IP上有多个逻辑L的情c在q种情况下每个逻辑L必须有自己单 独的servlet上下文,或者设|多个servlet 上下文,但在逻辑L中不能共享这些servlet 上下 文,一个主机只能单独用一个?br>3.7 引擎提供c重新装载机制是必须的,必须认应用中所有的cd接口都可以在单类装蝲器中 装蝲Q在sessionl定监听事g中引擎会l止正在装在的类。以前版本的装蝲器,引擎创徏一 个新的装载器装蝲一个servlet或class和类装蝲器装载其他的servlet或类截然不同Q这可能?br>载一个未知的cL对象Q生不可预知的行ؓ。这是新的类装蝲器中是应该注意预防的?br>题?br>3.7.1 临时工作目录 Servlet 上下文需要一个时存储的目录。servlet引擎必须为每个servlet 上下文提供一个私有 时目录,通过javax.servlet.context.tempdir的context属性目录有效。与该属性关联的对象?br>Ljava.io.Filecd?br>在许多servlet引擎实现中提供请求可以识别的通用的机制?br>当servlet引擎重v始不必维护时目录中的内容,但要保临时目录中的该上下文内容对于q?br>行在该servlet引擎中的其它web应用中的servlet 上下文是不可见的?
]]>
关于web.xml配置的详l说?/title> http://www.tkk7.com/zhuyan/articles/106763.html朱岩 朱岩 Tue, 27 Mar 2007 13:08:00 GMT http://www.tkk7.com/zhuyan/articles/106763.html http://www.tkk7.com/zhuyan/comments/106763.html http://www.tkk7.com/zhuyan/articles/106763.html#Feedback 0 http://www.tkk7.com/zhuyan/comments/commentRss/106763.html http://www.tkk7.com/zhuyan/services/trackbacks/106763.html 1 定义头和根元?br> 部v描述W文件就像所有XML文g一P必须以一个XML头开始。这个头声明可以使用的XML版本q给出文件的字符~码?br>DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本(?.2?.3Qƈ指定理此文件其余部分内容的语法的DTD(Document Type DefinitionQ文档类型定??br>所有部|描q符文g的顶层(根)元素为web-app。请注意QXML元素不像HTMLQ他们是大小写敏感的。因此,web-App和WEB-APP都是不合法的Qweb-app必须用小写?br> 2 部v描述W文件内的元素次?br> XML 元素不仅是大写敏感的,而且它们q对出现在其他元素中的次序敏感。例如,XML头必L文g中的W一,DOCTYPE声明必须是第二项Q而web- app元素必须是第三项。在web-app元素内,元素的次序也很重要。服务器不一定强制要求这U次序,但它们允许(实际上有些服务器是q样做的Q完全拒l执行含有次序不正确的元素的Web应用。这表示使用非标准元素次序的web.xml文g是不可移植的?br>下面的列表给Z所有可直接出现在web-app元素内的合法元素所必需的次序。例如,此列表说明servlet元素必须出现在所有servlet-mapping元素之前。请注意Q所有这些元素都是可选的。因此,可以省略掉某一元素Q但不能把它放于不正的位置?br>l icon icon元素指出IDE和GUI工具用来表示Web应用的一个和两个囑փ文g的位|?br>l display-name display-name元素提供GUI工具可能会用来标记这个特定的Web应用的一个名U?br>l description description元素l出与此有关的说明性文本?br>l context-param context-param元素声明应用范围内的初始化参数?br>l filter qo器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联?br>l filter-mapping 一旦命名了一个过滤器Q就要利用filter-mapping元素把它与一个或多个servlet或JSP面相关联?br>l listener servlet API的版?.3增加了对事g监听E序的支持,事g监听E序在徏立、修改和删除会话或servlet环境时得到通知。Listener元素指出事g监听E序cR?br>l servlet 在向servlet或JSP面制定初始化参数或定制URLӞ必须首先命名servlet或JSP面。Servlet元素是用来完成此项d的?br>l servlet-mapping 服务器一般ؓservlet提供一个缺省的URLQhttp://host/webAppPrefix/servlet/ServletName。但是,常常会更改这个URLQ以便servlet可以讉K初始化参数或更容易地处理相对URL。在更改~省URLӞ使用servlet-mapping元素?br>l session -config 如果某个会话在一定时间内未被讉KQ服务器可以抛弃它以节省内存。可通过使用HttpSession?setMaxInactiveIntervalҎ明确讄单个会话对象的超时|或者可利用session-config元素制定~省时倹{?br>l mime-mapping 如果Web应用h惛_Ҏ的文Ӟ希望能保证给他们分配特定的MIMEcdQ则mime-mapping元素提供q种保证?br>l welcom-file-list welcome-file-list元素指示服务器在收到引用一个目录名而不是文件名的URLӞ使用哪个文g?br>l error-page error-page元素使得在返回特定HTTP状态代码时Q或者特定类型的异常被抛出时Q能够制定将要显C的面?br>l taglib taglib元素Ҏ记库描述W文ӞTag Libraryu Descriptor fileQ指定别名。此功能使你能够更改TLD文g的位|,而不用编辑用这些文件的JSP面?br>l resource-env-ref resource-env-ref元素声明与资源相关的一个管理对象?br>l resource-ref resource-ref元素声明一个资源工厂用的外部资源?br>l security-constraint security-constraint元素制定应该保护的URL。它与login-config元素联合使用 l login-config 用login-config元素来指定服务器应该怎样l试图访问受保护面的用h权。它与sercurity-constraint元素联合使用?br>l security-role security-role元素l出安全角色的一个列表,q些角色出现在servlet元素内的security-role-ref元素的role-name子元素中。分别地声明角色可高IDE处理安全信息更ؓҎ?br>l env-entry env-entry元素声明Web应用的环境项?br>l ejb-ref ejb-ref元素声明一个EJB的主目录的引用?br>l ejb-local-ref ejb-local-ref元素声明一个EJB的本C目录的应用?br> 3 分配名称和定制的UL 在web.xml中完成的一个最常见的Q务是对servlet或JSP面l出名称和定制的URL。用servlet元素分配名称Q用servlet-mapping元素定制的URL与刚分配的名U相兌?br>3.1 分配名称 Z提供初始化参敎ͼ对servlet或JSP面定义一个定制URL或分配一个安全角Ԍ必须首先lservlet或JSP面一个名U。可通过 servlet元素分配一个名U。最常见的格式包括servlet-name和servlet-class子元素(在web-app元素内)Q如下所C: <servlet> <servlet-name>Test</servlet-name> <servlet-class>moreservlets.TestServlet</servlet-class> </servlet> q表CZ于WEB-INF/classes/moreservlets/TestServlet的servlet已经得到了注册名Test。给 servlet一个名U具有两个主要的含义。首先,初始化参数、定制的URL模式以及其他定制通过此注册名而不是类名引用此servlet。其?可在 URL而不是类名中使用此名U。因此,利用刚才l出的定义,URL http://host/webAppPrefix/servlet/Test 可用?http://host/webAppPrefix/servlet/moreservlets.TestServlet 的场所?br>误住:XML元素不仅是大写敏感的,而且定义它们的次序也很重要。例如,web-app元素内所有servlet元素必须位于所有servlet- mapping元素Q下一节介绍Q之前,而且q要位于5.6节和5.11节讨论的与过滤器或文档相关的元素Q如果有的话Q之前。类似地Q?servlet 的servlet-name子元素也必须出现在servlet-class之前?.2?部v描述W文件内的元素次?详l介l这U必需的次序?br>例如Q程序清?-1l出了一个名为TestServlet的简单servletQ它ȝ在moreservletsE序包中。因为此servlet是扎根在一个名为deployDemo的目录中的Web应用的组成部分,所以TestServlet.class攑֜ deployDemo/WEB- INF/classes/moreservlets中。程序清?-2l出放|在deployDemo/WEB- INF/内的web.xml文g的一部分。此web.xml文g使用servlet-name和servlet-class元素名UTest?TestServlet.class相关联。图 5-1和图5-2分别昄利用~省URL和注册名调用TestServlet时的l果?br> E序清单5-1 TestServlet.java package moreservlets; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; /** Simple servlet used to illustrate servlet naming * and custom URLs. *
* Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * © 2002 Marty Hall; may be freely used or adapted. */ public class TestServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String uri = request.getRequestURI(); out.println(ServletUtilities.headWithTitle("Test Servlet") + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "
URI: " + uri + "
\n" + "</BODY></HTML>"); } } E序清单5-2 web.xmlQ说明servlet名称的摘录) <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <!-- … --> <servlet> <servlet-name>Test</servlet-name> <servlet-class>moreservlets.TestServlet</servlet-class> </servlet> <!-- … --> </web-app> 3.2 定义定制的URL 大多数服务器h一个缺省的serlvet URLQ?br>http: //host/webAppPrefix/servlet/packageName.ServletName。虽然在开发中使用q个URL很方便,但是我们常常会希望另一个URL用于部v。例如,可能会需要一个出现在Web应用层的URLQ如Qhttp: //host/webAppPrefix/AnynameQ,q且在此URL中没有servletV位于顶层的URL化了相对URL的用。此外,对许多开发h员来_层URL看上L更长更麻烦的~省URL更简短?br>事实上,有时需要用定制的URL。比如,你可能想关闭~省URL映射Q以便更好地强制实施安全限制或防止用h外地讉K无初始化参数的servlet。如果你止了缺省的URLQ那么你怎样讉Kservlet呢?q时只有使用定制的URL了?br>Z分配一个定制的URLQ可使用servlet-mapping元素及其servlet-name和url-pattern子元素。Servlet- name元素提供了一个Q意名Uͼ可利用此名称引用相应的servletQurl-pattern描述了相对于Web应用的根目录的URL。url- pattern元素的值必M斜杠Q?Qv始?br>下面l出一个简单的web.xml摘录Q它允许使用URL <HTML> <HEAD> </HEAD> <BODY BGCOLOR="#FDF5E6">
URI: <%= request.getRequestURI() %>
</BODY> </HTML> E序清单5-4 web.xmlQ说明JSP命名的摘录Q?br><?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <!-- ... --> <servlet> <servlet-name>PageName</servlet-name> <jsp-file>/TestPage.jsp</jsp-file> </servlet> <!-- ... --> <servlet-mapping> <servlet-name> PageName </servlet-name> <url-pattern>/UrlTest2/*</url-pattern> </servlet-mapping> <!-- ... --> </web-app> 4 止Ȁzdservlet 对servlet 或JSP面建立定制URL的一个原因是Q这样做可以注册?initQservletQ或jspInitQJSP面Q方法中d得初始化参数。但是,初始化参数只在是利用定制URL模式或注册名讉K servlet或JSP面时可以用,用缺省URL http: //host/webAppPrefix/servlet/ServletName 讉K时不能用。因此,你可能会希望关闭~省URLQ这样就不会有h意外地调用初始化servlet了。这个过E有时称为禁止激zdservletQ因为多数服务器h一个用~省的servlet URL注册的标?servletQƈȀzȝ省的URL应用的实际servlet?br>有两U禁止此~省URL的主要方法: l 在每个Web应用中重新映?servlet/模式?br>l 全局关闭Ȁzdservlet?br>重要的是应该注意刎ͼ虽然重新映射每个Web应用中的/servlet/模式比彻底禁止激zservlet所做的工作更多Q但重新映射可以用一U完全可UL的方式来完成。相反,全局止Ȁzdservlet完全是针对具体机器的Q事实上有的服务器(如ServletExecQ没有这L选择。下面的讨论Ҏ个Web应用重新映射/servlet/ URL模式的策略。后面提供在Tomcat中全局止Ȁzdservlet的详l内宏V?br>4.1 重新映射/servlet/URL模式 在一个特定的Web应用中禁止以http://host/webAppPrefix/servlet/ 开始的URL的处理非常简单。所需做的事情是建立一个错误消息servletQƈ使用前一节讨论的url-pattern元素所有匹配请求{向该 servlet。只要简单地使用Q?br><url-pattern>/servlet/*</url-pattern> 作ؓservlet-mapping元素中的模式卛_?br>例如Q程序清?-5l出了将SorryServlet servletQ程序清?-6Q与所有以http://host/webAppPrefix/servlet/ 开头的URL相关联的部v描述W文件的一部分?br> E序清单5-5 web.xmlQ说明JSP命名的摘录Q?br><?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <!-- ... --> <servlet> <servlet-name>Sorry</servlet-name> <servlet-class>moreservlets.SorryServlet</servlet-class> </servlet> <!-- ... --> <servlet-mapping> <servlet-name> Sorry </servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping> <!-- ... --> </web-app> E序清单5-6 SorryServlet.java package moreservlets; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; /** Simple servlet used to give error messages to * users who try to access default servlet URLs * (i.e., http://host/webAppPrefix/servlet/ServletName) * in Web applications that have disabled this * behavior. *
* Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * © 2002 Marty Hall; may be freely used or adapted. */ public class SorryServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Invoker Servlet Disabled."; out.println(ServletUtilities.headWithTitle(title) + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "
" + title + "
\n" + "Sorry, access to servlets by means of\n" + "URLs that begin with\n" + "http://host/webAppPrefix/servlet/\n" + "has been disabled.\n" + "</BODY></HTML>"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } 4.2 全局止ȀzdQTomcat Tomcat 4中用来关闭缺省URL的方法与Tomcat 3中所用的很不相同。下面介l这两种ҎQ?br>1Q禁止激zdQ?Tomcat 4 Tomcat 4 用与前面相同的方法关闭激zdservletQ即利用web.xml中的url-mapping元素q行关闭。不同之处在于Tomcat使用了放?install_dir/conf中的一个服务器专用的全局web.xml文gQ而前面用的是存攑֜每个Web应用的WEB-INF目录中的标准 web.xml文g?br>因此Qؓ了在Tomcat 4中关闭激zdservletQ只需在install_dir/conf/web.xml中简单地注释?servlet/* URL映射即可,如下所C: <!-- <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping> --> 再次提醒Q应该注意这个项是位于存攑֜install_dir/conf的Tomcat专用的web.xml文g中的Q此文g不是存放在每个Web应用的WEB-INF目录中的标准web.xml?br>2Q禁止激zdQTomcat3 在Apache Tomcat 的版?中,通过在install_dir/conf/server.xml中注释出InvokerInterceptor全局止~省 servlet URL。例如,下面是禁止用缺省servlet URL的server.xml文g的一部分?br><!-- <RequsetInterceptor className="org.apache.tomcat.request.InvokerInterceptor" debug="0" prefix="/servlet/" /> --> 5 初始化和预装载servlet与JSP面 q里讨论控制servlet和JSP面的启动行为的Ҏ。特别是Q说明了怎样分配初始化参C及怎样更改服务器生存期中装载servlet和JSP面的时刅R?br>5.1 分配servlet初始化参?br>利用init-param元素向servlet提供初始化参敎ͼinit-param元素hparam-name和param-value子元素。例如,在下面的例子中,如果initServlet servlet是利用它的注册名QInitTestQ访问的Q它能够从其方法中调用 getServletConfig(). getInitParameter("param1")获得"Value 1"Q调?getServletConfig().getInitParameter("param2")获得"2"?br><servlet> <servlet-name>InitTest</servlet-name> <servlet-class>moreservlets.InitServlet</servlet-class> <init-param> <param-name>param1</param-name> <param-value>value1</param-value> </init-param> <init-param> <param-name>param2</param-name> <param-value>2</param-value> </init-param> </servlet> 在涉及初始化参数Ӟ有几炚w要注意: l q回倹{GetInitParameter的返回值L一个String。因此,在前一个例子中Q可对param2使用Integer.parseInt获得一个int?br>l JSP中的初始化。JSP面使用jspInit而不是init。JSP面q需要用jsp-file元素代替servlet-class?br>l ~省URL。初始化参数只在通过它们的注册名或与它们注册名相关的定制URL模式讉KServlet时可以用。因此,在这个例子中Qparam1?param2初始化参数将能够在用URL http://host/webAppPrefix/servlet/InitTest 时可用,但在使用 URL http://host/webAppPrefix/servlet/myPackage.InitServlet 时不能用?br>例如Q程序清?-7l出一个名为InitServlet的简单servletQ它使用initҎ讄firstName和emailAddress字段。程序清?-8l出分配名称InitTestlservlet的web.xml文g?br>E序清单5-7 InitServlet.java package moreservlets; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; /** Simple servlet used to illustrate servlet * initialization parameters. *
* Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * © 2002 Marty Hall; may be freely used or adapted. */ public class InitServlet extends HttpServlet { private String firstName, emailAddress; public void init() { ServletConfig config = getServletConfig(); firstName = config.getInitParameter("firstName"); emailAddress = config.getInitParameter("emailAddress"); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String uri = request.getRequestURI(); out.println(ServletUtilities.headWithTitle("Init Servlet") + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "
Init Parameters:
\n" + "
\n" + "
First name: " + firstName + "\n" + "
Email address: " + emailAddress + "\n" + "
\n" + "</BODY></HTML>"); } } E序清单5-8 web.xmlQ说明初始化参数的摘录) <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <!-- ... --> <servlet> <servlet-name>InitTest</servlet-name> <servlet-class>moreservlets.InitServlet</servlet-class> <init-param> <param-name>firstName</param-name> <param-value>Larry</param-value> </init-param> <init-param> <param-name>emailAddress</param-name> <param-value>Ellison@Microsoft.com</param-value> </init-param> </servlet> <!-- ... --> </web-app> 5.2 分配JSP初始化参?br>lJSP面提供初始化参数在三个斚w不同于给servlet提供初始化参数?br>1Q用jsp-file而不是servlet-class。因此,WEB-INF/web.xml文g的servlet元素如下所C: <servlet> <servlet-name>PageName</servlet-name> <jsp-file>/RealPage.jsp</jsp-file> <init-param> <param-name>...</param-name> <param-value>...</param-value> </init-param> ... </servlet> 2) 几乎L分配一个明的URL模式。对servletQ一般相应地使用以http://host/webAppPrefix/servlet/ 开始的~省URL。只需CQ用注册名而不是原名称卛_。这对于JSP面在技术上也是合法的。例如,在上面给出的例子中,可用URL http: //host/webAppPrefix/servlet/PageName 讉KRealPage.jsp的对初始化参数具有访问权的版本。但在用?JSP面Ӟ许多用户g不喜Ƣ应用常规的servlet的URL。此外,如果 JSP面位于服务器ؓ其提供了目录清单的目录中Q如Q一个既没有 index.html也没有index.jsp文g的目录)Q则用户可能会连接到?JSP面Q单dQ从而意外地ȀzL初始化的面。因此,好的办法是用url-patternQ?.3节)JSP面的原URL与注册的 servlet名相兌。这P客户机可使用JSP面的普通名Uͼ但仍然激zd制的版本。例如,l定来自目1的servlet定义Q可使用下面?servlet-mapping定义Q?br><servlet-mapping> <servlet-name>PageName</servlet-name> <url-pattern>/RealPage.jsp</url-pattern> </servlet-mapping> 3QJSP用jspInit而不是init。自动从JSP面建立的servlet或许已经使用了intiҎ。因此,使用JSP声明提供一个initҎ是不合法的,必须制定jspInitҎ?br>Z说明初始化JSP面的过E,E序清单5-9l出了一个名为InitPage.jsp的JSP面Q它包含一个jspInitҎ且放|于 deployDemo Web应用层次l构的顶层。一般,http://host/deployDemo/InitPage.jsp 形式的URL激zL面的不h初始化参数访问权的版本,从而将对firstName和emailAddress变量昄null。但是, web.xml文gQ程序清?-10Q分配了一个注册名Q然后将该注册名与URL模式/InitPage.jsp相关联?br> E序清单5-9 InitPage.jsp <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD></HEAD> <BODY BGCOLOR="#FDF5E6">
Init Parameters:
First name: <%= firstName %>
Email address: <%= emailAddress %>
</BODY></HTML> <%! private String firstName, emailAddress; public void jspInit() { ServletConfig config = getServletConfig(); firstName = config.getInitParameter("firstName"); emailAddress = config.getInitParameter("emailAddress"); } %> E序清单5-10 web.xmlQ说明JSP面的init参数的摘录) <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <!-- ... --> <servlet> <servlet-name>InitPage</servlet-name> <jsp-file>/InitPage.jsp</jsp-file> <init-param> <param-name>firstName</param-name> <param-value>Bill</param-value> </init-param> <init-param> <param-name>emailAddress</param-name> <param-value>gates@oracle.com</param-value> </init-param> </servlet> <!-- ... --> <servlet-mapping> <servlet-name> InitPage</servlet-name> <url-pattern>/InitPage.jsp</url-pattern> </servlet-mapping> <!-- ... --> </web-app> 5.3 提供应用范围内的初始化参?br>一般,对单个地servlet或JSP面分配初始化参数。指定的servlet或JSP面利用ServletConfig?getInitParameterҎdq些参数。但是,在某些情形下Q希望提供可׃Q意servlet或JSP面借助ServletContext 的getInitParameterҎd的系l范围内的初始化参数?br>可利用context-param元素声明q些pȝ范围内的初始化倹{context-param元素应该包含param-name、param-value以及可选的description子元素,如下所C: <context-param> <param-name>support-email</param-name> <param-value>blackhole@mycompany.com</param-value> </context-param> 可回忆一下,Z保证可移植性,web.xml内的元素必须以正的ơ序声明。但q里应该注意Qcontext-param元素必须出现L与文档有关的元素Qicon、display-name或descriptionQ之后及filter、filter-mapping、listener?servlet元素之前?br>5.4 在服务器启动时装载servlet 假如servlet或JSP面有一个要花很长时间执行的 init QservletQ或jspInitQJSPQ方法。例如,假如init或jspInitҎ从某个数据库或ResourceBundle查找产量。这U情况下Q在W一个客hh时装载servlet的缺省行为将对第一个客h产生较长旉的gq。因此,可利用servlet的load-on - startup元素规定服务器在W一ơ启动时装蝲servlet。下面是一个例子?br><servlet> <servlet-name> … </servlet-name> <servlet-class> … </servlet-class> <!-- Or jsp-file --> <load-on-startup/> </servlet> 可以为此元素体提供一个整数而不是用一个空的load-on-startup。想法是服务器应该在装蝲较大数目的servlet或JSP面之前装蝲较少数目的servlet或JSP面。例如,下面的servlet(攄在Web应用的WEB-INF目录下的web.xml文g中的web-app元素内)指C服务器首先装蝲和初始化SearchServletQ然后装载和初始化由位于Web应用的result目录中的index.jsp文g产生?servlet?br><servlet> <servlet-name>Search</servlet-name> <servlet-class>myPackage.SearchServlet</servlet-class> <!-- Or jsp-file --> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>Results</servlet-name> <servlet-class>/results/index.jsp</servlet-class> <!-- Or jsp-file --> <load-on-startup>2</load-on-startup> </servlet> 6 声明qo?br> servlet版本2.3引入了过滤器的概c虽然所有支持servlet API版本2.3的服务器都支持过滤器Q但Z使用与过滤器有关的元素,必须在web.xml中用版?.3的DTD?br>qo器可截取和修改进入一个servlet或JSP面的请求或从一个servlet或JSP面发出的相应。在执行一个servlet或JSP面之前Q必L行第一个相关的qo器的doFilterҎ。在该过滤器对其FilterChain对象调用doFilterӞ执行链中的下一个过滤器。如果没有其他过滤器Qservlet或JSP面被执行。过滤器h对到来的ServletRequest对象的全部访问权Q因此,它们可以查看客户机名、查扑ֈ来的cookie{。ؓ了访问servlet或JSP面的输出,qo器可响应对象包裹在一个替w对象(stand-in objectQ中Q比方说把输出篏加到一个缓冲区。在调用FilterChain对象的doFilterҎ之后Q过滤器可检查缓冲区Q如有必要,对它进行修改,然后传送到客户机?br>例如Q程序清?-11帝国难以了一个简单的qo器,只要讉K相关的servlet或JSP面Q它截取请求ƈ在标准输Z打印一个报告(开发过E中在桌面系l上q行Ӟ大多数服务器都可以用这个过滤器Q?br> E序清单5-11 ReportFilter.java package moreservlets; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; /** Simple filter that prints a report on the standard output * whenever the associated servlet or JSP page is accessed. *
* Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * © 2002 Marty Hall; may be freely used or adapted. */ public class ReportFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { HttpServletRequest req = (HttpServletRequest)request; System.out.println(req.getRemoteHost() + " tried to access " + req.getRequestURL() + " on " + new Date() + "."); chain.doFilter(request,response); } public void init(FilterConfig config) throws ServletException { } public void destroy() {} } 一旦徏立了一个过滤器Q可以在web.xml中利用filter元素以及filter-nameQQ意名Uͼ、file-classQ完全限定的cdQ和Q可选的Qinit-params子元素声明它。请注意Q元素在web.xml的web-app元素中出现的ơ序不是L的;允许服务器(但不是必需的)强制所需的次序,q且实际中有些服务器也是q样做的。但q里要注意,所有filter元素必须出现在Q意filter-mapping元素之前Q?filter-mapping元素又必d现在所有servlet或servlet-mapping元素之前?br>例如Q给定上q的ReportFilterc,可在web.xml中作Z面的filter声明。它把名UReporter与实际的cReportFilterQ位于moreservletsE序包中Q相兌?br><filter> <filter-name>Reporter</filter-name> <filter-class>moresevlets.ReportFilter</filter-class> </filter> 一旦命名了一个过滤器Q可利用filter-mapping元素把它与一个或多个servlet或JSP面相关联。关于此工作有两种选择?br>首先Q可使用filter-name和servlet-name子元素把此过滤器与一个特定的servlet名(此servlet名必ȝ后在相同?web.xml文g中用servlet元素声明Q关联。例如,下面的程序片断指C系l只要利用一个定制的URL讉K名ؓ SomeServletName 的servlet或JSP面Q就q行名ؓReporter的过滤器?br><filter-mapping> <filter-name>Reporter</filter-name> <servlet-name>SomeServletName</servlet-name> </filter-mapping> 其次Q可利用filter-name和url-pattern子元素将qo器与一lservlet、JSP面或静态内容相兌。例如,盔R的程序片D|C系l只要访问Web应用中的LURLQ就q行名ؓReporter的过滤器?br><filter-mapping> <filter-name>Reporter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 例如Q程序清?-12l出了将ReportFilterqo器与名ؓPageName的servlet相关联的web.xml文g的一部分。名?PageName依次又与一个名为TestPage.jsp的JSP面以及以模式http: //host/webAppPrefix/UrlTest2/ 开头的URL相关联。TestPage.jsp的源代码已经JSP面命名的谈论在前面??分配名称和定制的URL"中给出。事实上Q程序清?- 12中的servlet和servlet-name从该节原封不动地拿q来的。给定这些web.xml,可看C面的标准输出形式的调试报告(换行是ؓ了容易阅读)?br>audit.irs.gov tried to access http://mycompany.com/deployDemo/UrlTest2/business/tax-plan.html on Tue Dec 25 13:12:29 EDT 2001. E序清单5-12 Web.xmlQ说明filter用法的摘录) <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <filter> <filter-name>Reporter</filter-name> <filter-class>moresevlets.ReportFilter</filter-class> </filter> <!-- ... --> <filter-mapping> <filter-name>Reporter</filter-name> <servlet-name>PageName</servlet-name> </filter-mapping> <!-- ... --> <servlet> <servlet-name>PageName</servlet-name> <jsp-file>/RealPage.jsp</jsp-file> </servlet> <!-- ... --> <servlet-mapping> <servlet-name> PageName </servlet-name> <url-pattern>/UrlTest2/*</url-pattern> </servlet-mapping> <!-- ... --> </web-app> 7 指定Ƣ迎?br> 假如用户提供了一个像http: //host/webAppPrefix/directoryName/ q样的包含一个目录名但没有包含文件名?URLQ会发生什么事情呢Q用戯得到一个目录表Q一个错误?q是标准文g的内容?如果得到标准文g内容Q是 index.html?index.jsp、default.html、default.htm或别的什么东西呢Q?br>Welcome-file-list 元素及其辅助?welcome-file元素解决了这个模p的问题。例如,下面的web.xmlҎ出,如果一个URLl出一个目录名但未l出文g名,服务器应该首先试用index.jspQ然后再试用index.html。如果两者都没有扑ֈQ则l果有赖于所用的服务器(如一个目录列表)?br><welcome-file-list> <welcome-file>index.jsp</welcome-file> <welcome-file>index.html</welcome-file> </welcome-file-list> 虽然许多服务器缺省遵循这U行为,但不一定必这栗因此,明确C用welcom-file-list保证可移植性是一U良好的习惯?br> 8 指定处理错误的页?br> 现在我了解到Q你在开发servlet和JSP面时从不会犯错误,而且你的所有页面是那样的清晎ͼ一般的E序员都不会被它们的搞糊涂。但是,是hM犯错误的Q用户可能会提供不合规定的参敎ͼ使用不正的URL或者不能提供必需的表单字D倹{除此之外,其它开发h员可能不那么l心Q他们应该有些工h克服自己的不?br>error-page元素是用来克服q些问题的。它有两个可能的子元素,分别是:error-code和exception- type。第一个子元素error-code指出在给定的HTTP错误代码出现时用的URL。第二个子元素excpetion-type指出在出现某个给定的Java异常但未捕捉到时使用的URL。error-code和exception-type都利用location元素指出相应的URL。此 URL必须?开始。location所指出的位|处的页面可通过查找HttpServletRequest对象的两个专门的属性来讉K关于错误的信息,q两个属性分别是Qjavax.servlet.error.status_code和javax.servlet.error.message?br>可回忆一下,在web.xml内以正确的次序声明web-app的子元素很重要。这里只要记住,error-page出现在web.xml文g的末Nq,servlet、servlet-name和welcome-file-list之后卛_?br> 8.1 error-code元素 Z更好C解error-code元素的|可考虑一下如果不正确地输入文件名Q大多数站点会作Z么反映。这样做一般会出现一?04错误信息Q它表示不能扑ֈ该文Ӟ但几乎没提供更多有用的信息。另一斚wQ可以试一下在www.microsoft.com、www.ibm.com 处或者特别是?www.bea.com 处输出未知的文g名。这是会得出有用的消息,q些消息提供可选择的位|,以便查找感兴的面。提供这h用的错误面对于 Web应用来说是很有h值得。事实上rm-error-page子元素)。由form-login-pagel出的HTML表单必须h一?j_security_check?ACTION属性、一个名为j_username的用户名文本字段以及一个名为j_password的口令字Dc?br>例如Q程序清?-19指示服务器用基于表单的验证。Web应用的顶层目录中的一个名为login.jsp的页面将攉用户名和口oQƈ且失败的登陆由相同目录中名为login-error.jsp的页面报告?br> E序清单5-19 web.xmlQ说明login-config的摘录) <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <!-- ... --> <security-constraint> ... </security-constraint> <login-config> <auth-method> FORM </auth-method> <form-login-config> <form-login-page>/login.jsp</form-login-page> <form-error-page>/login-error.jsp</form-error-page> </form-login-config> </login-config> <!-- ... --> </web-app> 9.2 限制对Web资源的访?br>现在Q可以指C服务器使用何种验证Ҏ了?了不P"你说道,"除非我能指定一个来收到保护?URLQ否则没有多大用处?没错。指些URLq说明他们应该得CU保护正是security-constriaint元素的用途。此元素?web.xml中应该出现在login-config的紧前面。它包含是个可能的子元素Q分别是Qweb-resource-collection?auth-constraint、user-data- constraint和display-name。下面各节对它们进行介l?br>l web-resource-collection 此元素确定应该保护的资源。所有security-constraint元素都必d含至一个web-resource-collectionV此元素׃个给ZQ意标识名U的web-resource-name元素、一个确定应该保护的URL的url-pattern元素、一个指出此保护所适用?HTTP命oQGET、POST{,~省为所有方法)的http-method元素和一个提供资料的可选description元素l成。例如,下面?Web-resource-collection(在security-constratint元素内)指出Web应用的proprietary目录中所有文档应该受C护?br><security-constraint> <web-resource-coolection> <web-resource-name>Proprietary</web-resource-name> <url-pattern>/propritary/*</url-pattern> </web-resource-coolection> <!-- ... --> </security-constraint> 重要的是应该注意刎ͼurl-pattern仅适用于直接访问这些资源的客户机。特别是Q它不适合于通过MVC体系l构利用 RequestDispatcher来访问的面Q或者不适合于利用类似jsp:forward的手D|讉K的页面。这U不匀U如果利用得当的话很有好处。例如,servlet可利用MVC体系l构查找数据Q把它放到bean中,发送请求到从bean中提取数据的JSP面q显C它。我们希望保证决不直接访问受保护的JSP面Q而只是通过建立该页面将使用的bean的servlet来访问它。url-pattern和auth-contraint元素可通过声明不允怓Q何用L接访问JSP面来提供这U保证。但是,q种不匀U的行ؓ可能让开发h员放松警惕,使他们偶然对应受保护的资源提供不受限制的讉K? l auth-constraint 管web-resource-collention元素质出了哪些URL应该受到保护Q但是auth-constraint元素却指出哪些用户应该具有受保护资源的访问权。此元素应该包含一个或多个标识h讉K权限的用L别role- name元素Q以及包含(可选)一个描q角色的description元素。例如,下面web.xml中的security-constraint元素部门规定只有指定为Administrator或Big KahunaQ或两者)的用户具有指定资源的讉K权?br><security-constraint> <web-resource-coolection> ... </web-resource-coolection> <auth-constraint> <role-name>administrator</role-name> <role-name>kahuna</role-name> </auth-constraint> </security-constraint> 重要的是认识刎ͼ到此为止Q这个过E的可移植部分结束了。服务器怎样定哪些用户处于M角色以及它怎样存放用户的口令,完全有赖于具体的pȝ?br>例如QTomcat使用install_dir/conf/tomcat-users.xml用户名与角色名和口令相兌Q正如下面例子中所C,它指出用户joeQ口令bigshotQ和janeQ口令enajQ属于administrator和kahuna角色?br><tomcat-users> <user name="joe" password="bigshot" roles="administrator,kahuna" /> <user name="jane" password="enaj" roles="kahuna" /> </tomcat-users> l user-data-constraint q个可选的元素指出在访问相兌源时使用M传输层保护。它必须包含一个transport-guarantee子元素(合法gؓNONE?INTEGRAL或CONFIDENTIALQ,q且可选地包含一个description元素。transport-guarantee为NONE值将Ҏ用的通讯协议不加限制。INTEGRALDC数据必M一U防止截取它的h阅读它的方式传送。虽然原理上Qƈ且在未来的HTTP版本中)Q在 INTEGRAL和CONFIDENTIAL之间可能会有差别Q但在当前实践中Q他们都只是单地要求用SSL。例如,下面指示服务器只允许对相兌源做 HTTPSq接Q?br><security-constraint> <!-- ... --> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint> l display-name security-constraint的这个很用的子元素给予可能由GUI工具使用的安全约束项一个名U?br>9.3 分配角色?br>q今为止Q讨论已l集中到完全由容器(服务器)处理的安全问题之上了。但servlet以及JSP面也能够处理它们自q安全问题?br>例如Q容器可能允许用户从bigwig或bigcheese角色讉K一个显CZh员额外紧贴的面Q但只允许bigwig用户修改此页面的参数。完成这U更l致的控制的一U常见方法是调用HttpServletRequset的isUserInRoleҎQƈ据此修改讉K?br>Servlet?security-role-ref子元素提供出现在服务器专用口令文件中的安全角色名的一个别名。例如,假如~写了一个调?request.isUserInRoleQ?boss"Q的servletQ但后来该servlet被用在了一个其口o文g调用角色manager而不是boss的服务器中。下面的E序D该servlet能够使用q两个名UC的Q何一个?br><servlet> <!-- ... --> <security-role-ref> <role-name>boss</role-name> <!-- New alias --> <role-link>manager</role-link> <!-- Real name --> </security-role-ref> </servlet> 也可以在web-app内利用security-role元素提供出现在role-name元素中的所有安全角色的一个全局列表。分别地生命角色佉KUIDEҎ处理安全信息?br> 10 控制会话时 如果某个会话在一定的旉内未被访问,服务器可把它扔掉以节U内存。可利用HttpSession的setMaxInactiveIntervalҎ直接讄个别会话对象的超时倹{如果不采用q种ҎQ则~省的超时值由具体的服务器军_。但可利用session-config和session- timeout元素来给Z个适用于所有服务器的明的时倹{超时值的单位为分钟,因此Q下面的例子讄~省会话时gؓ三个时Q?80分钟Q?br><session-config> <session-timeout>180</session-timeout> </session-config> 11 Web应用的文档化 来多的开发环境开始提供servlet和JSP的直接支持。例子有Borland Jbuilder Enterprise Edition?Macromedia UltraDev、Allaire JRun StudioQ写此文Ӟ已被Macromedia收购Q以?IBM VisuaAge for Java{?br>大量的web.xml元素不仅是ؓ服务器设计的Q而且q是为可视开发环境设计的。它们包括icon、display-name和discription{?br>可回忆一下,在web.xml内以适当地次序声明web-app子元素很重要。不q,q里只要Cicon、display-name和description是web.xml的web-app元素内的前三个合法元素即可?br>l icon icon元素指出GUI工具可用来代表Web应用的一个和两个囑փ文g。可利用small-icon元素指定一q?6 x 16的GIF或JPEG囑փQ用large-icon元素指定一q?2 x 32的图像。下面D一个例子: <icon> <small-icon>/images/small-book.gif</small-icon> <large-icon>/images/tome.jpg</large-icon> </icon> l display-name display-name元素提供GUI工具可能会用来标记此Web应用的一个名U。下面是个例子?br><display-name>Rare Books</display-name> l description description元素提供解释性文本,如下所C: <description> This Web application represents the store developed for rare-books.com, an online bookstore specializing in rare and limited-edition books. </description> 12 兌文g与MIMEcd 服务器一般都h一U让Web站点理员将文g扩展名与媒体相关联的Ҏ。例如,会自动l予名ؓmom.jpg的文件一个image/jpeg?MIME cd。但是,假如你的Web应用h几个不寻常的文gQ你希望保证它们在发送到客户机时分配为某UMIMEcd。mime-mapping元素Q具?extension和mime-type子元素)可提供这U保证。例如,下面的代码指C服务器application/x-fubar?MIMEcd分配l所有以.fool尾的文件?br><mime-mapping> <extension>foo</extension> <mime-type>application/x-fubar</mime-type> </mime-mapping> 或许Q你的Web应用希望重蝲QoverrideQ标准的映射。例如,下面的代码将告诉服务器在发送到客户机时指定.ps文g作ؓU文本(text/plainQ而不是作为PostScriptQapplication/postscriptQ?br><mime-mapping> <extension>ps</extension> <mime-type>application/postscript</mime-type> </mime-mapping> 13 定位TLD JSP taglib 元素h一个必要的uri属性,它给Z个TLDQTag Library DescriptorQ文件相对于Web应用的根的位|。TLD文g的实际名U在发布新的标签库版本时可能会改变,但我们希望避免更Ҏ有现有JSP面。此外,可能q希望用保持taglib元素的简l性的一个简短的uri。这是部v描述W文件的taglib元素z场的所在了。Taglib包含两个子元素:taglib-uri和taglib-location?taglib-uri元素应该与用于JSP taglib元素的uri属性的东西相匹配。Taglib-location元素l出TLD文g的实际位|。例如,假如你将文gchart-tags- 1.3beta.tld攑֜WebApp/WEB-INF/tlds中。现在,假如web.xml在web- app元素内包含下列内宏V?br><taglib> <taglib-uri>/charts.tld</taglib-uri> <taglib-location> /WEB-INF/tlds/chart-tags-1.3beta.tld </taglib-location> </taglib> l出q个说明后,JSP面可通过下面的简化Ş式用标{ֺ?br><%@ taglib uri="/charts.tld" prefix="somePrefix" %> 14 指定应用事g监听E序 应用事g监听器程序是建立或修改servlet环境或会话对象时通知的类。它们是servlet规范的版?.3中的新内宏V这里只单地说明用来向Web应用注册一个监听程序的web.xml的用法?br>注册一个监听程序涉及在web.xml的web-app元素内放|一个listener元素。在listener元素内,listener-class元素列出监听E序的完整的限定cdQ如下所C: <listener> <listener-class>package.ListenerClass</listener-class> </listener> 虽然listener元素的结构很单,但请不要忘记Q必L地l出web-app元素内的子元素的ơ序。listener元素位于所有的 servlet 元素之前以及所有filter-mapping元素之后。此外,因ؓ应用生存期监听程序是serlvet规范?.3版本中的新内容,所以必M?web.xml DTD?.3版本Q而不?.2版本?br>例如Q程序清?-20l出一个名为ContextReporter的简单的监听E序Q只要Web应用的Servlet-Context建立Q如装蝲Web应用Q或消除Q如服务器关闭)Ӟ它就在标准输Z昄一条消息。程序清?-21l出此监听程序注册所需要的web.xml文g的一部分?br> E序清单5-20 ContextReporterjava package moreservlets; import javax.servlet.*; import java.util.*; /** Simple listener that prints a report on the standard output * when the ServletContext is created or destroyed. *
* Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * © 2002 Marty Hall; may be freely used or adapted. */ public class ContextReporter implements ServletContextListener { public void contextInitialized(ServletContextEvent event) { System.out.println("Context created on " + new Date() + "."); } public void contextDestroyed(ServletContextEvent event) { System.out.println("Context destroyed on " + new Date() + "."); } } E序清单5-21 web.xmlQ声明一个监听程序的摘录Q?br><?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <!-- ... --> <filter-mapping> … </filter-mapping> <listener> <listener-class>package.ListenerClass</listener-class> </listener> <servlet> ... </servlet> <!-- ... --> </web-app> 15 J2EE元素 本节描述用作J2EE环境l成部分的Web应用的web.xml元素。这里将提供一个简明的介绍Q详l内容可以参阅http: //java.sun.com/j2ee/j2ee-1_3-fr-spec.pdf?Java 2 Plantform Enterprise Edition版本1.3规范的第5章?br>l distributable distributable 元素指出QWeb应用是以q样的方式编E的Q即Q支持集的服务器可安全地在多个服务器上分布Web应用。例如,一个可分布的应用必d使用 Serializable对象作ؓ其HttpSession对象的属性,而且必须避免用实例变量(字段Q来实现持箋性。distributable元素直接出现在discription元素之后Qƈ且不包含子元素或数据Q它只是一个如下的标志?br><distributable /> l resource-env-ref resource -env-ref元素声明一个与某个资源有关的管理对象。此元素׃个可选的description元素、一个resource-env-ref- name元素Q一个相对于java:comp/env环境的JNDI名)以及一个resource-env-type元素Q指定资源类型的完全限定的类Q,如下所C: <resource-env-ref> <resource-env-ref-name> jms/StockQueue </resource-env-ref-name> <resource-env-ref-type> javax.jms.Queue </resource-env-ref-type> </resource-env-ref> l env-entry env -entry元素声明Web应用的环境项。它׃个可选的description元素、一个env-entry-name元素Q一个相对于java: comp/env环境JNDI名)、一个env-entry-value元素Q项|以及一个env-entry-type元素Qjava.langE序包中一个类型的完全限定cdQjava.lang.Boolean、java.lang.String{)l成。下面是一个例子: <env-entry> <env-entry-name>minAmout</env-entry-name> <env-entry-value>100.00</env-entry-value> <env-entry-type>minAmout</env-entry-type> </env-entry> l ejb-ref ejb -ref元素声明对一个EJB的主目录的应用。它׃个可选的description元素、一个ejb-ref-name元素Q相对于java: comp/env的EJB应用Q、一个ejb-ref-type元素Qbean的类型,Entity或SessionQ、一个home元素Qbean的主目录接口的完全限定名Q、一个remote元素Qbean的远E接口的完全限定名)以及一个可选的ejb-link元素Q当前bean链接的另一?bean的名Uͼl成?br>l ejb-local-ref ejb-local-ref元素声明一个EJB的本C目录的引用。除了用local-home代替home外,此元素具有与ejb-ref元素相同的属性ƈ以相同的方式使用
]]>
վ֩ģ壺
һ |
˳Ƶ |
ɫվ |
һ |
91þþþþþ |
ҳվ߹ۿѸ |
ĻƵ |
ҹƷӰ |
ҹƷһţӰԺ
|
þҹҹ³³Ƭ
|
ձaƬѿ |
þþþþþƵ |
þùѾƷ |
ĻѹۿƵ |
һëƬѲһ |
þƷav |
Ʒպ |
㽶þһ |
Ʒ鶹ר |
VV |
Ļ |
һػƴƬëƬ |
벻?Ƭ |
߹ۿ |
ֻƵ |
ɫavһ |
ƷþþþóѶ
|
ŮƵһ |
þþþþþAv |
Ʒ߹ۿ |
þԭavapp
|
ɫ鶹һƷһAVһ
|
һA |
뾫ƷŮ˾þþò |
ƷٸAVѾþϴ |
ձ߸Ѱվ |
žѹۿ嶯4 |
߹ۿѰƵ |
18վڵ |
ѾþþƷ99reѾy |
ŷպһ |