属性与监听者

来源:互联网 发布:导航触摸屏校正软件 编辑:程序博客网 时间:2024/06/05 03:41

一、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.ServletContextAttributeListenerattributeAddedattributeRemovedattributeReplaced你想知道有多少个并发用户,也就是说,你想跟踪活动的会话。    javax.servlet.http.HttpSessionListenersessionCreatedsessionDestroyed每次请求到来时你都想知道,以便建立日志记录   javax.servlet.ServletRequestListenerrequestInitializedrequstDestroyed增加、删除或替换一个请求属性时你希望知道    javax.servlet.ServletRequestAttributeListenerattributeAddedattributeRemovedattributedReplaced你有一个属性类(这个类表示的对象将放在一个属性中),而且你希望这个类型的对象在绑定到一个会话或从会话删除时得到通知。  javax.servlet.http.HttpSessionBindingListenervalueBoundvalueUnbound增加、删除或者替换一个会话属性时你希望能够知道 javax.servlet.http.HttpSessionAttributeListenerattributeAddedattributeRemovedattributedReplaced你想知道是否创建或者撤销了一个上下文。 javax.servlet.ServletContextListenercontextInitializedcontextDestroyed你有一个属性类,而且希望这个类型的对象在其绑定的会话迁移到另一个JVM时得到通知。   javax.servlet.http.HttpSessionAcitvationListenersessionDidActivatesessionWillPassivate

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
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 巧什么名什么成语 什么巧什么拙成语 巧言什么什么成语 能什么巧什么四字成语 巧字开头的成语接龙 巧字开头的成语 形容手巧的成语 带巧的成语 什么什么什么巧成语 61diy巧手网 巧支付 diy收纳 雅马哈巧格i 雅马哈巧格i125 一代巧格 雅马哈巧格100 雅马哈巧格通病 巧格2代 巧格排气管 巧格100价格 雅马哈巧格i价格 巧格100多少钱 雅马哈巧格i怎么样 巧格原装排气管 巧格价位 巧格改55缸 雅马哈巧格油耗 雅马哈巧格图片 雅马哈巧格配件 巧格货架 雅马哈巧格100踏板车 巧格踏板摩托车图片 巧格摩托车论坛 巧格混合比 株洲雅马哈巧格100 雅马哈巧格多少钱 巧格125踏板摩托车 巧格价格 巧格电摩 大阳巧格 雅马哈巧格二代