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>
xml Code
技术分享图片
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);
    }
}
java Code 

响应结果

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);
        }
    }
View Code 

响应结果

/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的主要内容,如果未能解决你的问题,请参考以下文章

ServletContext介绍和用法总结

servlet开发之ServletContext

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

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

JavaWeb-使用ServletContext下载文件

JavaEE_ServletContext的简单应用