ServletContext

概念

  ServletContext本身的名称令人有点困惑,因为它以Servlet作为开头,容易被误认为仅是单一Servlet的代表对象。事实上,当整个Web应用程序加载Web容器之后,容器会生成一个ServletContext对象作为整个应用程序的代表。


1、setAttribute()、getAttribute()、removeAttribute()


2、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

3.getRequestDispatcher()

  使用 ServletContext 取得RequestDispatcher实例,使用时路径必须以“/”开头,这个斜杠代表应用程序环境根目录。
  以“/”开头称为环境相对路径,没有以“/”作为开头则称为请求相对路径。
  实际上HttpServletRequest的getRequestDispatcher()方法在实现时,若是环境相对路径,则直接委托给ServletContext的getRequestDispatcher();若是请求相对路径,则转换为环境相对路径,再委托给ServletContext的getRequestDispatcher()


4. 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

5.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/

如果是个目录,则会以“/”作结尾。

6.getResourceAsStream()

  如果想在Web应用程序中读取某个文件的内容,则可以使用getResourceAsStream()方法。使用时指定路径必须以“/”作为开头,表示相对于应用程序环境根目录,或者相对是/WEB-INF/lib中JAR文件里META- INF/resources的路径,运行结果会返回InputStream实例,接着就可以运用它来读取文件内容。

demo

1、在/WEB-INF目录下创建一个test.properties文件

name=zs
age=18
View Code

2、新建一个servlet

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;
import java.io.InputStream;
import java.util.Properties;

@WebServlet(urlPatterns = "/hello", name = "hello")
public class ServletDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        InputStream resourceAsStream = getServletContext().getResourceAsStream("/WEB-INF/test.properties");
        Properties properties = new Properties();
        properties.load(resourceAsStream);
        response.getWriter().println(properties.getProperty("name"));
        response.getWriter().println(properties.getProperty("age"));
    }
}
View Code

3、访问http://127.0.0.1/hello,响应内容

zs
18

扩展

  你也许会想到使用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

原文地址:https://www.cnblogs.com/Mike_Chang/p/10059864.html