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的主要内容,如果未能解决你的问题,请参考以下文章
如果遇到java.lang.NoClassDefFoundError: javax/servlet/ServletContext问题具体代码和解决方案如下面所示