Servlet 的 ServletContext 对象


ServletContext

  • ServletContext 是一个容器(域对象),可以存储键值对数据 (String key, Object value),保存在 ServletContext 中的数据不仅可以提供给所有的 Servlet 使用,而且可以在整个项目范围内使用(后期的过滤器、监听器也可以使用 ServletContext)。
  • ServletContext 的主要作用有 3 个:
    1. 作为域对象;
    2. 可以获取当前应用下任何路径下的任何资源;
    3. 获取初始化参数。

1. ServletContext 作为域对象

  • ServletContext 是一个域对象, 域存储数据都是 setAttribute(key, value),也是键值对的形式存在,所以说和 map 很像。
  • ServletContext 中定义了很多方法,在 JavaWeb 中最常用的就是将 ServletContext 作为容器(域对象)使用。下面将介绍这个容器(域对象)的API。

a. API 介绍

  • GenericServlet:
ServletContext getServletContext() 获取ServletContext对象
  • ServletContext:
1. void setAttribute(String name, Object object) 往servletcontext容器中存入数据,name为数据名称,object为数据的值 
2. Object getAttribute(String name) 从ServletContext中获取数据,根据指定的数据名称 
3. void removeAttribute(String name) 从ServletContext中移除数据,根据指定的数据名称

b. 使用步骤

  1. 创建 ServletContextServlet1 和 ServletContextServlet2
  2. ServletContextServlet1 调用存方法
  3. ServletContextServlet2 调用取方法
  4. ServletContextServlet2 调用删方法
  5. ServletContextServlet2 调用取方法

c. 演示代码

  • ServletContextServlet1:
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ServletContextServlet1 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 {
        //获取容器
        ServletContext context = getServletContext();
        //存入数据
        context.setAttribute("addr", "广州");
    }
}
  • ServletContextServlet2:
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ServletContextServlet2 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 {
        //获取容器
        ServletContext context = getServletContext();
        //获取数据 
        String addr = (String) context.getAttribute("addr");
        System.out.println("存入之后,获取数据:" + addr);
        //移除数据 
        context.removeAttribute("addr");
        // 重新获取数据
        String addr2 = (String) context.getAttribute("addr");
        System.out.println("移除之后,获取数据:" + addr2);
    }
}
  • web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
    <servlet>
        <servlet-name>ServletContextServlet1</servlet-name>
        <servlet-class>ServletContextServlet1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletContextServlet1</servlet-name>
        <url-pattern>/context1</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>ServletContextServlet2</servlet-name>
        <servlet-class>ServletContextServlet2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletContextServlet2</servlet-name>
        <url-pattern>/context2</url-pattern>
    </servlet-mapping>
</web-app>

2. ServletContext 获取当前应用下任何路径下的任何资源

a. 其它方法

1. getRealPath(String path) 获取WEB项目的资源文件路径 
2. getResourceAsStream(String path) 根据WEB项目的文件获取流 
3. getInitParameter(String name) 获取初始化参数

b. 演示代码

  • 修改 ServletContextServlet2:
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;

public class ServletContextServlet2 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 servletContext = getServletContext();
        //2.获取WEB项目的资源文件路径
        String path = servletContext.getRealPath("/文件名");
        System.out.println(path);
        //3.根据WEB项目的文件获取流
        InputStream is = servletContext.getResourceAsStream("/文件名");
        System.out.println(is);
    }
}
  • getResourceAsStream 获取资源文件的输入流,这里没有资源文件,所以输出的是 null。

3. ServletContext 获取初始化参数

a. 项目初始化参数

  • ServletContext 表示当前项目环境,从这个对象中可以获取 web.xml 中配置的当前项目初始化参数。

b. 使用步骤

  1. 在 web.xml 中配置项目环境参数值;
  2. 在任意一个 Servlet 中取出当前项目环境参数值。

c. 演示代码

  1. 在 web.xml 中配置项目环境参数值
	<!-- 当前项目环境中的参数值-->
    <context-param>
        <param-name>contentType</param-name>
        <param-value>text/html;charset=UTF-8</param-value>
    </context-param>
    <!-- 演示当前项目环境中的参数值-->
    <servlet>
        <servlet-name>context</servlet-name>
        <servlet-class>ContextServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>context</servlet-name>
        <url-pattern>/context</url-pattern>
    </servlet-mapping>
  1. 在任意一个 Servlet 中取出当前项目环境参数值
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*** 获取当前项目环境中配置的参数值 * http://localhost:8080/webappPractice/context */
public class ContextServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        //获取当前项目环境对象
        String contentType = servletContext.getInitParameter("contentType");
        //取出项目环境对象中的参数contentType的值
        System.out.println("contentType = " + contentType);
        ServletConfig servletConfig = this.getServletConfig();//获取当前Servlet配置对象
        String myParam = servletConfig.getInitParameter("myParam");
        //取出当前Servlet配置对象中的参数值
        System.out.println("ConfigServlet myParam = " + myParam);//null
    }
}

4. ServletConfig 配置 Servlet 初始化参数

  • ServletConfig 表示当前 Servlet 的配置,从这个对象中可以获取 web.xml 中当前 Servlet 自己配置的当前 Servlet 初始化参数

a. 使用步骤

  1. 给一个 Servlet 配置初始化参数值;
  2. 在该 Servlet 中获取参数值。

b. 演示代码

  1. 给一个 Servlet 配置初始化参数值
    <!-- 演示当前Servlet中的参数值-->
    <servlet>
        <servlet-name>config</servlet-name>
        <servlet-class>ConfigServlet</servlet-class>
        <init-param>
            <param-name>myParam</param-name>
            <param-value>text/plain;charset=UTF-8</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>config</servlet-name>
        <url-pattern>/config</url-pattern>
    </servlet-mapping>
  1. 在该 Servlet 中获取参数值
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*** 获取当前Servlet中配置的参数值 * http://localhost:8080/webappPractice/config */
public class ConfigServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletConfig servletConfig = this.getServletConfig();
        //获取当前Servlet配置对象 
        String myParam = servletConfig.getInitParameter("myParam");
        //取出当前Servlet配置对象中的参数值 
        System.out.println("ServletConfig myParam = " + myParam);//有值 
    }
}

5. 案例: 统计访问次数

a. 主要需求

  • 有一个 Servlet(CountServlet),每访问一次这个 Servlet,将访问的次数 +1,当访问另一个 Servlet(ShowServlet)时,展示访问 CountServlet 的次数。

b. 分析

在这里插入图片描述

c. 步骤(pseudocode)

  • 创建 2 个 Servlet(CountServlet, ShowServlet)
  • CountServlet 中:
    • 获取 ServltContext
    • 从 ServletContext 中先获取一次数据
      • 无:count=1
      • 有:count=count+1
    • 将加完的数据重新存取覆盖进去
  • ShowServlet 中:
    • 获取 ServltContext
    • 从 ServletContext 中获取访问次数
      • 无:告诉浏览器没有访问量
      • 有:把访问量显示在浏览器上(response)

d. 实现

  • CountServlet:
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CountServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取ServletContext对象
        ServletContext servletContext = getServletContext();
        // 获取次数  
        Integer count = (Integer) servletContext.getAttribute("count");
        // 判断 
        if (count == null) {
            count = 1;
        } else {
            count = count + 1;
        }
        // 存进去 
        servletContext.setAttribute("count", count);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
  • ShowServlet:
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//展示访问次数 
public class ShowServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        // 获取ServletContext对象 
        ServletContext servletContext = getServletContext();
        // 获取访问次数 
        Object count = servletContext.getAttribute("count");
        // 判断 
        if (count == null) {
            response.getWriter().print("该网站的访问量为:0");
        } else {
            response.getWriter().print("该网站的访问量为:" + count);
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
  • 配置 web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
    <servlet>
        <servlet-name>CountServlet</servlet-name>
        <servlet-class>CountServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CountServlet</servlet-name>
        <url-pattern>/count</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>ShowServlet</servlet-name>
        <servlet-class>ShowServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ShowServlet</servlet-name>
        <url-pattern>/show</url-pattern>
    </servlet-mapping>
</web-app>
  • Web 服务器收到客户端的 HTTP 请求,会针对每一次请求分别创建一个用于代表请求的 request 对象和代表响应的 response 对象。如下图:
    在这里插入图片描述

原文链接:https://qwert.blog.csdn.net/article/details/105502335

发布了369 篇原创文章 · 获赞 381 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Regino/article/details/105502335