zoukankan      html  css  js  c++  java
  • 三、ServletContext

    一、问题:

      Request解决了一次请求内的数据共享问题,session解决了用户不同请求的数据共享问题,那么不同的用户的数据共享该怎么办呢?

      解决:

      使用ServletContext对象

    二、作用:

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

    三、原理:

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

    四、特点:

    • 服务器进行创建
    • 用户共享
    • 一个项目只有一个

    五、生命周期:

      服务器启动到服务器关闭

    六、作用域:

      项目内

    七、使用:

    7.1获取ServletContext对象

    (1)创建ServletContext对象(三种方式)

    ServletContext sc1 = this.getServletContext();
    ServletContext sc2 =this.getServletConfig().getServletContext();
    ServletContext sc3=req.getSession().getServletContext();

    7.2使用作用域进行共享数据流转

    存储用户共享数据
      sc.setAttribute(String name,Object value);
    获取用户共享数据
      sc.getAttribute(String name);
    删除共享数据
      sc.removeAttribute(String name);

    7.3获取web.xml中的全局配置属性,作用:将部分动作和源文件进行解耦,我们只需要在xml配置文件中进行相关配置就会改变代码的执行效果。

      <!-- 配置全局配置属性 -->
          <context-param>
              <param-name>flag</param-name>
              <param-value>true</param-value>
          </context-param>
    sc.getInitParameter("flag");注意返回的是String类型数据

    7.4获取webroot下项目资源流对象

    sc.getResourceAsStream(String path);
    注意:
    path为相对路径,写从webRoot开始查找资源的路径即可。

    7.5获取webroot下资源绝对路径

    sc.getRealPath(String path);
    注意:
    path为相对路径,写从webRoot开始查找资源的路径即可。

    八、案例:网页浏览次数统计

     1//获取ServletContext对象
     2 ServletContext sc=this.getServletContext();
     3 //获取计数器
     4 Object obj=sc.getAttribute("nums");
     5 //判断
     6 if(obj!=null){
     7       //计数器数据自增
     8       int nums=(int) obj;
     9       nums=nums+1;
    10       //存储计数器数据到ServletContext对象
    11       sc.setAttribute("nums", nums);
    12   }else{
    13       sc.setAttribute("nums",1);
    14 }
      1 import java.io.BufferedReader;
      2 import java.io.BufferedWriter;
      3 import java.io.File;
      4 import java.io.FileInputStream;
      5 import java.io.FileOutputStream;
      6 import java.io.IOException;
      7 import java.io.InputStreamReader;
      8 import java.io.OutputStream;
      9 import java.io.OutputStreamWriter;
     10 
     11 import javax.servlet.ServletContext;
     12 import javax.servlet.ServletException;
     13 import javax.servlet.http.HttpServlet;
     14 /**
     15  * 1、在服务器关闭的时候将ServletContext中的计数器数据存储到nums.txt中
     16  * 2、在服务器启动的时候将nums.txt中的数据存储到ServletContext中
     17  * 
     18  * 
     19  * 
     20  * 
     21  * @author 22  *
     23  */
     24 public class NumServlet extends HttpServlet {
     25     //在服务器启动的时候将nums.txt中的数据存储到ServletContext中
     26     @Override
     27     public void init() throws ServletException {
     28         //获取ServletContext对象
     29         ServletContext sc=this.getServletContext();
     30         //获取nums.txt中存储的浏览器次数
     31             //获取nums.txt的绝对路径(动态获取)
     32             String path=sc.getRealPath("num/nums.txt");
     33             //创建File对象
     34             File f=new File(path);
     35             //读取nums.txt中的数据
     36                 //获取资源流对象
     37                 BufferedReader br=null;
     38                 InputStreamReader is=null;
     39                 FileInputStream fs=null;
     40                 try {
     41                     fs=new FileInputStream(f);
     42                     is=new InputStreamReader(fs);
     43                     br=new BufferedReader(is);
     44                     //读取
     45                     String nums=br.readLine();
     46                     //将数据存储到ServletContext中
     47                     sc.setAttribute("nums",Integer.parseInt(nums));
     48                     
     49                 } catch (Exception e) {
     50                     e.printStackTrace();
     51                 }finally{
     52                     //关闭流资源
     53                     try {
     54                         fs.close();
     55                     } catch (IOException e) {
     56                         // TODO Auto-generated catch block
     57                         e.printStackTrace();
     58                     }
     59                     try {
     60                         is.close();
     61                     } catch (IOException e) {
     62                         // TODO Auto-generated catch block
     63                         e.printStackTrace();
     64                     }
     65                     try {
     66                         br.close();
     67                     } catch (IOException e) {
     68                         // TODO Auto-generated catch block
     69                         e.printStackTrace();
     70                     }
     71                 }
     72     }
     73     //在服务器关闭的时候将ServletContext中的计数器数据存储到nums.txt中
     74     @Override
     75     public void destroy() {
     76         //获取ServletContext对象
     77             ServletContext sc=this.getServletContext();
     78         //获取计数器数据
     79             int nums=(int) sc.getAttribute("nums");
     80         //将计数器数据存储到nums.txt文件中
     81             //获取nums.txt文件的绝对路径(动态获取)
     82             String path=sc.getRealPath("num/nums.txt");
     83             //获取nums.txt的File对象
     84             File f=new File(path);
     85             //获取资源的流对象
     86             BufferedWriter bw=null;
     87             OutputStreamWriter ow=null;
     88             FileOutputStream fs=null;
     89             try {
     90                 //获取nums.txt的流对象
     91                 fs=new FileOutputStream(f);
     92                 ow=new OutputStreamWriter(fs);
     93                 bw=new BufferedWriter(ow);
     94                 //将数据写入到nums.txt中
     95                 bw.write(nums+"");
     96                 //刷新
     97                 bw.flush();
     98             } catch (Exception e) {
     99                 e.printStackTrace();
    100             }finally{
    101                 //关闭流资源
    102                 try {
    103                     fs.close();
    104                 } catch (IOException e) {
    105                     // TODO Auto-generated catch block
    106                     e.printStackTrace();
    107                 }
    108                 try {
    109                     ow.close();
    110                 } catch (IOException e) {
    111                     // TODO Auto-generated catch block
    112                     e.printStackTrace();
    113                 }
    114                 try {
    115                     bw.close();
    116                 } catch (IOException e) {
    117                     // TODO Auto-generated catch block
    118                     e.printStackTrace();
    119                 }
    120             }
    121     }
    122 }
      <servlet>
        <servlet-name>NumServlet</servlet-name>
        <servlet-class>com.servlet.NumServlet</servlet-class>
        <load-on-startup>1</load-on-startup><!-- 配置Servlet服务器启动加载 -->
      </servlet>
  • 相关阅读:
    Max Sum of Max-K-sub-sequence(单调队列)
    Matrix Swapping II(求矩阵最大面积,dp)
    重温世界杯(贪心)
    Pie(求最小身高差,dp)
    Matrix(多线程dp)
    Python 实现自动导入缺失的库
    分布式系统session一致性解决方案
    数据结构 【链表】
    【数字图像处理】gamma变换
    【数字图像处理】顶帽变换和底帽变换
  • 原文地址:https://www.cnblogs.com/qiaoxin11/p/12907223.html
Copyright © 2011-2022 走看看