属性与监听者

一、servletContext与ServletConfig

1.每一个servlet都有一个servletConfig,容器在初始化servlet时,会为servlet创建一个唯一的servletConfig,我们都知道,在容器初始化一个servlet时,会调用构造函数和init()方法,而servletConfig是在容器调用init()方法时传进去的。容器一开始会从配置文件中读取servlet初始化参数,并把这些参数交给servletConfig,然后把servletConfig传递给servlet的init()方法。

2.servlet的初始化参数只能读取一次,就是在容器初始化servlet的时候,如果这时候需要将servlet的初始化参数改变,就需要重新部署web应用才行。

servlet初始化参数在部署文件中:

在每个特定的servlet的<servlet>元素中
**<servlet>**
    <servlet-name>pass</servlet-name>
    <servlet-class>TestInit</servlet-class>
    **<init-param>**
        <param-name>foo</param-name>
        <param-value>bar</param-value>
    **</init-param>**
**</servlet>**

servlet初始化参数在代码中:

**getServletConfig()**.getInitParameter("foo");

3.servletContext是比servletConfig作用范围更广的参数,称为上下文初始化参数,每一个web应用中都有一个唯一的servletContext。容器读取配置文件中的上下文初始化参数,创建servletContext的一个新实例,为servletContext提供上下文初始化参数各个名/值的引用,在一个web应用中部署的各个servlet与jsp都能访问这个servletContext。

上下文初始化参数在部署文件中:

**<web-app>**
    **<context-param>**
        <param-name>foo</param-name>
        <param-value>bar</param-value>
    **</context-param>**
**</web-app>**

servlet初始化参数在代码中:

**getServletContext()**.getInitParameter("foo");

servletContext接口中的一些重要方法:

得到初始化参数以及获取/设置属性:
getInitParameter(String)、getInitParameterNames()、
getAttribute(String)、getAttributeNames()、
setAttribute(String,Object)、removeAttribute(String)
得到有关服务器/容器的信息:
getRealPath(String)、getResourceAsStream(String)、
getRequestDispatcher(String)...

二、属性与监听者

1.上下文初始化参数只能是一个String,但是如果这时候想让web应用访问一个共享的数据库连接,这时候单单靠上下文初始化参数是不行的,还需要一个监听者:ServletContextListener。
2.servletContextListener能够监听servletContext一生中关键的两件事:初始化(创建)和撤销。servletContextListener有两个重要的方法:contextInitialized(ServletContextEvent),contextDestroyed(ServletContextEvent)。
3.要监听servletContext事件,就需要写一个实现servletContextListener的监听者类,把它部署在配置文件的listener元素中。
4.八个监听者:

场景以及相应的 监听者接口:
你想知道一个web应用上下文是否增加、删除或替换了一个属性。  javax.servlet.ServletContextAttributeListener
attributeAdded
attributeRemoved
attributeReplaced

你想知道有多少个并发用户,也就是说,你想跟踪活动的会话。    javax.servlet.http.HttpSessionListener
sessionCreated
sessionDestroyed

每次请求到来时你都想知道,以便建立日志记录   javax.servlet.ServletRequestListener
requestInitialized
requstDestroyed

增加、删除或替换一个请求属性时你希望知道    javax.servlet.ServletRequestAttributeListener
attributeAdded
attributeRemoved
attributedReplaced

你有一个属性类(这个类表示的对象将放在一个属性中),而且你希望这个类型的对象在绑定到一个会话或从会话删除时得到通知。  javax.servlet.http.HttpSessionBindingListener
valueBound
valueUnbound

增加、删除或者替换一个会话属性时你希望能够知道 javax.servlet.http.HttpSessionAttributeListener
attributeAdded
attributeRemoved
attributedReplaced

你想知道是否创建或者撤销了一个上下文。 javax.servlet.ServletContextListener
contextInitialized
contextDestroyed

你有一个属性类,而且希望这个类型的对象在其绑定的会话迁移到另一个JVM时得到通知。   
javax.servlet.http.HttpSessionAcitvationListener
sessionDidActivate
sessionWillPassivate

5.属性是一个对象,可能设置(或者绑定)到另外3个servlet API对象中的某一个,包括servletContext、servletRequest(HttpServletRequets)或者HttpSession。但是需要注意的是,属性并不等同于参数!!

1.在类型上:属性有应用\上下文、请求以及会话属性(没有特定于servlet的属性,只需使用实例变量)。参数有应用\上下文初始化参数、请求参数、servlet初始化参数(没有会话参数!)。
2.在设置方法上:属性是:setAttribute(String name,Object value).
应用\上下文参数是不能设置的,只能部署在配置文件中(对于请求参数,可以在查询串中附加,这个不在此说明)。
3.返回类型上:属性返回的是Object的类型。参数返回的是String类型。
4.获取方法上:属性是getAttribute(String name).属性返回的是Object,因此需要强制类型转换。参数是getInitParameter(String name).

6.3个属性作用域(上下文、请求和会话)分别由ServletContext、ServletRequest、HttpSession接口处理,每个接口的对应属性的API完全相同。
Object getAttribute(String name)
void setAttribute(String name,Object value)
void removeAttribute(String name)
Enumeration getAttributeNames()
注:
上下文作用域属性、会话作用域属性、servlet中的实例变量、servlet的静态变量都不是线程安全的。只有请求作用域属性、服务方法中的局部变量是线程安全的。

7.属性作用域:

Context(上下文)(不是线程安全的):
1.可访问性(谁能看到):web应用的所有部分,包括servlet、JSP、ServletContextListener、ServletContextAttribute-Listener。
2.作用域(能存活多久):ServletContext的生命期,这意味着所部署应用的生命期。如果服务器或应用关闭,上下文则撤销(其属性也响应撤销)。
3.适用于:希望整个应用共享的资源包括数据库连接、JNDJ查找名、email地址等。

HttpSession(会话)(不是线程安全的):
1.可访问性(谁能看到):访问这个特定会话的所有servlet或JSP。要记住,会话可能从单个客户请求扩展到跨同一个客户的多个请求,这些请求可能指向不同的servlet。
2.作用域(能存活多久):会话的生命期。会话可以通过编程撤销,也可能只是因为超时而撤销。
3.适用于:与客户会话有关的资源和数据,而不只是与单个请求相关的资源。它只要与客户完成一个持续的会话。购物车就是一个典型的例子。

Request(请求)(是线程安全的):
1.可访问性(谁能看到):应用中能直接访问请求对象的所有部分。简单来说,这主要是指使用RequestDispatcher将请求转发到的JSP和Servlet,另外还有与请求相关的监听者。
2.作用域(能存活多久):请求的生命期,这说明会持续到Servlet的service()方法结束。换句话说,就是线程(栈)处理的这个请求的整个生命期。
3.适用于:将模型信息从控制器传递到视图...或者特定于单个客户请求的任何其他数据。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值