当 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");

ServletContext获取封装信息

如果是位于src目录下,在项目发布后真实路径是位于WEB-INF/classes/目录下,使用 context.getResourceAsStream("")指明的路径则是"/WEB-INF/classes/itcast.properties"

InputStream in = context.getResourceAsStream("/WEB-INF/classes/db.properties");

ServletContext获取封装信息

 

需要获取src目录下的可以调用:

//this.getClass.getClassLoader().getResourceAsStream获取的是src目录下的文件

使用该方法的好处:任何类都可以获得classpath下的文件,不依赖于ServletContext

InputStream in=this.getClass.getClassLoader().getResourceAsStream("db.properties");

ServletContext获取封装信息

 

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的域属性

ServletContext获取封装信息

 

Servlet如何处理多个请求访问?

来自 <https://blog.csdn.net/xiaojiahao_kevin/article/details/51781946>

Servlet是单例的,tomcat只会创建一个servlet实例

一个servlet实例会在同一个时间点上处理不同请求,不能实现同步,因此

Servlet线程是不安全的,因此在servlet中不写属性,不写可以保存数据的属性

 

相关文章: