ServletConfig
<只对当前Servlet有效>
(1)在Web容器初始化Servlet实例时,都会为这个Servlet准备一个唯一的ServletConfig实例(俗称Servlet配置对象)。
(2)Web容器会从部署文件中读出该Servlet类的初始化参数,并设置到ServletConfig实例中,然后再把这个ServletConfig实例传递给该Servlet实例的init()方法。
ServletContext
<整个Web应用有效>
(1)一个Web应用程序中的所有Servlet都共享一个ServletContext上下文实例。因此,ServletContexts实例也称application对象。
(2)可以通过setAttribute(String name,Object obj)、getAttribute(String name)方法来存放和获取属性。
(3)可以通过getInitParameter(String name)方法来获取指定名称的Web应用上下文初始化参数的值。
例如:
ServletContext context=this.getServletContext(); String appName=context.getInitParameter("appName");
Servlet的线程安全问题
Servlet默认时以多线程模式执行的。当多个客户同时并发请求一个Servlet时,容器将启动多个线程调用的请求方法。
请求处理方法中的局部变量时安全,而成员变量和共享数据时不安全的。解决线程安全的问题由如下常用方法:
(1)synchornized
但要尽可缩小同步代码的范围,不要直接再doGet()、doPost()等请求处理方法使用同步,这将严重影响性能。
(2)尽量少使用成员变量和共享数据
Servlet类尽量不要定义成员变量;
尽量少在ServletContext、HttpSession中保存会被修改的数据。
单例模式处理共享数据。
会话跟踪
Cookie
Cookie是在浏览器访问Web服务器的某个资源时,由Web服务器在HTTP响应消息头中附带传送给浏览器的一段数据。
Servlet规范规定用于会话跟踪的名字必须是JSESSIONID。
Servlet API中提供了一个javax.servlet.http.Cookie类来封装Cookie信息,提供一些常用的方法:
public Cookie(String name,String Value);
getName()、setValue()、setMaxAge()、getMaxAge()、setPath()、getPath()、setDomain()以及getDomain()。
如果要将一个构造好的Cookie实例的信息添加到消息头中,可以使用HttpServletResponse接口中提供的addCookie()方法。
Session
一个客户端在Web服务器端对应一个各自的HttpSession实例。
Web容器并不在每个客户端第一次访问时就自动创建HttpSession实例。只有客户端访问某个编写了创建HttpSession实例代码的Servlet时,才会创建一个HttpSession实例。
HttpServletRequest接口提供了两个方法来创建HttpSession实例:
public HttpSession getSession();
public HttpSession getSession(boolean flag);
常用方法:setAttribute(String name,Object obj)、getAttribute(String name)、invalidate()等。
URL重写
将会话ID添加到URL接回,以标识该会话,这样服务器就可以从请求URL中取出会话ID,并用它查找匹配的回话了。
HttpServletResponse接口中定义了两个用于自动完成URL重写的方法:
(1) 用于对超链接和form表单的action属性的URL进行自动URL重写
public String encodeURL(String url);
(2)用于对要传递给HttpServletResponse.sendRedirect()方法的URL进行自动URL重写
public String encodeRedirectURL(String url);
过滤器
Filter可以改变一个request和修改一个reponse。
Filter不是一个Servlet,它不能产生一个response,它能够在一个request到达Servlet之前预处理request,也可以在离开Servlet时处理response。
Filter可以完成验证客户是否来可信的网络,可以对客户提交的数据进行重新编码,可以验证客户是否登陆等。
所有过滤器都必须实现javax.servlet.Filter接口,这个接口包含三个方法,分别是:doFilter()、init()和destroy()。
doFilter()方法为大多数过滤器的关键部分,每当调用一个过滤器时,都要执行该方法。通过调用FilterChain对象的doFilter()方法时,可以激活下一个相关的过滤器。
Servlet监听器
Servlet API提供了以下几个监听器接口:
(1)ServletContextListener:监听Web应用的启动和销毁事件。
(2)ServletContextAttributeListener:监听Web应用上下文中的属性改变事件。
(3)ServletRequestListener:用于监听请求的创建和销毁。
(4)ServletRequestAttributeListener:监听请求中的属性改变。
(5)HttpSessionListener:监听会话的创建和销毁事件。
(6)HttpSessionActivationListrener:监听会话的激活和钝化的事件。
(7)HttpSessionAttributeListener:监听会话中的属性改变事件。
(8)HttpSessionBindingListener:会话值绑定监听器。不用在web.xml中设定的Listener。
Servlet 3.0 ——新增标签支持
简化Servlet、Filter和Listener的申明。使得web.xml部署描述文件从该版本开始不在时必选的了。
web.xml的顶层标签<web-app>中有一个metadata-compete属性,如果设置为true,则容器的部署只依赖web.xml的配置,会忽略所有标注。
@WebServlet
声明Servlet。
常用属性:name(<servlet-name>)、
value(等价urlPatterns属性)
urlPatterns(<url-pattern>)
loadOnStartup(<load-on-startup>)
initParams(<init-param>)
asyncSupported(<async-supported>)
dscription(<desciption>)
displayName(<display-name>)
@WebInitParam
通常不单独使用,配合@WebServlet或者@WebFilter使用,为Servlet或者过滤器指定初始化参数。
常用属性:name(<param-name>)、
value(<param-value>)、
description(<description>)。
例如:
@WebServlet(name="servlet",urlPatterns={"/servlet1"},initParams={@WebInitParam(name="usrname",value="rekent")} )
public class servlet extends HttpServlet{
}
@WebFilter
申明过滤器。
@WebListener
声明监听器,必须实现接口
@MultipartConfig
辅助Servlet3.0中HttpServletResquest提供的对上传文件的支持。