ServletContext
(Servlet上下文)接口定义了servlet运行在Web应用的视图,servlet应用容器负责提供其实现。Servlet可以使用ServletContext对象记录事件,获取URL引用的资源,存取当前上下文的其他Servlet可访问的属性。
ServletContext是Web服务中服务访问路径的根。例如,Servlet服务访问路劲为:http://localhost:8080/servlet/userServlet,/servlet称为上下文路径。
注意:
Web服务器中仅部署一个Web项目时,可以不配置上下文(虚拟主机)。但部署多个Web项目时,一定要配置项目的上下文,且上下文不会在虚拟主机之间共享。
初始化参数
ServletContext接口允许Servlet访问由应用开发人员在Web应用中的部署描述符中指定上下文的初始化参数:
- getInitParameter
- getInitPatameterNames
上下文属性
Servlet中可以将数据与上下文进行绑定,同一个Web中其他任何Servlet都已访问到该数据。上下文属性方法:
- setAttribute(String name, Object object) – 设置绑定属性
- getAttribute(String name) – 获取指定绑定的属性值
- getAttributeNames() – 获取所有的绑定的属性名称(返回枚举类型)
- remoteAttribute(String name) – 移除绑定的属性
public class Servlet008 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("this is servlet008");
// 获取ServletContext对象
ServletContext servletContext = request.getServletContext();
// 属性绑定上下文对象
servletContext.setAttribute("username", "admin");
servletContext.setAttribute("pwd", "123456");
// 请求转发
request.getRequestDispatcher("/servlet009").forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
public class Servlet009 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("this is servlet009");
// 获取ServletContext对象
ServletContext servletContext = request.getServletContext();
// 获取上下文对象绑定的属性值
// username1:admin
System.out.println("username1:" + servletContext.getAttribute("username"));
Enumeration<String> attributeNames = servletContext.getAttributeNames();
/**
* 此处输出包含了自定义绑定的属性名,还有系统字典的属性名
*/
while (attributeNames.hasMoreElements()) {
String name = attributeNames.nextElement();
System.out.println(name + ":" + servletContext.getAttribute(name));
}
// 移除绑定的属性
servletContext.removeAttribute("username");
// username2:null
System.out.println("username2:" + servletContext.getAttribute("username"));
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
资源
ServletContext接口提供了直接访问Web应用中静态资源文件(HTML、图片、CSS等)的方法:
- getResource(String path) – 根据资源文件路径获取资源的URL,返回URL对象
- getResourceAsStream(String path) – 根据资源文件路径获取资源字节流对象,返回InputStream对象
以上两个方法需要以**/开头的字符串作为参数,资源路径是相对于上下文的根目录,或者想对于Web应用WEB-INF/lib目录下JAR文件中META-INF/resources**目录。
资源文件查找顺序:
- Web应用上下文根目录
- WEB-INF/lib目录下JAR文件