ServletContext
1. ServletContet 概述
- 一个项目只有一个 ServletContext 对象;
- ServletContext 对象在服务器启动时创建;
- ServletContext 对象在服务器关闭时销毁;
- ServletContext 的生命周期: 与天地同寿!!!
ServletContext 对象的作用: 在整个 Web 应用的动态资源之间共享数据!例如在 AServlet 中向
ServletContext 对象中保存一个值,然后在 BServlet 中就可以获取这个值.
2. 获取 ServletContext
- ServletConfig 类中有 getServletContext() 方法
// 1. 在 Servlet 接口中获取 ServletContext 对象
public class MyServlet implements Servlet{
public void init(ServletConfig config){
ServletContext context = config.getServletContext();
}
}
// 2. 在 GenericServlet 或 HttpServlet 中获取 ServletContext 对象
public class Myservlet extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse resp){
ServletContext context = this.getServletContext();
}
}
// 3. HttpSession 中也有 getServletContext() 方法
// 4. ServletContextEvent 中也有 getServletContext() 方法
3. 域对象的功能
- JavaWeb 四大域对象:
- PageContext;
- ServletRequest;
- HttpSession;
- application(ServletContext);
- 所有域对象都有存储数据的功能, 因为域对象内部有一个 Map, 用来存储数据.
- ServletContext 对象用来操作数据的方法
// 存储一个对象, 也称为存储一个域属性.
// 多次使用相同 name 调用该方法, 会覆盖上一次的值
void setAttribute(String name, Object value);
// 获取 ServletContext 中的数据
Object getAttribute(String name);
// 移除 ServletContext 中的域属性
void removeAttribute(String name);
// 获取所有域属性的名称
Enumeration getAttributeNames();
4. 获取应用初始化参数
- 可以使用 ServletContext 来获取 web.xml 文件中配置的应用初始化参数!
注意, 应用初始化参数与 Servlet 初始化参数不同
<web-app>
// 应用初始化参数
<context-param>
<param-name>paramName2</param-name>
<param-value>paramValue2</param-value>
</context-param>
<context-param>
<param-name>paramName3</param-name>
<param-value>paramValue3</param-value>
</context-param>
</web-app>
5. 获取资源相关方法
// 1. 获取真实路径
// 获取 a.jsp 的真实路径, 返回值为: F:\tomcat6\webapps\hello\a.jsp
String realPath = servletContext.getRealPath("/a.jsp");
// 获取 b.jsp 的真实路径
String realPath = servletContext.getRealPath("/WEB-INF/b.jsp");
// 2. 获取资源流
// 获取 a.jsp 资源流
InputStream in = servletContext.getResourceAsStream("/a.jsp");
// 获取 b.jsp 资源流
InputStream in = servletContext.getResourceAsStream("WEB-INF/b.jsp");
// 3. 获取指定目录下所有资源路径
// 获取 /WEB-INF 下所有资源的路径
Set set = servletContext.getResourcePaths("/WEB-INF");
6. 练习: 访问量统计
ServletContext application = this.getServletContext();
Integer count = (Integer)application.getAttribute("count");
if(count == null){
count = 1;
} else {
count++;
}
response.setContextType("text/html;charset=utr-8");
// 向浏览器输出 count 值
response.getWriter().print("<h1>本页面一共被访问" + count + "次! </h1>");
application.setAttribute("count", count); // 将 count 值保存回 servletContext 中
7. 获取类路径下的资源
- 类路径对一个 JavaWeb 项目而言, 就是 "/WEB-INF/classes" 下的文件, 以及 "/WEB-INF/lib"下的 jar 包;
- 有两种方式:
- Class (了解)
- ClassLoader
- 步骤:
- 得到 Class;
- 得到 ClassLoader;
- 调用其 getResourceAsStream() 方法, 得到一个 InputStream
// 1. 使用 ClassLoader 获取类路径下的资源
// 获取 src 目录下的 a.txt
// 获取 ClassLoader
ClassLoader c2 = this.getClass().getClassLoader();
// 得到 InputStream
InputStream in = c2.getResourceAsStream("a.txt"); // 该路径相对于 classes 路径, 即 src 目录下
// 将输入流转换成字符串, 使用 commons-io-2.5 的 jar 包中的 IOUtils 工具
String s = IOUtils.toString(in);
// 2. 使用 Class 获取类路径下的资源
Class c = this.getClass();
// 相对当前 .class 文件所在目录!
// 即相对于 cn/itcast/servlet 文件夹内的 a.txt
InputStream input = c.getResourceAsStream("a.txt");
// 如果 a.txt 在 src 目录下
// 相对 classes 目录下, 注意, 路径中带有 "/"
InputStream input = c.getResourceAsStream("/a.txt");
**参考资料:** - [JavaWeb 视频教程](https://www.bilibili.com/video/av12760389/index_2.html#page=13) - [JavaEE 6.0 文档](http://tool.oschina.net/apidocs/apidoc?api=javaEE6)