2008-4-11
1. ServletResponse
关于Servlet响应,主要需要注意ServletResponse何时被提交以及一旦提交后不能进行哪些操作。另外就是诸如setStatus以及sendError等操作。
2. Filtering
过滤器可以过滤动态或者静态的内容。过滤器可以转换HTTP请求、响应以及HTTP头的内容。
过滤器的使用主要有以下情形:认证、日志与授权、图像转换、数据压缩、加密、令牌环、资源存取事件触发器、XSL/T转换器等。
实现javax.servlet.Filter接口,填写init(FilterConfig)、doFilter(ServletRequest,ServletResponse,FilterChain)主方法以及destroy方法,就完成了一个过滤器的实现。
生命周期:从Web应用部署完成之后,container就必须定位filter的列表,初始化列表中的所有Filter类的实例、并调用各个类的init方法。FilterConfig可以获取ServletContext对象。过滤器可以以过滤链的形式被激活。在调用链中下一个过滤器后,过滤器就可以检查响应的headers。执行完最后一个过滤器后,接下来执行实际的请求资源,例如静态资源或者servlet。
可以给Filter配置初始化参数通过Web部署描述符。过滤器可以针对servlet-name和url-pattern对指定的servlet或者url进行过滤。过滤器的mapping中还可以添加dispatcher标记,用于进行跳转或者包含等关系。
3. Sessions
HTTP协议是无状态的协议。Session机制主要有以下几种方法:Cookies的使用,SSL具有一个内置的Session机制、URL重写,使用jsessionid=1234这样的请求参数。
一个Session是否为new,取决于以下两个条件之一:
® 客户端还不知道Session
® 客户端拒绝加入Session
关于HttpSession具有几个监听器,例如绑定监听器、生命周期监听器、超时监听器等。
4. 请求转发
通过调用ServletContext的getRequestDispatcher和getNamedDispatcher方法,可以获取实现RequestDispatcher的实现类对象。
其中第一个方法接受一个String字符串参数,以/开头,表示相对于ContextRoot的路径。后一个方法接受ServletContext中的一个servlet的名字。
ServletRequest也可以调用getRequestDispatcher方法,但是参数是相对于servlet的路径。例如
ServletContext.getRequestDispatcher(“/garden/header.html”)等价于
ServletRequest.getRequestDispatcher(“header.html”)
其中ServletRequest是对/garden/tools.html的请求。
RequestDispatcher的include方法可以在任何时候调用,但是操作时又限制的,不鞥设置头,不能修改。当使用include方法时,以下request属性被设置:javax.servlet.include.request_uri、context_path、servlet_path、path_info、query_string,但是这些参数不适用于getNamedDispatcher情况。
RequestDispatcher的forward方法必须在response的数据没有被提交给客户端之前使用。
5. Web应用程序
servlet代码中使用getResource或者getResourceAsStream方法(ServletContext)可以方法WEB-INF目录的内容。
先加载WEB-INF/classes目录中的类,然后加载WEB-INF/lib下的类。如果直接在客户端访问WEB-INF下的资源,会返回404错误。
对于直接访问META-INF目录资源的客户端请求,返回404错误。
在进行错误处理时,可以使用错误页面机制进行自定义错误页面(错误页面可以用于处理指定的异常或者指定的错误代码)。同时跳转到错误页面时,以下请求属性被定义:
javax.servlet.error.status_code、exception_type、message、exception、request_uri、servlet_name
Web应用程序在进行处理客户端请求之前,必须执行以下步骤:
® 实例化事件监听器,由部署描述符的listener标记定义
® 对于ServletContextListener,调用contextInitialized方法
® 实例化filter标记定义的过滤器,并调用init方法
® 实例化定义了load-on-startup子元素的servlet,并调用init方法
6. 应用程序生命周期事件
以下事件监听器用于处理在应用程序生命周期中发生的事件:
javax.servlet.ServletContextListener:用于监听servlet上下文的创建以及将被关闭时。
javax.servlet.ServletContextAttributeListener:用于监听上下文属性的设置,移除以及替换。
javax.servlet.http.HttpSessionListener:用于监听HttpSession的创建、无效以及超时。
javax.servlet.http.HttpSessionAttributeListener:用于监听会话属性的设置、移除以及替换。
javax.servlet.http.HttpSessionActivationListener:激活或者禁用。
javax.servlet.http.HttpSessionBindingListener:对象被绑定或者解除绑定。
javax.servlet.ServletRequestListener:Web组件开始处理请求时。
javax.servlet.ServletRequestAttributeListener:用于监听请求属性被添加、移除或者替换。
7. 请求与Servlet的映射
requestURL-contextPath-pathParameters=用于映射servlet的路径
使用第一个匹配的servlet
例子:
Path Pattern Servlet
/foo/bar/* servlet1
/baz/* servlet2
/catalog servlet3
*.bop servlet4
Incoming Path Servlet Handling Request
/foo/bar/index.html servlet1
/foo/bar/index.bop servlet1
/baz servlet2
/baz/index.html servlet2
/catalog servlet3
/catalog/index.html "default" servlet
/catalog/racecar.bop servlet4
/index.bop servlet4
发表于 @ 2008年04月12日 00:30:00|编辑