1.ServletContext介绍
<1>域对象
- 域对象指的是对象有作用域。也就是有作用范围。域对象可以实现数据的共享。不同作用范围的域对象,共享数据的能力也不一样。
- 在Servlet规范中,一共有4个域对象。ServletContext就是其中的一个。它也是web应用中最大的作用域,也叫application域。它可以实现整个应用之间的数据共享!
<2>ServletContext是应用上下文对象(应用域对象); - 每一个应用中只有一个ServletContext对象;
- 作用:可以配置和获得应用的全局初始化参数;
- 可以实现Servlet之间的数据共享;
- 生命周期:应用一加载则创建,应用被停止则销毁。
2.配置和获取全局参数
【每一个应用只有一个ServletContext对象,故定义在Service标签外】
<1>配置全局参数
<!--配置全局编码-->
<context-param>
<param-name>globalEncoding</param-name>
<param-value>utf-8</param-value>
</context-param>
<!--配置全局描述信息-->
<context-param>
<param-name>globalDesc</param-name>
<param-value>我是ServletContext的描述信息</param-value>
</context-param>
<2>获取全局参数
public class ServletContextDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext对象
ServletContext context = this.getServletContext();
//获取全局配置参数:getInitParameter(String key)根据key获取value
Enumeration<String> ParameterNames = context.getInitParameterNames();
while (ParameterNames.hasMoreElements()) {
String name = ParameterNames.nextElement();
String value = context.getInitParameter(name);
System.out.println(name + "..." + value);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
打印结果:
-------------------------------------------------------------------
globalEncoding...utf-8
globalDesc...我是ServletContext的描述信息
3.设置共享数据和获取真实路径
【每一个应用只有一个ServletContext对象,故在每个Service标签内可以共享和删除数据】
public class ServletContextDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext对象
ServletContext context = this.getServletContext();
//1.设置共享数据
context.setAttribute("username","zhangsan");
context.setAttribute("password","123456");
System.out.println("Servlet1已存储到数据");
//删除共享数据
/*context.removeAttribute("username");
System.out.println("Servlet1已删除数据");*/
/*String charset = context.getInitParameter("charset");
System.out.println(charset);*/
//2.//获取应用的虚拟目录: getContextPath()
String contextPath = context.getContextPath();
System.out.println(contextPath);
//3.根据虚拟目录获取绝对路径: getRealPath(String path)
//用户通过浏览器访问的是服务器上的路径
//获得虚拟目录的绝对路径(服务器中的路径)
String servletRealpath = context.getRealPath("/");
System.out.println(servletRealpath);
//获取web/a.txt的绝对路径
String webPath = context.getRealPath("/a.txt");
System.out.println(webPath);
//获取WEB-INF的绝对路径
String webInPath = context.getRealPath("WEB-INF/a.txt");
System.out.println(webInPath);
//获取src/a.txt的绝对路径
String srcPath = context.getRealPath("WEB-INF/classes/a.txt");
System.out.println(srcPath);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
打印结果:
-----------------------------------------------------------------
Servlet1已存储到数据
/day03_ServletContextDemo_war_exploded
D:\javaWeb-project\out\artifacts\day03_ServletContextDemo_war_exploded\
D:\javaWeb-project\out\artifacts\day03_ServletContextDemo_war_exploded\a.txt
D:\javaWeb-project\out\artifacts\day03_ServletContextDemo_war_exploded\WEB-INF\a.txt
D:\javaWeb-project\out\artifacts\day03_ServletContextDemo_war_exploded\WEB-INF\classes\a.txt
26-Jul-2021 21:50:03.584 信息 [Catalina-utility-2] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-9.0.5\apache-tomcat-9.0.50\webapps\manager]
26-Jul-2021 21:50:03.617 信息 [Catalina-utility-2] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-9.0.5\apache-tomcat-9.0.50\webapps\manager]的部署已在[33]毫秒内完成
Servlet2已获取到数据
zhangsan...123456
注:
<1>打印情况为浏览器先访问ServletContextDemo1再访问ServletContextDemo2;如果先访问ServletContextDemo2则获取的数据为null…null
<2>移除共享数据时,移除对应的字符,不会影响其他的值,如移除’zhangsan‘,ServletContextDemo2获取的打印结果为null…123456