问题:
Request解决了一次请求内的数据共享问题,
session解决了用户不同请求的数据共享问题,
那么不同的用户的数据共享该怎么办呢?
解决:
使用ServletContext对象
作用:
解决了不同用户的数据共享问题
原理:
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);。
解释:就是预先存储一部分的数据到服务器中,服务器启动即添加到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(打开***资源)");
}
获取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();
}
获取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();
}
}
}
}
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!