【Servlet】03-Web容器模型

Servlet技术模型中,咱们了解到了Web应用中,Servlet的基础职能,和使用Servlet的一些注意事项。可是,这一切,都须要Web容器进行管理,Web容器在Servlet编程中起到以下做用:java

  • 经过部署文件,初始化Servlet和ServletContext编程

  • 控制Servlet的做用域,对Servlet属性进行增删查改安全

  • 描述Web容器请求处理模型元素:过滤器、过滤器链、请求/响应的包装服务器

  • 监听Web事件(监听器的使用)url

  • 描述RequestDispatcher,用Servlet转发、包含目标资源spa

咱们先来说讲容器部署应用时,对Servlet怎么作初始化的:
DD(Deployment Descriptor)文件中线程

<servlet>
    <init-param>
        <param-name>paramName</param-name>
        <param-value>paramValue</param-value>
    <init-param>
</servlet>

Java文件中code

// 在一个Servlet中
getServletConfig().getInitParameter("paramName");

若是咱们有以下需求:在整个项目中获取某一个属性,那么,咱们是这样初始化的:
DD文件中:xml

<context-param>
            <param-name>paramName</param-name>
    <param-value>paramValue</param-value>
</context-param>

Java文件中:对象

getServletContext().getInitParameter("paramName");

若是,咱们须要在Web项目启动时,构造一些对象,那么,监听器就粉墨登场。

要使用监听器,咱们须要作以下几件事:

  1. 实现一个监听器接口

  2. 覆盖接口里的方法

  3. 配置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");
相关文章
相关标签/搜索