当 Tomcat 启动时,Tomcat 会为每个 Web 应用创建一个唯一的 ServletContext 对象代表当前的 Web 应用,该对象封装了当前 Web 应用的所有信息。可以利用该对象获取 Web 应用程序的初始化信息、读取资源文件等。
1、获取 Web 应用程序的初始化参数(全局的初始化参数,而ServletConfig保存的只是对应servlet的初始化参数)
<context-param> 元素位于根元素 <web-app>
<context-param>
<param-name>XXX</param-name>
<param-value>xxx</param-value>
</context-param>
<context-param>
<param-name>AAA</param-name>
<param-value>aaa</param-value>
</context-param>
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// 得到ServletContext对象
ServletContext context = this.getServletContext();
// 得到包含所有初始化参数名的Enumeration对象
Enumeration<String> paramNames = context.getInitParameterNames();
// 遍历所有的初始化参数名,得到相应的参数值并打印
while (paramNames.hasMoreElements()) {
String name = paramNames.nextElement();
String value = context.getInitParameter(name);
out.println(name + ":" + value);
out.println("<br/>");
}
2、读取 Web 应用下的资源文件
|
Set getResourcePaths(String path) |
返回一个 Set 集合,集合中包含资源目录中子目录和文件的路径名 称。参数 path 必须以正斜线(/)开始,指定匹配资源的部分路径 |
|
String getRealPath(String path) |
返回资源文件在服务器文件系统上的真实路径(文件的绝对路径)。参数 path 代表资源文件的虚拟路径,它应该以正斜线(/)开始,/ 表示当前 Web 应用的根目录,如果 Servlet 容器不能将虚拟路径转换为文 件系统的真实路径,则返回 null |
|
URL getResource(String path) |
返回映射到某个资源文件的 URL 对象。参数 path 必须以正斜线(/)开始,/ 表示当前 Web 应用的根目录 |
|
InputStream getResourceAsStream(String path) |
返回映射到某个资源文件的 InputStream 输入流对象。参数 path 的传递规则和 getResource() 方法完全一致 |
//context.getResourceAsStream(" "); 获取的是项目根目录(/webroot目录下),要获取具体目录需要指明目录地址
ServletContext context = this.getServletContext();
InputStream in = context.getResourceAsStream("/WEB-INF/db.properties");
如果是位于src目录下,在项目发布后真实路径是位于WEB-INF/classes/目录下,使用 context.getResourceAsStream("")指明的路径则是"/WEB-INF/classes/itcast.properties"
InputStream in = context.getResourceAsStream("/WEB-INF/classes/db.properties");
需要获取src目录下的可以调用:
//this.getClass.getClassLoader().getResourceAsStream获取的是src目录下的文件
使用该方法的好处:任何类都可以获得classpath下的文件,不依赖于ServletContext
InputStream in=this.getClass.getClassLoader().getResourceAsStream("db.properties");
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");
ServletContext context = this.getServletContext();
PrintWriter out = response.getWriter();
// 获取相对路径中的输入流对象
InputStream in = context.getResourceAsStream("/WEB-INF/classes/itcast.properties");Properties pros = new Properties();
pros.load(in);//从字节输入流中读取键值out.println("username=" + pros.getProperty("username") + "<br/>");//根据key取值
out.println("password=" + pros.getProperty("password") + "<br/>");
}
来自 <http://m.biancheng.net/view/3998.html>
3、ServletContext保存全局变量
void setAttribute(String name,Object value):用来存储一个对象,也可以称之为存储一个域属性
servletContext.setAttribute("xxx","XXX"):在ServletContext中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。
如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同
Object getAttribute(String name):用来获取ServletContext中的数据,当前在获取之前需要先去存储才行,
String value=(String)servletContext.getAttribute("xxx"):获取名为xxx的域属性
Servlet如何处理多个请求访问?
来自 <https://blog.csdn.net/xiaojiahao_kevin/article/details/51781946>
Servlet是单例的,tomcat只会创建一个servlet实例
一个servlet实例会在同一个时间点上处理不同请求,不能实现同步,因此
Servlet线程是不安全的,因此在servlet中不写属性,不写可以保存数据的属性