Servlet之属性和监听者

这篇博文主要是《Head First Servlets & JSP》第五章的笔记,由于前四章主要讲基础,这里不会详细记录,以后抽时间把前四章进行一个总结。

本章知识要点:

  1. 怎样初始化servlet和ServletContext
  2. 编写servlet代码来增加、获取和删除属性
  3. 描述请求、会话和Web应用的Web容器生命周期事件模型
  4. 描述RequestDispatcher机制。

    1,初始化参数

    初始化参数在部署描述(DD)文件-web.xml中配置,模板代码为:

<servlet>
    <servlet-name>simpleDemoservlet-name>
    <servlet-class>TestInitParamsservlet-class>
    
    <init-param>
        <param-name>myEmailparam-name>
        <param-value>[email protected]param-value>
    init-param>
servlet>

在servlet中,读取初始化参数的示例代码为:

String initParameter = getServletConfig().getInitParameter("myEmail");

容器在初始化一个servlet时,会首先从DD中“读出”servlet初始化参数,并把这些参数教给ServletConfig,然后把ServletConfig传递给servlet的init()方法。注意到,在超类中,init()方法有两个版本,一个没有任何方法,另一个init(ServletConfig)方法则会调用无参数的init()方法。servlet在初始化的时候调用的有参数的init方法会得到一个ServletConfig的reference。

要使初始化参数有效,必须重新启动web容器,或者使用支持热部署的web容器。初始化参数只有serlvet能看到。

2,请求属性

请求属性有请求对象设置:

request.setAttribute("attr", value);

得到请求的任何其他servlet或JSP都能使用这些属性。用于向视图返回一些值。

3,上下文初始化参数

上下文初始化参数对整个web应用可见,web应用中的servlet和JSP都能访问上下文初始化参数。上下文初始化参数在web应用启动时就初始化了,而不是加载servlet时初始化,上下文初始化参数可以看作时全局参数,也是在web.xml中配置。示例代码:

<servlet>
    
servlet>
<context-param>
    <param-name>contextParamparam-name>
    <param-value>contextValueparam-value>
context-param>

在servlet代码中获取context parameter:

String contextValue = getServletContext().getInitParameter("contextParam");

每个servlet有一个ServletConfig
每个Web应用有一个ServletContext

4,监听者(listener)

监听者能监听一个上下文初始化事件,并得到上下文舒适化参数,并在web应用为客户提供服务之前运行一段代码。ServletContextListener类就是用来完成这个任务的。
ServletContextListener能监听ServletContext的初始化和撤销两个重要事件。

在一个需要访问数据库的应用中,有很多servlet需要访问数据库,但是由于上下文初始化参数只能时String型,无法完成这样的任务。一种常见的做法是使用ServletContextLisener:

  1. 上下文初始化时得到通知。
  2. 从ServletContext得到上下文初始化参数
  3. 使用初始化参数查找名建立一个数据库连接
  4. 把数据库连接存储为一个属性,使得web应用的各个部分都能访问数据库。
  5. 上下文撤销(web应用取消部署或结束)时得到通知,关闭数据库。

在web.xml中配置监听者:

<listener>
    <listener-class>
        com.example.MyServletContextListener
    listener-class>
listener>

web容器通过监听者实现的接口判断监听者监听的时什么类型的事件。
监听者能监听很多事件,包括:上下文属性、servlet请求和属性,以及HTTP会话和会话属性相关的事件

5,属性

属性就是一个对象,可能设置到另外3个servlet API对象中的某一个,包括ServletContext、HttpServletRequest或者HttpSession。可以简单地认为属性时一个映射实例对象中的名/值对(名是一个String, 值是一个Object)。
属性有三个作用域:上下文、请求和会话。应用中的每个部分都能访问上下文属性,而会话属性只有能访问特定HttpSession的部分才能访问,请求属性则只有能访问特定ServketRequest的部分才能访问。

上下文作用域不是线程安全的!
因为应用中的每个部分都能访问上下文属性,而容器对http请求是并发处理的,每个请求在一个单独的线程中处理,此时多个线程可能同时访问这个上下文属性,因此上下文作用域不是线程安全的。

HttpSession也不是线程安全的
因为当一个客户同时发出多个请求时,此时多个线程就可以同时访问HttpSession属性。
请求属性和局部变量是线程安全的
请求属性的使用场景:请求分派。MVC应用中,控制器与模型通信,得到视图建立相应所需要的数据,这些数据只针对某个请求,因此把它放在请求属性红。

你可能感兴趣的:(Java,web)