Java+Servlet+Specification - - ++Version+2.3(3)

2019-03-15 12:20

容器都会做缓冲,并且允许servlet定制缓冲参数。下列方法和缓冲相关。 .getBufferSize .setBufferSize .isCommitted .reset

.resetBuffer .flushBuffer

这些方法对ServletOutputStream和Writer有效。

getBufferSize返回正在使用的缓冲大小,如果没有使用缓冲,返回整数0。可以通过setBufferSize设定缓冲大小,缓冲分配的ad校可以与servlet请求的不同,但至少应不比所请求的小。此方法应在调用ServletOutputStream或Writer向客户机发送数据之前调用。如果有任何数据已经被发送,此方法将抛出IllegalStateException异常.

isCommitted方法返回一个boolean值显示是否有任何response字节被发送回客户机。flushBuffer强制将buffer中的内容发送给客户机。reset方法在response还没有被commit以前将buffer的内容清空,头信息和状态码也被清除。resetBuffer则只清除buffer内容。

如果response已经被commit,调用reset和resetBuffer将抛出IllegalStateException异常,同时response对象不会发生改变。

一旦数据被开始发送给客户机,response对象就被认为是committed状态。

5.2 头

servlet用下面的方法设置HTTP头信息。 .setHeader

.addHeader

setHeader方法会替换已经被设置的值,而addHeader则会添加一个值到同名头的值集合中。

为保证成功地将头信息传送到客户机,必须在response对象被提交以前,设置HTTP头信息。

servlet开发人员有责任确保Content-type头被正确设置,HTTP1.1规范并不要求HTTP response中设置该头。当开发人员没有设置该值, 容器也不要设置缺省值。

5.3 方便的方法 .sendRedirect .sendError

sendRedirect方法会自动设置合适的头与内容,引导客户机跳转到另一个URL去。 使用相对路径作为参数也是合法的,但容器必须将相对路径转换为绝对路径送回客户机。如果由于某些原因不能转换,必须抛出IllegalArgumentException异常.

sendError方法自动设置返回客户机的头信息和错误信息,一个可选的字符串类型的变量,可用来显示错误信息的内容部分。

这两个方法对于response的commit都有影响,如response还没被提

交,将终止提交。这些方法后调用的输出都将被忽略。

若数据被写进缓冲,但还没有发送到客户机,这些数据将被这两个方法发送的数据代替,如果response已经被提交,将抛出 IllegalStateException异常.

5.4 国际化

setLocale方法可以设置response对象的语言属性,此方法必须在开发人员调用getWriter之前使用。

注意。setContentType方法将覆盖setLocale设定的值。

5.5 response对象的关闭 当response被关闭时,容器必须立即发送所有缓冲中的数据到客户机,下列情形显示response对象被关闭了。 .servlet的service方法结束。

.当发送完由setContentLength设定的长度的内容后。 .调用了sendError方法。 .调用了sendRedirect方法。

5.6 response对象的生命周期

每个response对象只在service方法范围内可用,或者是filter的doFilter方法内。容器通常会回收response对象以避免频繁创建response对象造成的性能过载。开发人员在可用范围外引用response对象时,必须确保不会引起不可预知的行为。

第六章 filter

Filter是规范2.3新提供的特性,它使得请求与响应过程的信息转换很敏捷。

6.1 什么是Filter

Filter是一段可重用的,转换HTTP请求,响应内容和头信息的代码。Filter通常不象servlet那样会创建response或对请求作出响应。它们只是修改对资源的请求或对资源的响应。

Filter对静态和动态资源都可以起作用。filter的一般作用: .在request到达它调用的资源之前访问该资源。 .在request到达它调用的资源之前处理该资源。

.修改request头和数据,通过重新包装request对象。 .修改response头和数据,通过重新包装response对象。 .拦截监听资源的调用。

.以一定顺序对一个或一组servlet或者静态资源作用。

6.1.1 Filter的例子 .认证filter

.日志与审核filter

.图像转换filter .数据压缩filter .加密Filter .令牌filter

.出发资源访问事件的filter .转换XML文档的XSLT filter .MIME-type 链filter .缓存filter

6.2 主要概念

开发人员实现javax.servlet.Filter接口来创建filter,同时提供一个公共无参数的构造函数。该类应该被包含在web应用中。在发布文件中,以“filter”,\-mapping\元素声明配置。

6.2.1 filter 生命周期

web应用发布完成之后,在request访问web资源之前,容器必须定位需要应用到该资源上的filter列表。容器需要确保实例化列表中的每个filter并调用它的init方法。如不能正确执行,filter可以抛出异常。

配置描述文件中每个filter的声明在每个虚拟机中仅仅只有一个实例。容器提供filter配置秘书中声明的config对象, 它包含了该web应用的ServletContext引用,和filter初始参数。

当容器接收到request,将取得列表中的第一个filter实例,并调用它的doFilter方法。将传入ServletRequest,ServletResponse和filterchain的引用。

doFilter方法遵循以下模式: 1.该方法检测request的头信息

2.可能会用一个定制的ServletRequest或HttpServletRequest包装request对象。

3.可能会用一个定制的ServletResponse或HttpServletResponse包装response对象。

4.filter可以调用filter链中的下一个入口,可能是一个filter,也可能是目的web资源。

5.调用链中的下一个filter之后,filter可以检测响应头信息。

6.处理过程中,filter可能抛出异常。如果在doFilter中抛出UnavailableException,容器不要继续filter链的处理,如飞永久性异 常,它可以选择在稍晚的时候重新执行整个filter链。

6.2.2 包装request和response

filter的核心概念就是包装request和response对象,以便于执行filter任务时,覆盖其行为。在此模型中,开发人员不仅能够覆盖request和response对象上已有的方法,还可以为某个特定的过滤任务在整个链上提供新的API。例如,开发人员可能想在response对象上使用比out流和writer

更高级的输出对象,例如,允许DOM对象写回客户机的API。

为了支持这种类型的filter,容器必须满足下列需求。当一个filter调用filter chain的doFilter方法时,容器必须确保传到下一Filter或web资源入口的request和response对象,和调用filter的doFilter方法传入的是同一个对象。

同样的,被包装的request、response对象和传入的也必须是一致的。

6.2.3 filter环境

配置描述中可以使用一系列参数初始化filter,描述符为\,filter在运行时可以使用FilterConfig对象上的getInitParameter和getInitParameterNames方法得到参数名和值。FilterConfig也提供对ServletContext的访问。

6.2.4 在web应用中配置filter

在配置描述中,filter以filter元素定义。

filter-name:用来映射该filter到一个servlet或者URL filter-class:容器用来识别filter类型 init-params:初始化参数

图标,文本描述,显示名称都是可选项描述,主要给县骨干工具软件使用。对于每个filter声明,容器必须正确地实例化一个filter对象,如果对于一个filter类定义了多个声明,容器将会生成多个实例。 例子:

filter声明:

Image Filter

com.acme.ImageServlet

filter声明后,应使用filter-mapping元素定义该filter要应用的servlet或是静态资源。

Image Filter ImageServlet

filter也可以使用URL匹配模式和一组servlet或静态资源关联起来。

Logging Filter /*

此处,Logging filter被应用到applicationlide所有servlet和静态资源上了,因为所有请求URI都匹配\。

当用url-pattern处理filter-mapping时,容器必须用路径映射规则判断

所请求的URI是否匹url-pattern。

容器针对某个被请求的URI构建的filter链的顺序为: 1.首先是url-pattern匹配的filter,如有多个,其顺序是配置描述的顺序。 2.然后是servlet-name匹配的filter,如有多个,其顺序是配置描述的顺序。

以上两点意味着容器:

.根据匹配规则11.2确定被访问的目标Web资源

.如果通过servlet名称匹配到了filter,且web资源拥有servlet名称,容器按照配置描述的顺序构建filter链。链的底部就是最后一个通过servlet名称匹配的filter,并且由它调用目的web资源。

.如果有url-pattern匹配的request URI的filter,容器以配置描述中的顺序构建url-pattern匹配的filter链.链的底部是最后一个url-pattern匹配到的filter,并且该filter将调用第一个servlet-name匹配的filter,如没有则直接调用目的web资源.

若希望提高容器性能,最好缓存filter链,以免每次请求都要重新计算.

第七章 会话 sessions

超文本传输协议(HTTP)被设计成无状态的协议.为了构建有效率的web应用,将从某个特定客户机上发送来的request互相关联起来是很必要的,会话跟踪的技术已经发展了很长时间,但对于开发人员直接使用来说都是很困难的.

本规范定义了HttpSession接口,允许servlet容器使用好几种方式跟踪用户会话,而开发人员不会陷入不同方式的细节.

7.1 会话跟踪机制

通过HTTP cookie跟踪会话时比较常用的办法,所有servlet容器都要求实现这一技术.

容器发送cookie到客户机,客户机在接下来的请求中都将该cookie返回给容器.这样就很清楚地将请求和会话关联起来,用于会话跟踪的cookie名称一定是JSESSIONID.

7.1.2 SSL Session

7.1.3 URL重写

URL重写式会话跟踪的最低公分母?,当客户机不接受cookie时,server就使用URL重写作为会话跟踪的基本方式.URL重写,添加了附加数据(会话ID)到请求的URL路径上.

会话ID必须被编码作为该URL字符串中的路径参数。该参数的名称为jsessionid,例如:

http://www.myserver.com/catalog/index.html;jsessionid=1234

7.1.4会话完整性


Java+Servlet+Specification - - ++Version+2.3(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:三点法 比例导引法 课程设计

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: