博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Servlet技术浅析(七)之-----ServletContext与Web应用范围
阅读量:4290 次
发布时间:2019-05-27

本文共 2540 字,大约阅读时间需要 8 分钟。

1、简述

        Servlet容器在启动一个Web应用时,会为它创建一个唯一的ServletContext对象。当Servlet终止一个Web应用时,就会销毁他的ServletContext对象。由此可见,ServletContext对象和Web应用具有同样的生命周期。

2、Web应用范围具有以下两层含义:

(1)表示由Web应用的生命周期构成的时间段(即Web应用的整个生命周期)。

(2)表示在Web应用的生命周期内所有Web组件的集合(即生命周期内可使用的Web组件的集合)。

3、ServletContext接口存取数据方法

在ServletContext接口中提供了一组在Web应用范围内存取共享数据的方法,

这个共享数据有以下两个特点:

(1)共享数据的生命周期位于Web应用的生命周期中的一个时间段。

(2)共享数据可以被Web应用中的所有Web组件共享。

4、如何实现向Web应用范围内存取共享数据呢?

由于ServletContext对象具有与Web应用同样长的生命周期,而且ServletContext对象可以被Web应用内的所有的Web组件共享,因此,可以利用ServletContext对象来存取Web应用范围内的共享数据,基本思想如下:

(1)面向对象编程的一个基本对象就是万物皆对象。因此,共享数据也理所当然的用java.lang.Object类型的任意java对象来表示。

(2)只要把代表共享数据的java对象与ServletContext对象关联,该Java对象的生命周期就依附于ServletContext对象的生命周期,并且,Web组件就可以通过ServletContext对象来访问它。实际上,该java对象就被存放到Web应用范围内。

(3)在Web应用范围内可以存放各种类型的共享数据。为了方便的存取特定的共享数据,可以把代表共享数据的java对象作为ServletContext的属性来存放。每个属性包括一对属性名和属性值,属性值代表共享数据,属性名则用于标识共享数据。

5、在ServletContext接口中,常用的用于存取共享数据的方法

有以下三个:

(1)setAttribute(String name , java.lang.Object object):向Web应用范围内存放共享数据,参数name指定属性名,参数object表示共享数据。

(2)getAttribute(String name):根据参数给定的属性名,返回Web应用范围内匹配的共享数据。

(3)removeAttribute(String name):根据参数给定的属性名,从Web应用范围内删除匹配的共享数据。

二、ServletContextListener监听器

在Servlet API 中有一个ServletContextListener监听器,它能够监听ServletContext对象的生命周期,实际上就是监听Web应用的生命周期。

当Servlet容器启动或终止Web应用时,会触发ServletContextEvent事件,该事件由ServletContextListener来处理,在ServletContextListener接口中定义了处理ServletContextEvent事件的两个方法:

(1)contextInitialized(ServletContextEvent sce):当Servlet容器启动Web应用时,调用该方法。在调用完该方法之后,容器再对Filter初始化,并且对那些在Web应用启动时需初始化的Servlet进行初始化。

(2)contextDestroyed(ServletContextEvent sce):当Servlet容器终止Web应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet和Filter过滤器。

在实际开发中,有的网站需要统计自web应用发布后,网页被客户端访问的次数,这就要求当Web应用终止时,计数器的数值被永久存储在一个文件中或者是数据库中,等到web应用重新启动时,先从文件或数据库中读取数值,初始化计数器,然后再此基础上继续计数。向文件或数据库中写入或者是读取数值的功能就可以由我们自定义的监听器(实现了ServletContextListener接口)来完成。

如:

package com._test.servlet;import javax.servlet.ServletContext;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;public class MyServletContextListener implements ServletContextListener {	/**	 * 当Servlet容器终止Web应用时调用该方法	 */	public void contextDestroyed(ServletContextEvent sce) {		ServletContext context = sce.getServletContext();		String count = (String) context.getAttribute("count") ;		//从ServletContext对象中获得计数,持久化到文件中或者是数据库中。	}	/**	 * 当Servlet容器启动Web应用时,调用该方法	 */	public void contextInitialized(ServletContextEvent sce) {		ServletContext context = sce.getServletContext();		int count = 0;		// 从文件或者是数据库中获得持久化的数值,赋值给count,然后把count值放入ServletContext对象中,在Web应用范围内使用		context.setAttribute("count", count);	}}

转载地址:http://azqgi.baihongyu.com/

你可能感兴趣的文章
分享一首小诗--《致程序员》
查看>>
为什么百度只抓取了首页而不抓取我的网站的内页的原因分析
查看>>
年薪170万的阿里P8级员工征婚有感--话说阿里真有钱,这员工要求的条件真多
查看>>
又是一年桂花飘香时,祝我们伟大的祖国70年华诞更加繁荣昌盛,祝大家国庆节快乐
查看>>
谷歌浏览器chrome即将在2020年底停止支持flash,我们程序员该怎么办
查看>>
如何将数据采集到 Elasticsearch 服务
查看>>
面试官:mysql表设计要注意什么?
查看>>
一些精致小众网站收集录
查看>>
计算机科学探秘之linux发展史
查看>>
程序员每天早上早来10分钟的好处
查看>>
互联网30年,泡沫如梦,一个个泡沫和风口过后,会是什么样的结局
查看>>
升级centos 6.8 服务器的gcc
查看>>
网络案例分析之999皮炎平出鹤顶红色号的口红
查看>>
API网关在微服务架构中的应用,这一篇就够了
查看>>
微服务部署:蓝绿部署、滚动部署、灰度发布、金丝雀发布
查看>>
架构成长之路:Spring Cloud微服务如何实现熔断降级?
查看>>
JVM发生内存溢出的8种原因、及解决办法
查看>>
SpringBoot2.0 基础案例(12):基于转账案例,演示事务管理操作
查看>>
高性能负载均衡:nginx搭建tomcat集群
查看>>
Spring切面中的正则表达式
查看>>