ServletContext
Posted Prince_Chang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ServletContext相关的知识,希望对你有一定的参考价值。
概念
ServletContext本身的名称令人有点困惑,因为它以Servlet作为开头,容易被误认为仅是单一Servlet的代表对象。事实上,当整个Web应用程序加载Web容器之后,容器会生成一个ServletContext对象作为整个应用程序的代表。
1、getInitParameter()
<?xml version="1.1" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>Archetype Created Web Application</display-name> <context-param> <param-name>contextParam</param-name> <param-value>demo</param-value> </context-param> </web-app>
package com.test; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(urlPatterns = "/hello", name = "hello") public class ServletDemo extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { String value = getServletContext().getInitParameter("contextParam"); response.getWriter().println(value); } }
响应结果
demo
2.getRequestDispatcher()
使用 ServletContext 取得RequestDispatcher实例,使用时路径必须以“/”开头,这个斜杠代表应用程序环境根目录。
以“/”开头称为环境相对路径,没有以“/”作为开头则称为请求相对路径。
实际上HttpServletRequest的getRequestDispatcher()方法在实现时,若是环境相对路径,则直接委托给ServletContext的getRequestDispatcher();若是请求相对路径,则转换为环境相对路径,再委托给ServletContext的getRequestDispatcher()
3. getRealPath()
获取的是当前工程部署到服务器中的绝对磁盘路径。
package com.test; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(urlPatterns = "/hello", name = "hello") public class ServletDemo extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.getWriter().println(getServletContext().getRealPath("/")); } }
响应结果
E:ideaWorkspaceservlet-demosrcmainwebapp
4.getResourcePaths()
如果想要知道Web应用程序的某个目录中有哪些文件,则可以使用getResourcePaths()方法。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { for (String resourcePath : getServletContext().getResourcePaths("/")) { response.getWriter().println(resourcePath); } }
响应结果
/index.jsp /WEB-INF/
如果是个目录,则会以“/”作结尾。
5.getResourceAsStream()
如果想在Web应用程序中读取某个文件的内容,则可以使用getResourceAsStream()方法。使用时指定路径必须以“/”作为开头,表示相对于应用程序环境根目录,或者相对是/WEB-INF/lib中JAR文件里META- INF/resources的路径,运行结果会返回InputStream实例,接着就可以运用它来读取文件内容。
你也许会想到使用java.io下的File、FileReader、FileInputStream等与文件读取相关的类。使用这些类时,可以指定绝对路径或相对路径。绝对路径自然是指文件在服务器上的真实路径。必须注意的是,用相对路径时,此时的路径不是相对于Web应用程序根目录,而是相对于启动Web容器时的命令执行目录,这是许多初学者都会有的误解。
以Tomcat来说,若在Servlet中执行以下语句:out.println(new File("filename").getAbsolutePath());则会显示filename是位于Tomcat目录下的bin目录中,例如:
C:Program FilesApache Software FoundationApache Tomcat 7.0.8infilename
以上是关于ServletContext的主要内容,如果未能解决你的问题,请参考以下文章
如果遇到java.lang.NoClassDefFoundError: javax/servlet/ServletContext问题具体代码和解决方案如下面所示