[Servlet] 14 Servlet ServletContext


prtyaa
prtyaa 2023-12-27 15:33:23 49828
分类专栏: 资讯

问题:

Request解决了一次请求内的数据共享问题,

session解决了用户不同请求的数据共享问题,

那么不同的用户的数据共享该怎么办呢?

解决:

使用ServletContext对象

作用:

解决了不同用户的数据共享问题

原理:

ServletContext对象由服务器进行创建,一个项目只有一个对象。不管在项目的任意位置进行获取得到的都是同一个对象,那么不同用户发起的请求获取到的也就是同一个对象了,该对象由用户共同拥有。(也就是一个项目中,所有的用户都可以用,都可以共享的信息)

特点:

服务器进行创建

用户共享

一个项目只有一个(单例)

生命周期:

服务器启动到服务器关闭

作用域:

项目内

使用:

  1. 获取ServletContext对象及使用作用域进行共享数据流转
  2. 获取web.xml中的全局配置
  3. 获取webroot下项目资源流对象
  4. 获取webroot下资源绝对路径

可用于做网页浏览器次数统计或者数据共享


1.获取ServletContext对象及使用作用域进行共享数据流转

获取ServletContext的三种方式

 ServletContext servletContext = getServletContext();
 ServletContext servletContext1 = getServletConfig().getServletContext();
 ServletContext servletContext2 = req.getSession().getServletContext();

存储共享数据

servletContext.setAttribute(String name,Object value)

获取数据,没有数据则是null

servletContext.getAttribute(String name)

删除用户的共享数据

servletContext.removeAttribute(String name);

2.获取web.xml中的全局配置

解释:就是预先存储一部分的数据到服务器中,服务器启动即添加到servletContext中

将部分动作和源文件进行解耦,我们只需要在xml配置文件中进行相关配置就会改变代码的执行效果。

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
        version="4.0">
    <!--配置全局配置参数-->
    <context-param>
        <param-name>computer</param-name>
        <param-value>DELL</param-value>
    </context-param>
</web-app>

servlet

用法1:获取数据

 // 加载全局配置参数
        String computer = c1.getInitParameter("computer");
        System.out.println("computer = " + computer);

用法2:将一部分的参数放到web.xml里面,这样修改的时候就不用在去修改源码,类似于提取properties文件,将部分动作和源文件进行解耦,我们只需要在xml配置文件中进行相关配置就会改变代码的执行效果。

String f=sc1.getInitParameter("flag");
	if("false".equals(f)){
		System.out.println("TestServlectContextA.service(关闭***资源)");
		}else{
		System.out.println("TestServlectContextA.service(打开***资源)");
			}

3.获取webroot下项目资源流对象

获取webRoot下的资源流对象sc.getResourceAsStream(String path); 。

path为相对路径 ,写从webRoot开始查找资源的路径即可。

好处是,资源的获取不再局限于盘符,可以动态的查找获取

 // 以流的形式加载静态资源 --> web.xml 动态获取
        InputStream is = servletContext.getResourceAsStream("WEB-INF/web.xml");
        // 转换为字符流
        InputStreamReader reader = new InputStreamReader(is);
        // 包装为缓冲流
        BufferedReader br = new BufferedReader(reader);
        // 准备字符串
        String line = null;
        //遍历打印输出
        while((line = br.readLine()) != null) {
            System.out.println(line);
        }
       //关闭流
        br.close();
    }

4.获取webroot下资源绝对路径

获取webRoot下的资源绝对路径

sc.getRealPath(String path);

注意:

path为相对路径,写从webRoot开始查找资源的路径即可。

 // 获取资源的绝对路径
        String path = c1.getRealPath("/upload");
        String contextPath = c1.getContextPath();
        System.out.println("path = " + path);
        System.out.println("contextPath = " + contextPath);

做网页浏览器次数统计案例

servlet1 这里需要到web.xml中配置服务器启动加载

原理:

在服务器启动的时候将计数文件中的数据存储到ServletContext中init()。

在服务器关闭的时候将ServletContext中的计数器数据存储到计数文件中destroy()。

/**
 * 1、在服务器关闭的时候将ServletContext中的计数器数据存储到nums.txt中
 * 2、在服务器启动的时候将nums.txt中的数据存储到ServletContext中
 * 
 * 
 * 
 * 
 * @author MyPC
 *
 */
public class NumServlet extends HttpServlet {
	//在服务器启动的时候将nums.txt中的数据存储到ServletContext中
	@Override
	public void init() throws ServletException {
		//获取ServletContext对象
		ServletContext sc=this.getServletContext();
		//获取nums.txt中存储的浏览器次数
			//获取nums.txt的绝对路径(动态获取)
			String path=sc.getRealPath("num/nums.txt");
			//创建File对象
			File f=new File(path);
			//读取nums.txt中的数据
				//获取资源流对象
				BufferedReader br=null;
				InputStreamReader is=null;
				FileInputStream fs=null;
				try {
					fs=new FileInputStream(f);
					is=new InputStreamReader(fs);
					br=new BufferedReader(is);
					//读取
					String nums=br.readLine();
					//将数据存储到ServletContext中
					sc.setAttribute("nums",Integer.parseInt(nums));
					
				} catch (Exception e) {
					e.printStackTrace();
				}finally{
					//关闭流资源
					try {
						fs.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					try {
						is.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					try {
						br.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
	}
	//在服务器关闭的时候将ServletContext中的计数器数据存储到nums.txt中
	@Override
	public void destroy() {
		//获取ServletContext对象
			ServletContext sc=this.getServletContext();
		//获取计数器数据
			int nums=(int) sc.getAttribute("nums");
		//将计数器数据存储到nums.txt文件中
			//获取nums.txt文件的绝对路径(动态获取)
			String path=sc.getRealPath("num/nums.txt");
			//获取nums.txt的File对象
			File f=new File(path);
			//获取资源的流对象
			BufferedWriter bw=null;
			OutputStreamWriter ow=null;
			FileOutputStream fs=null;
			try {
				//获取nums.txt的流对象
				fs=new FileOutputStream(f);
				ow=new OutputStreamWriter(fs);
				bw=new BufferedWriter(ow);
				//将数据写入到nums.txt中
				bw.write(nums+"");
				//刷新
				bw.flush();
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				//关闭流资源
				try {
					fs.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					ow.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					bw.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
	}
}

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=31452
赞同 0
评论 0 条
prtyaaL2
粉丝 1 发表 2553 + 关注 私信
上周热门
如何使用 StarRocks 管理和优化数据湖中的数据?  2973
【软件正版化】软件正版化工作要点  2891
统信UOS试玩黑神话:悟空  2864
信刻光盘安全隔离与信息交换系统  2749
镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态  1283
grub引导程序无法找到指定设备和分区  1253
华为全联接大会2024丨软通动力分论坛精彩议程抢先看!  170
2024海洋能源产业融合发展论坛暨博览会同期活动-海洋能源与数字化智能化论坛成功举办  169
点击报名 | 京东2025校招进校行程预告  165
华为纯血鸿蒙正式版9月底见!但Mate 70的内情还得接着挖...  162
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

加入交流群

请使用微信扫一扫!