天天看点

java web 学习笔记(15)ServletContext 对象

ServletContext 对象

参考教程:https://www.w3cschool.cn/servlet/servlet-3ceg2p0t.html

1.ServletContext 对象简介

ServletContext是一个全局的储存信息的空间,服务器开始就存在,服务器关闭才释放。为了方便大家理解,我们将ServletContext和Cookie、Session做一个简单对比,如下图:

java web 学习笔记(15)ServletContext 对象

我们可以把ServletContext当成一个公用的空间,可以被所有的客户访问,如上图,A、B、C三个客户端都可以访问。

WEB容器在启动时,它会为每个Web应用程序都创建一个对应的ServletContext,它代表当前Web应用,并且它被所有客户端共享。

由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。公共聊天室就会用到它。

当web应用关闭、Tomcat关闭或者Web应用reload的时候,ServletContext对象会被销毁。

2.使用ServletContext对象

(1)怎么得到 ServletContext对象

this.getServletContext();
this.ServletConfig().getServletContext();
           

主要有以上两种方法来获取ServletContext对象。

(2)使用ServletContext对象

你可以把它想象成一张表,这个和Session非常相似:每一行就是一个属性

和其对应的value值,可以用来存储信息。

添加属性:setAttribute(String name, Object obj);
得到值:getAttribute(String name),这个方法返回Object
删除属性:removeAttribute(String name)
           

3.实例

这个实例演示,一个Servlet向ServletContext对象写入信息。另一个Servlet读取Servlet对象的信息。(Context1写入信息,Context2读取信息)

Context1代码如下:

package context;
import java.io.IOException;
import java.io.PrintWriter;
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;
@WebServlet("/Context1")
public class Context1 extends HttpServlet {
 private static final long serialVersionUID = 1L;
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  PrintWriter out = response.getWriter();
  ServletContext context = this.getServletContext();
  context.setAttribute("name", "qak");
  context.setAttribute("password", "20174044");
  out.println("Context1->Context Finished writing information!");
 }
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  doGet(request, response);
 }
}

           

访问结果:

java web 学习笔记(15)ServletContext 对象

Context2 代码如下:

package context;

import java.io.IOException;
import java.io.PrintWriter;
//import java.util.Enumeration;
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;

@WebServlet("/Context2")
public class Context2 extends HttpServlet {

 private static final long serialVersionUID = 1L;
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  PrintWriter out=response.getWriter();
  ServletContext context = this.getServletContext();
  //Enumeration<String> info= context.getAttributeNames();
  out.println("Context_information: <br /><br />");
  out.println("name : "+(String)context.getAttribute("name")+"<br />"+
     "password : "+(String)context.getAttribute("password"));
     
  //out.println("All Context information: <br /><br />");
  // 获取Context所有对象的属性和值
  /*
  while(info.hasMoreElements()) {
   String key=info.nextElement();
   out.println(key+" : "+context.getAttribute(key)+"<br />");
  }*/
 }
 
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  doGet(request, response);
 }
}
           

访问结果:

java web 学习笔记(15)ServletContext 对象

4.ServletContext对象的应用

1、多个Servlet可以通过ServletContext对象来实现数据间的共享

类似于Session,通过ServletContext对象我们也可以实现数据共享,但值得注意的是,Session是只能在一个客户端中共享数据,而ServletContext中的数据是在所有客户端中都可以实现数据共享的。

2、实现Servlet的请求转发

之前我们学过的请求转发是通过request对象的:

request.getRequestDispatcher("/url").forward(request, response);
           

这里要说明的是,ServletContext也可以实现请求转发:

this.getServletContext().getRequestDispatcher("/url").forward(request, response); 
           

这两个转发效果是一样的。

3、获取Web应用的初始化参数

我们可以用标签为servlet配置初始化参数,然后使用ServletConfig对象获取这些参数,假如有如下的MyServlet,它的配置为:

<servlet>  
    <servlet-name>MyServlet</servlet-name>  
    <servlet-class>com.gavin.servlet.MyServlet</servlet-class>  
    <init-param>  
        <param-name>encoding</param-name>  
        <param-value>utf-8</param-value>  
    </init-param>  
</servlet>  
           

可以看到它配置了一个初始化参数:encoding=utf-8,那么我们在MyServlet的源代码中需要这样去得到这个参数:

String encoding = this.getServletConfig().getInitParameter(“encoding”);

注意,上述的参数配置方法只针对一个特定的Servlet有效,我们可以通过ServletContext来获取全局的、整个Web应用的初始化参数,全局的初始化参数是这样配置在web.xml文件中的:

<context-param>
    <param-name>name</param-name>
    <param-value>gavin</param-value>
</context-param>
           

然后我们可以在任意一个Servlet中使用ServletContext获取这个参数:

String name = this.getServletContext().getInitParameter(“name”);

在网站开发中,有很多功能要使用ServletContext,比如

  1. 网站计数器
  2. 网站的在线用户显示
  3. 简单的聊天系统

    总之,如果是涉及到不同用户共享数据,而这些数据量不大,同时又不希望写入数据库中,我们就可以考虑使用ServletContext实现。

ServletContext使用建议

因为存在ServletContext中的数据在服务器中会长时间,这样就会占用很多内存,因此在使用ServletContext时,建议不要往里面添加过大的数据!