ServletContext

Posted yusiming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ServletContext相关的知识,希望对你有一定的参考价值。

ServletContext
  在ServletConfig接口中,有一个getServletContext方法可以获取一个ServletContext对象,那么ServletContext到底有什么作用呢?ServletContext是一个接口,也是是一个域对象,而且是最大的域对象,tomcat会为每一个web项目创建一个ServletContext对象,并且在服务器启动时就创建它,直到服务器关闭,这个对象才会被销毁,既然是域对象它必然也有如下方法:

  • Object getAttribute(String var1);
  • void setAttribute(String var1, Object var2);
    •   注意如果重复设置同一个值,那么新的值会覆盖旧的值
  • void removeAttribute(String var1);
  • Enumeration<String> getAttributeNames();

  在所有的Servlet中都可以获取到这个项目唯一的ServletContext对象,我们可以使用它在多个Servlet中传递数据,一个Servlet可以往其中添加数据,另一个Servlet可以拿到上一个Servlet添加的树据,除了使用ServletConfig接口中的方法,我们还可以使用如下方法获取ServletContext:

  • HttpSession中的getServletContext()方法
  • GenericServlet中的getServletContext()方法,这个方法其实也是使用了ServletConfig
  • ServletContextEvent中的getServletContext()方法,

  所以我们在一个继承了HttpServlet的Servlet中可以使用两种方法获取ServletContext,
  this.getServletConfig().getServletContext()或者this.getServletConfig()

获取应用初始化参数
  注意这个应用初始化参数是与整个项目相关的,不是与某一个特定Servlet相关的,所有的Servlet都可以使用ServletContext来获取应用初始化参数,而Servlet初始化参数,是与某一个Servlet相关的。可以在web.xml文件中配置应用初始化参数,配置如下:

<context-param>
<param-name>p1</param-name>
<param-value>v1</param-value>
</context-param>
<context-param>
<param-name>p2</param-name>
<param-value>v2</param-value>
</context-param>

  然后我们就可以在Servlet中获取到配置的参数

1 ServletContext servletContext = this.getServletContext();
2 System.out.println(servletContext.getInitParameter("p1"));
3 System.out.println(servletContext.getInitParameter("p2"));
4 // 获取所有初始化参数的名字
5 Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
6 while (initParameterNames.hasMoreElements()) {
7     System.out.println(initParameterNames.nextElement());
8 }

 

我们还可以使用ServletContext 来获取web应用下的资源
获取文件的真实路径:

1 ServletContext servletContext = this.getServletContext();
2 // D:JavaWebFirstWeboutartifactsFirstWebApp_war_explodedindex.jsp
3 System.out.println(servletContext.getRealPath("index.jsp"));

需要注意的是ServletContext 是以web根目录作为相对目录的

 

还可以获取资源流

1 ServletContext servletContext = this.getServletContext();
2 InputStream in = servletContext.getResourceAsStream("index.jsp");
3 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
4 String s;
5 while ((s = bufferedReader.readLine()) != null) {
6     System.out.println(s);
7 }

以上这段代码会将web目录下的index.jsp文件打印到控制台上

 

还可以获取指定目录下的所有资源路径

ServletContext servletContext = this.getServletContext();
// 方法参数要以“/”开头
Set<String> set = servletContext.getResourcePaths("/WEB-INF");
// [/WEB-INF/classes/, /WEB-INF/web.xml]
System.out.println(set);

 







以上是关于ServletContext的主要内容,如果未能解决你的问题,请参考以下文章

ServletContext介绍和用法总结

servlet开发之ServletContext

如果遇到java.lang.NoClassDefFoundError: javax/servlet/ServletContext问题具体代码和解决方案如下面所示

为啥 servletContext.getRealPath 在 tomcat 8 上返回 null?

JavaWeb-使用ServletContext下载文件

JavaEE_ServletContext的简单应用