作者信息

作者姓名:金云龙

个人站点:http://www.longestory.com

个人公众帐号:搜索“longestory”或“龙哥有话说

ServletContext概述

ServletContext对象是Servlet三大域对象之中的一个,每一个Web应用程序都拥有一个ServletContext对象,该对象是Web应用程序的全局对象或者上下文。Tomcatserver在启动时,会自己主动创建一个ServletContext对象,在关闭时,会自己主动销毁这个ServletContext对象。每一个Web应用程序仅仅拥有一个ServletContext对象,ServletContext对象能够在整个Web应用中共享数据资源。

下列是ServletContext提供的方法列表:

Method Summary
Object getAttribute(String name)
Enumeration getAttributeNames()
String getInitParameter(String name)
Enumeration getInitParameterNames()
String getMimeType(String file)
String getRealPath(String path)
String getServletContextName()
Enumeration getServletNames()
void log(String msg)
void removeAttribute(String name)
void setAttribute(String name, Object object)

获取ServletContext对象

在自己定义Servlet中有以下几种方式获取到ServletContext对象:

  • 通过ServletConfig对象的getServletContext()方法获取。

  • 通过继承GenericServlet类或HttpServlet类,调用GenericServlet类或HttpServlet类的getServletContext()方法获取。

我们通过一个案例来讨论一下。

  • 首先,创建一个自己定义Servlet。用来获取ServletContext对象。

public class AServlet extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
ServletConfig config = getServletConfig();
ServletContext context1 = config.getServletContext();
context1.log("这是通过ServletConfig对象获取到的ServletContext对象.");
ServletContext context2 = getServletContext();
context2.log("这是通过继承GenericServlet类获取到的ServletContext对象.");
}
}
  • 在web.xml文件里配置Servlet相关信息。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
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">
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>app.java.context.AServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/servlet/AServlet</url-pattern>
</servlet-mapping>
</web-app>

  • 通过ServletContext对象的log(Stirng msg)方法,能够向控制台信息打印。

配置全局初始化參数

在web.xml文件里,使用定义的初始化參数。仅仅能在当前Servlet中使用,而其它Servlet是无权限訪问当前Servlet下配置的初始化參数的。而能够使用ServletContext在web.xml文件里配置全局初始化參数,这样当前Web应用程序中的全部Servlet都能够訪问。

  • 在web.xml文件里使用<context-param>来定义全局初始化參数。
<?

xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
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">
<context-param>
<param-name>weixin</param-name>
<param-value>longestory</param-value>
</context-param>
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>app.java.context.AServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/servlet/AServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>BServlet</servlet-name>
<servlet-class>app.java.context.BServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BServlet</servlet-name>
<url-pattern>/servlet/BServlet</url-pattern>
</servlet-mapping>
</web-app>
  • 在两个自己定义Servlet中。分别利用ServletContext对象获取全局初始化參数。
public class BServlet extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
ServletContext context = getServletContext(); String weixin = context.getInitParameter("weixin");
System.out.println(weixin);
}
}

在自己定义Servlet中,能够通过ServletContext对象的getInitParameter(String name)方法获取相应參数名称的全局初始化參数值。也能够通过ServletContext对象的getInitParameterNames()方法获取全部全局初始化參数的名称。

还能够通过ServletContext对象的getMineType(String file)方法依据文件扩展名获取文件MIME类型。

public class BServlet extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
ServletContext context = getServletContext(); String html = context.getMimeType("1.html");
String css = context.getMimeType("2.css");
String javascript = context.getMimeType("3.js");
System.out.println("HTML的文件类型为"+html+", CSS的文件类型为"+css+", javascript的文件类型为"+javascript);
}
}

公布Web应用程序,并启动Tomcatserver,在控制台中打印:

HTML的扩展名为text/html, CSS的扩展名为text/css, javascript的扩展名为application/javascript

ServletContext对象的getMineType(String file)方法会自己主动读取Tomcat安装文件夹中conf文件夹中的web.xml文件。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
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">
<mime-mapping>
<extension>html</extension>
<mime-type>text/html</mime-type>
</mime-mapping>
<mime-mapping>
<extension>css</extension>
<mime-type>text/css</mime-type>
</mime-mapping>
<mime-mapping>
<extension>js</extension>
<mime-type>application/javascript</mime-type>
</mime-mapping>
</web-app>

多个Servlet共享数据

在同一个Web应用程序中,多个Servlet之间能够共享ServletContext对象中的数据信息。

主要是通过ServletContext对象的setAttribute(String name, Object object)方法和getAttribute(String name)方法完毕,以下我们来实现统计站点訪问次数的案例。

  • 创建一个VisitServlet用来获取訪问次数。并存储在ServletContext对象中。
public class VisitServlet extends HttpServlet {
@Override
public void init() throws ServletException {
ServletContext context = getServletContext();
context.setAttribute("times", 0);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext(); int times = (Integer)context.getAttribute("times");
times ++;
context.setAttribute("times", times);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
  • 创建一个ShowTimeServlet用来显示訪问次数。
public class ShowTimeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext(); int times = (Integer)context.getAttribute("times"); response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<h1>VisitServlet共被訪问了"+times+"次</h1>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
  • 配置web.xml文件里有关Servlet信息。
<web-app version="2.5"
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">
<servlet>
<servlet-name>VisitServlet</servlet-name>
<servlet-class>app.java.context.VisitServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>ShowTimeServlet</servlet-name>
<servlet-class>app.java.context.ShowTimeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>VisitServlet</servlet-name>
<url-pattern>/visit</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ShowTimeServlet</servlet-name>
<url-pattern>/show</url-pattern>
</servlet-mapping>
</web-app>

读取Webproject中资源文件

读取project中的资源文件,Java中的IO流事实上就能够完毕,以下使用Java中的IO流完毕读取资源文件。

  • 首先在Webproject中,创建四个资源文件。

    • 在Webproject的根文件夹下创建1.txt。

    • 在Webproject的WebRoot文件夹下创建2.txt。
    • 在Webproject的WebRoot文件夹的WEB-INF文件夹下创建3.txt。
    • 在Webproject的src文件夹下创建4.txt。

  • 创建一个Java文件用于读取上述的四个资源文件。
public class ReaderFileTest {
// 编写readfile()方法完毕资源文件的读取工作.
public static void readfile(String fileName) throws Exception{
BufferedReader reader = new BufferedReader(new FileReader(fileName));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
} public static void main(String[] args) throws Exception {
// 读取1.txt
String filename1 = "1.txt";
readfile(filename1);
// 读取2.txt
String filename2 = "WebRoot/2.txt";
readfile(filename2);
// 读取3.txt
String filename3 = "WebRoot/WEB-INF/3.txt";
readfile(filename3);
// 读取4.txt
String filename4 = "src/4.txt";
readfile(filename4);
}
}
  • 执行该Java文件会在控制台打印响应信息。

假设要想利用Servlet API的内容来读取Webproject中的资源文件,又要怎样来做呢?ServletContext对象的getRealPath()方法能够来完毕此项工作。

  • 创建一个自己定义Servlet,使用ServletContext对象的getRealPath()方法来完毕读取资源文件。

public class ReadFileServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
OutputStream out = response.getOutputStream();
/*
* 读取1.txt
* * 由于1.txt资源文件在Webproject的根文件夹.
* * Webproject的WebRoot文件夹公布到Tomcatserver.
* * 所以,1.txt资源文件是不会公布到Tomcatserver的,Servlet无法读取.
*/
// 读取2.txt
String filename2 = getServletContext().getRealPath("/2.txt");
InputStream in2 = new FileInputStream(new File(filename2));
IOUtils.copy(in2, out);
// 读取3.txt
String filename3 = getServletContext().getRealPath("/WEB-INF/3.txt");
InputStream in3 = new FileInputStream(new File(filename3));
IOUtils.copy(in3, out);
// 读取4.txt
String filename4 = getServletContext().getRealPath("/WEB-INF/classes/4.txt");
InputStream in4 = new FileInputStream(new File(filename4));
IOUtils.copy(in4, out);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}

除了能够使用ServletContext对象的getRealPath()方法之外,还能够使用ServletContext对象的getResourceAsStream()方法来完毕读取资源文件的工作。

public class ReadFileServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
InputStream in = getServletContext().getResourceAsStream("/WEB-INF/classes/4.txt");
IOUtils.copy(in, out);
} public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}

另一种通用的方法:利用Class类的getResource()方法也能够完毕读取资源文件的工作。

public class ReadFileServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 利用类载入器读取Webproject的资源文件
String filename = ReadFileServlet.class.getResource("/4.txt").getFile();
InputStream in = new FileInputStream(new File(filename));
IOUtils.copy(in, out);
} public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}

转载说明:请注明作者及原文链接。谢谢!

[Servlet]研究ServletContext对象的更多相关文章

  1. 2.深入学习Servlet的ServletContext对象

    一.建立项目servlet01 在入门Servlet项目中建立一个子项目模块(此处不再赘述如何建立),补全maven项目中的java和resources文件夹,添加类HelloServlet.java ...

  2. Servlet(2):通过servletContext对象实现数据共享

    一,ServletContext介绍 web容器在启动时,它会为每一个web应用程序都创建一个ServletContext对象,它代表当前web应用 多个Servlet通过ServletContext ...

  3. ServletConfig与ServletContext对象(接口)

    ServletConfig:封装servlet的配置信息. 在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数. <ser ...

  4. servlet ServletConfig ServletContext

    ServletConfig对象 在Servlet的配置文件中,可以使用一个或者多个<init-param>标签为servlet配置一些初始化参数. 当servlet配置了初始化参数后,we ...

  5. 重温Servlet学习笔记--servletContext对象

    一个项目中只有一个ServletContext对象,我们可以在多个servlet中获取这个唯一的对象,使用它可以给多个servlet传递数据,我们通常成servletContext为上下文对象.这个对 ...

  6. 在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法

    今天遇到了一个在servlet的service方法中获取ServletContext对象出现java.lang.NullPointerException(空指针)异常,代码如下: 1 //获取Serv ...

  7. Java Servlet(三):Servlet中ServletConfig对象和ServletContext对象

    本文将记录ServletConfig/ServletContext中提供了哪些方法,及方法的用法. ServletConfig是一个抽象接口,它是由Servlet容器使用,在一个servlet对象初始 ...

  8. day05 Servlet 开发和 ServletConfig 与 ServletContext 对象

    day05 Servlet 开发和 ServletConfig 与 ServletContext 对象 1. Servlet 开发入门 - hello world 2. Servlet 的调用过程和生 ...

  9. Servlet(八):ServletContext对象和ServletConfig对象

    ServletContext 对象:问题: Request 解决了一次请求内的数据共享问题,session 解决了用户不同请求的数据共享问题,那么不同的用户的数据共享该怎么办呢?解决: 使用 Serv ...

随机推荐

  1. JS实现文字图片无缝滚动

    今天做项目遇到一个滚动的效果,本来打算用marquee做的,因为它是html自带的标签,写起来简单,但是有一个问题就是marquee不能实现无缝滚动,上网找了一些方法,发现marquee可以实现无缝, ...

  2. Sequences of sequences

    I have focused on lists of tuples, but almost all the examples in this chapter also work with lists ...

  3. [学习笔记]node.js中的path.extname方法

    path.extname 返回path路径文件扩展名,如果path以 ‘.' 为结尾,将返回 ‘.',如果无扩展名 又 不以'.'结尾,将返回空值. path.extname('index.html' ...

  4. BZOJ 2251 Trie树

    思路: i~n加到Trie树里 经过的边权+1 DFS一遍 搞定~ //By SiriusRen #include <cstdio> #include <cstring> #i ...

  5. 如何配置MySQL?(三)

    要进行mysql配置,首先要找到mysql的配置向导文件,这个配置向导文件就在我们安装目录下的一个bin的子目录下. 刚才我们是选择典型安装MySQL,一般windows是默认存储在C:\Progra ...

  6. Linux环境下源码安装PostgreSQL

    1.下载PostgreSQL源码包,并保存到Linux操作系统的一个目录下 2.解压PostgreSQL源码包 :tar zxvf postgresql-9.2.4.tar.gz 或 tar jxvf ...

  7. 去除input的前后的空格

    这里用的是jquery的方法

  8. 洛谷 P2630 图像变换

    P2630 图像变换 题目描述 给定3行3列的图像各像素点灰度值,给定最终图像,求最短.字典序最小的操作序列. 其中,可能的操作及对应字符有如下四种: A:顺时针旋转90度: B:逆时针旋转90度: ...

  9. 绿色版SecureCRT启动崩溃,遇到一个致命的错误且必须关闭

    百度搜了半天,大家都是说删除注册表的VanDyke就能解决问题,但是我用的是绿色版的,删除VanDyke后还不行. 然后试了一下重新解压出一个绿色版的SecureCRT,发现能用. 但之前我配置了很多 ...

  10. 怎样查看电脑的IP地址

    在DOW窗体 :cmd->ipconfig 见截图: