2008-4-9
1. servlet是什么?
一个基于Java技术的组件,由容器进行管理,可以生成动态内容。其中容器有时也叫做servlet引擎,是提供了servlet功能的Web服务器扩展。
2. servlet container
servlet container是web服务器或者应用程序服务器的一部分。所有的servlet container必须支持HTTP协议的请求和响应,其他协议的请求和响应不一定被支持,例如HTTPS。HTTP协议的版本为1.0或者1.1,请参考RFC2616。
3. servlet 2.4与servlet 2.3
在servlet 2.4版本中,HttpSessionListener的sessionDestroyed方法的定义为”提示session即将(is about to be invalidated)失效”。而在以前的版本中,该方法的定义为”提示session(was invalidated)失效了”。
在servlet 2.4版本中,在ServletRequest接口中追加了getRemotePort()、getLocaleName()、getLocalePort()、getLocaleAddr()方法。如果以前开发了实现ServletRequest接口的类,而需要使用servlet 2.4版本的类库的话,需要实现以上的方法。
4. Servlet接口
所有的servlet都直接或者间接的实现了Servlet接口,两个比较重要的接口实现是GenericServlet和HttpServlet。Servlet接口定义了service方法,用于处理客户端请求。对于servlet container路由给servlet实例的每个请求,都会调用这个方法。
HTTP请求处理的接口有doGet、doPost、doPut、doDelete、doHead、doOptions、doTrace,分别对应不同的HTTP请求。一般情况下,只需要实现doGet和doPost的业务逻辑实现即可,关于其他的方法,需要非常熟悉HTTP协议才进行使用。
SingleThreadModel接口已经作为不推荐使用的接口。
一些servlet在container启动的时候加载和实例化(load-on-startup),有些servlet在实际使用的时候才进行加载和实例化。servlet的初始化方法为init,用于初始化诸如数据库连接等操作。init方法包含一个参数为ServletConfig,该对象可以读取web应用程序部署描述符中配置的一些初始化参数。
非常不赞成同步service方法(性能上会有很大的损失)。
出现ServletException时,表示在处理请求的过程中发生了错误,container会采取合适的措施清理请求。
出现UnavailableException时,表示servlet不能处理请求,不能处理的时间期限可能为永久,也可能为暂时。对于永久unavailable,调用destroyed方法,从service中删除servlet,返回SC_NOT_FOUND(404)的响应;对于暂时的unavailable,在超过一定时间间隔后重新调用servlet,此时会返回SC_SERVICE_UNAVAILABLE(503)响应。
在container调用servlet的destroy方法前,必须允许任何运行service方法的线程完成执行,或者超过服务器定义的时间期限。
5. ServletContext
使用ServletContext对象,servlet可以进行日志记录、获取资源的URL引用以及设置和获取同一个上下文共享的属性。ServletContext是以Web服务器的路径作为根的。例如
http://www.mycorp.com/catalog,那么所有以/catalog开始的请求路径都是与同一个ServletContext相关的,/catalog就是上下文路径(context path)。
每个部署到servlet container里的web application都对应一个ServletContext接口的实例。如果是多个JVM的话,那么每个JVM中都有一个ServletContext接口的实例。ServletContext是非分布式的,只可以存在于一个JVM中。
获取上下文的初始化参数的方法是getInitParameter俄getInitParameterNames,初始化参数用于提供安装信息。
servlet可以将对象绑定到上下文中。名称-对象对。setAttributes、getAttribute、getAttributeNames、removeAttribute方法用于处理上下文属性。
可以通过getResource和getResourceAsStream方法获取静态文本资源。两个方法都是以”/”开始,使用相对于上下文的路径。这个层次的文档可以存在于服务器文件系统,web应用程序的存档文件(jar文件)、远程服务器或者其他位置。动态内容是不可以通过这种方式获取的,例如获取/index.jsp的内容,将返回jsp文件的原始内容。
每个虚拟主机有一个独有的ServletContext实例,不可以在多个虚拟主机中共享。
javax.servlet.context.tempdir上下文属性用于指定临时存储目录。
6. ServletRequest
当请求为HTTP或者HTTPS请求、HTTP方法是POST方法、内容类型是application/x-www-form-urlencoded、servlet已经调用了getParameter方法,此时就可以获取HTTP协议参数了,如果上述条件不符合的话,并且post的form数据不包含在parameter中,post data就只能从request的input stream中获取了。从请求中获取参数的方法有:getParameter、getParameterNames、getParameterValues、getParameterMap。
关于请求路径的内容,可以通过getRequestURI和getPathInfo方法获取。
请求的属性可以由容器设置或者RequestDispather进行设置,可以通过以下的接口对属性进行操作:getAttributes、getAttributeNames、setAttribute。
以java.、javax.、sun.、com.sun.为前缀的属性名作为保留属性名,不可以使用。
一个header名可以对应多个header值。getIntHeader,可能抛出NumberFormatException、getDateHeader可能抛出IllegalArgumentException。
请求的路径有三部分,getContextPath获取上下文路径、getServletPath获取servlet路径、getPathInfo获取其他部分的内容。
JSPServlet的URLPattern为*.jsp,那么如下的路径的各部分路径为:
/catalog/help/feedback.jsp
ContextPath为/catalog
ServletPath为/help/feedback.jsp
PathInfo为null
关于路径的转换,可以通过调用ServletContext的getRealPath方法和HttpServletRequest的getPathTranslated方法进行转换。
SSL连接时的Request属性为:
javax.servlet.request.ciper_size
javax.servlet.request.key_size
javax.servlet.request.X509Certificate
发表于 @ 2008年04月10日 01:37:00|编辑