一篇文章学透ServletContext

ServletContext-作用1(重要)

(1)什么是ServletContext

ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象

  1. ServletContext是Servlet中自带一个对象
  2. ServletContext对象时在第一次访问Servlet时,自动创建
  3. 一个项目中只有一个ServletContext对象
    在这里插入图片描述
    Servlet1可以往ServletContext添加键值对数,所有的Servlet都可以取

1.2. 作用

  1. 是一个域对象

  2. 可以读取全局配置参数

  3. 可以搜索当前工程目录下面的资源文件

  4. 可以获取当前工程名字(了解)

1.2.1 servletContext是一个域对象

1.2.1.1 域对象介绍

域对象是服务器在内存上创建的存储空间,用于在不同动态资源(servlet)之间传递与共享数据。

1.2.1.2 域对象方法

(2) 作用1:ServletContext可以实现多个Servlet之间数据的共享

方法作用
setAttribute(name,value);name是String类型,value是Object类型;往域对象里面添加数据,添加时以key-value形式添加
getAttribute(name);根据指定的key读取域对象里面的数据
removeAttribute(name);根据指定的key从域对象里面删除数据
1.2.1.3 域对象功能代码
1.域对象存储数据AddDataServlet代码

src\com\wzx\Demo01SetServlet.java

@WebServlet("/set")
public class Demo01SetServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1:获取ServletContext
        ServletContext context =  super.getServletContext();
        //2:添加数据  key-value 集合 Map
        context.setAttribute("name","jack");
        context.setAttribute("age",22);

        System.out.println("setServlet");

    }
}

2.获取域对象数据Demo02GetServlet代码

src\com\wzx\Demo02GetServlet.java

@WebServlet("/get")
public class Demo02GetServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1.获取servletContext
        ServletContext context = getServletContext();
        //2.根据键获取值
        String name = (String) context.getAttribute("name");
        Integer age = (Integer) context.getAttribute("age");
        System.out.println(name);
        System.out.println(age);
    }
}


servletContext存储数据特点,

全局共享,里面的数据所有动态资源都可以写入和获取

服务器启动的时候创建,服务器关闭的时候销毁,因为这是全局应用程序对象,全局共享对象。

1.2.2 ServletContext可以读取web项目中文件的内容

src下的文件:

InputStream is=Demo3FileServlet.class.getClassLoader().getResourceAsStream("a.txt");

web目录下文件

InputStream is = getServletContext().getResourceAsStream("a.txt");
src\com\wzx\Demo03FileServlet.java

src\com\wzx\Demo03FileServlet.java

@WebServlet("/file")
public class Demo03FileServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1:java使用类加载器去读取
        //InputStream inputStream = Demo03FileServlet.class.getClassLoader().getResourceAsStream("a.txt");
        InputStream inputStream = getServletContext().getResourceAsStream("b.txt");
        //2:将字节流转成字符流
        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
        String line = br.readLine();
        response.setCharacterEncoding("utf-8");
        response.getWriter().println(line);
        System.out.println(line);
    }
}

1.2.3 可以读取全局配置参数(了解)

1.2.3.1 servletContext读取全局参数核心方法
getServletContext().getInitParameter(name);//根据指定的参数名获取参数值
getServletContext().getInitParameterNames();//获取所有参数名称列表
1.2.3.2 实现步骤:
  1. 在web.xml中配置全局参数
 <!-- 全局配置参数,因为不属于任何一个servlet,但是所有的servlet都可以通过servletContext读取这个数据 -->

  <context-param>
         <param-name>param1</param-name>
         <param-value>value1</param-value>
  </context-param>
   <context-param>
         <param-name>param2</param-name>
         <param-value>value2</param-value>
  </context-param>

  1. 在动态资源servlet里面使用servletcontext读取全局参数代码
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
           //使用servletContext读取全局配置参数数据
           //核心方法
           /*getServletContext().getInitParameter(name);//根据指定的参数名获取参数值
           getServletContext().getInitParameterNames();//获取所有参数名称列表*/
           //打印所有参数
           //1.先获取所有全局配置参数名称
           Enumeration<String> enumeration =  getServletContext().getInitParameterNames();
           //2.遍历迭代器
           while(enumeration.hasMoreElements()){
                    //获取每个元素的参数名字
                    String parameName = enumeration.nextElement();
                    //根据参数名字获取参数值
                    String parameValue = getServletContext().getInitParameter(parameName);
                    //打印
                    System.out.println(parameName+"="+parameValue);
           }
         }

ServletContext实战 一个网站被多少用户登录访问

在这里插入图片描述
比如 三个人 通过LoginServlet登录成功,那必须让LoginServlet 对count值三次+1

在前面的登录案例里面修改

(1)初始化count值

src\com\wzx\web\LoginServlet.java

   @Override
    public void init() throws ServletException {
        //Servlet创建出来,ServletContext也会创建出来
        //1:获取ServletContext
        ServletContext context = getServletContext();
        //2:添加一个count变量,默认值为0
        context.setAttribute("count",0);
    }

(2)每次登录成功对count值+1

src\com\wzx\web\LoginServlet.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1:获取参数
        String username=request.getParameter("username");
        String password=request.getParameter("password");
        //2:处理参数
        UserService userService = new UserService();
        //2.1登录就是拿着账号,密码去数据库判断,存在就返回true,否则就返回false
        boolean result =  userService.login(username,password);
        response.setCharacterEncoding("utf-8");
        //2.2根返回结果提示用户
        if(result){
            //登录成功,对count值+1
            //a.获取servletContext
            ServletContext context = getServletContext();
            //b.获取里面的count
            Integer count= (Integer) context.getAttribute("count");
            //c. count + 1
            count += 1;
            //d. 放回ServletContext
            context.setAttribute("count",count);
            //3:响应给浏览器
            response.getWriter().println("登录成功,您是第"+count+"个登录");
        }else{
            response.getWriter().println("账号或者密码出错");
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值