首页 > 学院 > 开发设计 > 正文

【Servlet】03-Web容器模型

2019-11-08 01:50:21
字体:
来源:转载
供稿:网友

在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项目启动时,构造一些对象,那么,监听器就粉墨登场。

要使用监听器,我们需要做如下几件事: 1. 实现一个监听器接口 2. 覆盖接口里的方法 3. 配置DD文件或者注解

我们监听器的Java文件如下:

@WebListenerclass 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");
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表