ServletContext 对象

ServletContext 对象

WEB 容器在启动时会为每个 WEB 应用程序都创建一个对应的 ServletContext 对象,它代表当前 Web 应用。ServletConfig 对象中维护了 ServletContext 对象的引用,开发人员在编写 Servlet 时,可以通过 ServletConfig.getServletContext() 方法获得 ServletContext 对象。由于一个 WEB 应用中的所有 Servlet 共享同一个 ServletContext 对象,因此 Servlet 对象之间可以通过 ServletContext 对象来实现通讯,ServletContext 对象通常也被称之为 context 域对象

除了通过 init 方法中传入的 ServletConfig 对象获取外,也可以直接在方法中调用:

String sitename = this.getServletConfig().getInitParameter("siteurl");Code language: JavaScript (javascript)

多个 Servlet 通过 ServletContext 实现数据共享

首先在一个 Servlet 中将数据存储到 ServletContext 中:

String data = "bamn";
ServletContext context = this.getServletConfig().getServletContext(); // 获得ServletContext对象
context.setAttribute("data", data);  // 将data存储到ServletContext对象中Code language: JavaScript (javascript)

然后在另一个 Servlet 中获取该值:

ServletContext context = this.getServletContext();
String data = (String) context.getAttribute("data"); // 从ServletContext对象中取出数据
response.getWriter().print(data);Code language: JavaScript (javascript)

setAttribute 方法可以存储 Object 类型的数据,例如:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ServletContext context = this.getServletConfig().getServletContext();
    context.setAttribute("weather", "sunny");
    response.getWriter().write("ddd");
}Code language: JavaScript (javascript)

在另一个 Servlet 中读取:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String sitename = this.config.getInitParameter("siteurl");
    response.getWriter().write(this.config.getServletContext().getAttribute("weather").toString());
}Code language: JavaScript (javascript)

上下文参数(WEB 应用级初始化参数)

前面配置的 Servlet 初始化参数仅对具体的某个 Servlet 生效。如果希望整个 Web 应用都能使用的参数,需要在 web.xml 中使用 <context-param> 标签配置,该标签直接放在 <web-app> 标签内,不要放在 <servlet> 标签中:

<context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost:3306/test</param-value>
</context-param>Code language: HTML, XML (xml)

在程序中获取该参数:

ServletContext context = this.getServletContext();
// 获取整个web站点的初始化参数
String contextInitParam = context.getInitParameter("url");Code language: JavaScript (javascript)

获取 ServletContext 不需要通过 ServletConfig 对象来调用,直接在 Servlet 中调用 this.getServletContext() 即可:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ServletContext context = this.getServletConfig().getServletContext();
    context.setAttribute("weather", "sunny");
    ServletContext context2 = this.getServletContext();
    response.getWriter().write(context2.getInitParameter("url"));
}Code language: JavaScript (javascript)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注