ServletContext和ServletConfig

Servlet系列ServletContext和ServletConfig:

不同用户数据共享怎么办?

ServletContext:

运行在JVM上的每一个web应用程序都有一个与之对应的Servlet上下文(Servlet运行环境)

Servlet API提供ServletContext接口用来表示Servlet上下文,ServletContext对象可以被web应用程序中的所有servlet访问

ServletContext对象是web服务器中的一个已知路径的根

原理:

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

api:

代码:

package com.wp.controller;/*
 *@author wupeng
 *@time 2021/6/22-21:44
ServletContext:用来解决不同用户的数据共享问题
特点:
    1.由服务器创建,
    2.所有用户共享同一个ServletContext中的属性
    3.所有的servlet都可以访问到用一个ServletContext中的属性
    4.每一个wen项目对应的是一个ServletContext
用法:
    获取ServletContext对象三种方式
    向ServletContext中设置属性值
    其他用途:
    1.获取web.xml中配置的公共属性
        在web中添加公共属性,
       如果有多组公共属性,使用多个Context-param
     2.获取项目的虚拟目录路径
     3.获取某个资源的绝对路径
 */

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("/context")
public class ServletContextServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("gbk");

        //获取ServletContext对象 三种获取方式
        //1
        ServletContext context = this.getServletContext();
        //2
        ServletContext context1 = this.getServletConfig().getServletContext();
        //3
        ServletContext context2 = req.getSession().getServletContext();

        System.out.println(context==context1);
        System.out.println(context==context2);  //结果显示三者获取的是同一个对象

//        设置属性值
        context.setAttribute("111","张三");
        //    1.获取web.xml中配置的公共属性
        String beijing = context.getInitParameter("beijing");
        System.out.println(beijing);

        //获取某个文件的绝对路径
        String realPath = context.getRealPath("web.xml");
        System.out.println(realPath);

//        获取web程序的上下文路径
        String contextPath = context.getContextPath();
        System.out.println(contextPath);
    }
}

案例:网站计数器

package com.wp.controller;/*
 *@author wupeng
 *@time 2021/6/22-22:07

 */

import javax.servlet.HttpConstraintElement;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/num")
public class NumServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       req.setCharacterEncoding("utf-8");
       resp.setContentType("utf-8");
       //获取ServletContext对象
        ServletContext context = this.getServletContext();
        //获取属性值
        Integer num = (Integer) context.getAttribute("num");
        if(num == null) {
            context.setAttribute("num",1);
        } else {
            num++;
            //实现每次访问+1
            //将num设置servletcontext中
            context.setAttribute("num",num);
        }
        //获取输出对象
        resp.getWriter().write("用户访问的次数是:"+context.getAttribute("num"));
    }
}

ServletConfig:

作用:ServletConfig对象是Servlet的专属配置对象,每个Servlet都单独拥有一个ServletConfig对象,用来获取web.xml中的配置信息

使用:

获取ServletConfig对象

获取web.xml中的servlet配置信息

package com.wp.controller;/*
 *@author wupeng
 *@time 2021/6/22-22:17
ServletConfig:
作用:方便每一个Servlet获取自己的单独的属性配置
特点:每一个Servlet单独用有一个ServletConfig对象
使用:
        获取值
        获取所有的key值
 */

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

public class ServletConfigServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("gbk");
        //获取对象
        ServletConfig config = this.getServletConfig();
        String china = config.getInitParameter("china");
        System.out.println(china);

        //获取所有的key
        Enumeration<String> names = config.getInitParameterNames();
        while(names.hasMoreElements()) {
            String s = names.nextElement();
            String initParameter = config.getInitParameter(s);
            System.out.println(initParameter);
        }

    }
}

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>beijing</param-name>
        <param-value>butiful</param-value>
    </context-param>
    <servlet>
        <servlet-name>ServletConfig</servlet-name>
        <servlet-class>com.wp.controller.ServletConfigServlet</servlet-class>
        <init-param>
            <param-name>china</param-name>
            <param-value>beijing</param-value>
        </init-param>
        <init-param>
            <param-name>hebei</param-name>
            <param-value>shijiazhaung</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletConfig</servlet-name>
        <url-pattern>/config</url-pattern>
    </servlet-mapping>

</web-app>
posted @ 2021-06-23 22:19  IT小五  阅读(86)  评论(0)    收藏  举报