[Servlet]研究ServletContext对象
作者信息
作者姓名:金云龙
个人站点: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>
- 将Web应用程序公布到Tomcatserver,并启动Tomcatserver。
- 打开浏览器。在地址栏中输入http://localhost:8080/08_servlet/servlet/AServlet,在控制台打印相关信息。
- 通过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);
}
}
- 将Web应用程序公布到Tomcatserver。并启动Tomcatserver。
- 打开浏览器,在地址栏中分别输入http://localhost:8080/08_servlet/servlet/AServlet和http://localhost:8080/08_servlet/servlet/BServlet,在控制台打印相关信息。
在自己定义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>
- 公布Web应用程序到Tomcatserver,并启动Tomcatserver。
- 打开浏览器。在地址栏输入http://localhost:8080/08_servlet/visit。訪问VisitServlet。
- 再新打开浏览器。在地址栏输入http://localhost:8080/08_servlet/show。显示訪问次数。
读取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);
}
}
- 公布Web应用程序到Tomcatserver。并启动Tomcatserver。
- 打开浏览器。在地址栏中分别输入http://localhost:8080/08_servlet/read,在控制台打印相关信息。
除了能够使用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对象的更多相关文章
- 2.深入学习Servlet的ServletContext对象
一.建立项目servlet01 在入门Servlet项目中建立一个子项目模块(此处不再赘述如何建立),补全maven项目中的java和resources文件夹,添加类HelloServlet.java ...
- Servlet(2):通过servletContext对象实现数据共享
一,ServletContext介绍 web容器在启动时,它会为每一个web应用程序都创建一个ServletContext对象,它代表当前web应用 多个Servlet通过ServletContext ...
- ServletConfig与ServletContext对象(接口)
ServletConfig:封装servlet的配置信息. 在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数. <ser ...
- servlet ServletConfig ServletContext
ServletConfig对象 在Servlet的配置文件中,可以使用一个或者多个<init-param>标签为servlet配置一些初始化参数. 当servlet配置了初始化参数后,we ...
- 重温Servlet学习笔记--servletContext对象
一个项目中只有一个ServletContext对象,我们可以在多个servlet中获取这个唯一的对象,使用它可以给多个servlet传递数据,我们通常成servletContext为上下文对象.这个对 ...
- 在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法
今天遇到了一个在servlet的service方法中获取ServletContext对象出现java.lang.NullPointerException(空指针)异常,代码如下: 1 //获取Serv ...
- Java Servlet(三):Servlet中ServletConfig对象和ServletContext对象
本文将记录ServletConfig/ServletContext中提供了哪些方法,及方法的用法. ServletConfig是一个抽象接口,它是由Servlet容器使用,在一个servlet对象初始 ...
- day05 Servlet 开发和 ServletConfig 与 ServletContext 对象
day05 Servlet 开发和 ServletConfig 与 ServletContext 对象 1. Servlet 开发入门 - hello world 2. Servlet 的调用过程和生 ...
- Servlet(八):ServletContext对象和ServletConfig对象
ServletContext 对象:问题: Request 解决了一次请求内的数据共享问题,session 解决了用户不同请求的数据共享问题,那么不同的用户的数据共享该怎么办呢?解决: 使用 Serv ...
随机推荐
- JS实现文字图片无缝滚动
今天做项目遇到一个滚动的效果,本来打算用marquee做的,因为它是html自带的标签,写起来简单,但是有一个问题就是marquee不能实现无缝滚动,上网找了一些方法,发现marquee可以实现无缝, ...
- Sequences of sequences
I have focused on lists of tuples, but almost all the examples in this chapter also work with lists ...
- [学习笔记]node.js中的path.extname方法
path.extname 返回path路径文件扩展名,如果path以 ‘.' 为结尾,将返回 ‘.',如果无扩展名 又 不以'.'结尾,将返回空值. path.extname('index.html' ...
- BZOJ 2251 Trie树
思路: i~n加到Trie树里 经过的边权+1 DFS一遍 搞定~ //By SiriusRen #include <cstdio> #include <cstring> #i ...
- 如何配置MySQL?(三)
要进行mysql配置,首先要找到mysql的配置向导文件,这个配置向导文件就在我们安装目录下的一个bin的子目录下. 刚才我们是选择典型安装MySQL,一般windows是默认存储在C:\Progra ...
- Linux环境下源码安装PostgreSQL
1.下载PostgreSQL源码包,并保存到Linux操作系统的一个目录下 2.解压PostgreSQL源码包 :tar zxvf postgresql-9.2.4.tar.gz 或 tar jxvf ...
- 去除input的前后的空格
这里用的是jquery的方法
- 洛谷 P2630 图像变换
P2630 图像变换 题目描述 给定3行3列的图像各像素点灰度值,给定最终图像,求最短.字典序最小的操作序列. 其中,可能的操作及对应字符有如下四种: A:顺时针旋转90度: B:逆时针旋转90度: ...
- 绿色版SecureCRT启动崩溃,遇到一个致命的错误且必须关闭
百度搜了半天,大家都是说删除注册表的VanDyke就能解决问题,但是我用的是绿色版的,删除VanDyke后还不行. 然后试了一下重新解压出一个绿色版的SecureCRT,发现能用. 但之前我配置了很多 ...
- 怎样查看电脑的IP地址
在DOW窗体 :cmd->ipconfig 见截图: