在Servlet技术模型中,我们了解到了Web应用中,Servlet的基础职能,和使用Servlet的一些注意事项。但是,这一切,都需要Web容器进行管理,Web容器在Servlet编程中起到如下作用:
通过部署文件,初始化Servlet和ServletContext
控制Servlet的作用域,对Servlet属性进行增删查改
描述Web容器请求处理模型元素:过滤器、过滤器链、请求/响应的包装
监听Web事件(监听器的使用)
描述RequestDispatcher,用Servlet转发、包含目标资源
我们先来讲讲容器部署应用时,对Servlet怎么做初始化的:
DD(Deployment Descriptor)文件中
<servlet>
<init-param>
<param-name>paramName</param-name>
<param-value>paramValue</param-value>
<init-param>
</servlet>
Java文件中
// 在一个Servlet中
getServletConfig().getInitParameter("paramName");
如果我们有如下需求:在整个项目中获取某一个属性,那么,我们是这样初始化的:
DD文件中:
<context-param>
<param-name>paramName</param-name>
<param-value>paramValue</param-value>
</context-param>
Java文件中:
getServletContext().getInitParameter("paramName");
如果,我们需要在Web项目启动时,构造一些对象,那么,监听器就粉墨登场。
要使用监听器,我们需要做如下几件事:
实现一个监听器接口
覆盖接口里的方法
配置DD文件或者注解
我们监听器的Java文件如下:
@WebListener
class SomeListener implements ServletContextListener{
public void contextInitialzed(ServletContextEvent sce){
// 获取Context的引用
ServletContext context = sce.getServletContext();
}
}
我们的DD文件(没有使用@WebListener的时候有用):
<listener>
<listener-class></listener-class>
</listener>
我们还有更多的Listener可以选择:
类 | 作用 |
---|---|
ServletContextAttributeListener | 监听Web应用的属性 |
HttpSessionListener | 监听Web中的Session |
HttpSessionBindingListener | 监听对象绑定到会话 |
HttpSessionActivationListener | 对Session迁移事件监听 |
ServletRequestListener | 监听Web中的请求 |
对于属性而言,我们还需要知道属性的作用域,我们需要知道的作用域有:
上下文(Context)
请求(Request)
会话(HtttpSession)
我们有一个参照表,用来描述各种作用域:
名称 | 意义 | 作用域 |
---|---|---|
PageContext | 页面上下文,可以获取所有页面对象 | 页面 |
HttpServletRequest | 客户端请求 | 请求域 |
HttpServletResponse | 服务器响应 | |
ServletContext | 表示一个应用程序 | 整个服务器端 |
我们需要知道,ServletContext属性不是线程安全的,因为,它可能被其它用户更改。
这里有一个对上下文属性加锁的示例:
public void doGet(HttpServletRequest request,
// 下面的代码对ServletContext同步
HttpServletResponse response){
synchronized(getServletContext()){
getServletContext().setAttribute("attributeName","attributeValue");
}
}
同样,我们的HttpSession属性也不是线程安全的,对HttpSession进行同步处理,可以避免线程不安全的修改。
对于和线程有关的问题,我们应做到:
声明局部变量,而不是实例变量
在合适的作用域里使用属性
我们认识了属性的一些知识后,我们可以把属性请求/分派出去:
request.setAttribute("beer","BEER");
request.getRequestDispatcher("someurl");
// 使用如下方法,必须以/打头
getServletContext().getRequestDispatcher("/someurl");
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。