1 ServletContext接口
ServletContext是Servlet与Servlet容器之间进行通信的接口。Servlet容器在启动一个Web应用的时候,会为它创建一个ServletContext对象。每个Web应用都有且只有一个ServletContext对象。我们可以把ServletContext对象形象的理解为Web应用的总管家。所有的Servlet都共享这一个总管家。Servlet要访问容器中的各种资源,都是通过这个总管家来访问的。
ServletContext提供的方法非常的多。我们将分类来概括
1,用于在Web应用范围内存取共享数据的方法
- setAttribute(String name, Object
obj):把一个Java对象和一个属性名绑定,并且存入到ServletContext中。name代表参数名字,obj代表共享数据的值 - getAttribute(String
name):根据参数给定的属性名,返回一个Object类型的对象,它表示ServletContext中与属性名匹配的属性值 - getAttributeNames():
返回一个Enumeration对象,该对象包含了所有存放在ServletContext中的属性名。 - removeAttribute(String name):根据参数指定的属性名,从ServletContext中删除匹配的属性
上面的这些属性,是针对于整个Web应用的属性。和我们request的attribute不一样,request的attribute只是针对当前这一次请求来得,相当于这个请求结束了之后,对应的request对象也会被销毁。并别不同的请求由不同的request对象。我们整个Web应用都共享一个ServletContext,所以不同的请求也可以访问到对应的属性。
1,首先我们再一个Servlet里面设置ServletContext的属性:
//获取对应的ServletContext对象
ServletContext context = getServletContext();
context.setAttribute("nvshen", "liyitong");
2,我们在另外一个ServletContext里面获取:
package com.vgxit.helloworld.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ContextTestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
try (PrintWriter pw = response.getWriter()) {
ServletContext context = getServletContext();
Object nvshen = context.getAttribute("nvshen");
if (nvshen == null) {
pw.println("<h2>您还没有设置您的女神</h2>");
} else {
pw.println("<h2>您的女神是:" + nvshen + "</h2>");
}
}
}
}
2 访问当前Web应用的资源
- getContextPath():返回当前Web应用的URL入口
- getInitParameter(String
name):根据给定的参数名,返回Web应用范围内的匹配的初始化参数。这些参数都是在web.xml中,直接在<web-app>
根元素下通过<context-param>
元素定义的 - getInitParameterNames():返回一个Enumeration对象,它包含了Web应用范围内所有的初始化参数名
- getServletContextName():范围web应用的名字,就是web.xml中
<display-name>
元素的值。 - getRequestDispatcher(String
path):返回一个用于其他Web组件转发请求的RequestDispatcher对象。
package com.vgxit.helloworld.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ContextTestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
try (PrintWriter pw = response.getWriter()) {
ServletContext context = getServletContext();
Object nvshen = context.getAttribute("nvshen");
if (nvshen == null) {
pw.println("<h2>您还没有设置您的女神</h2>");
} else {
pw.println("<h2>您的女神是:" + nvshen + "</h2>");
}
pw.println("<h2>" + context.getContextPath() + "</h2>");
pw.println("<h2>" + context.getInitParameter("teacher") + "</h2>");
pw.println("<h2>" + context.getInitParameter("course") + "</h2>");
pw.println("<h2>" + context.getServletContextName() + "</h2>");
}
}
}
3 访问Servlet容器中其他Web应用
getContext(String uripath):根据参数指定的URI,返回当前Servlet容器中其他应用的ServletContext对象。
4 访问Servlet容器的相关信息
- getMajorVersion():返回Servlet容器支持的Java Servlet Api的主版本号
- getMinorVersion():返回Servlet容器支持的Java Servlet Api的次版本号
- getServerInfo():返回Servlet容器的名字和版本
5 访问服务器端的文件系统资源
- getRealPath(String path):根据参数指定的虚拟路径,返回文件系统中的一个真实路径
- getResource(String path):返回一个映射到参数指定路径的URL
- getResourceAsStream(String path):返回一个用于读取参数指定的文件的输入流
- getMimeType(String file): 返回参数指定文件的MIME类型
6 输出日志
- log(String msg):向Servlet的日志文件中写日志
- log(String message, Throwable throwable):向Servlet日志文件中写入之日,以及异常的对战信息
- log写入日志是写入到<CALINA_HOME>/logs目录下面的。但是我们在这个目录下面看不到,因为idea集成tomcat之后,我们改变了工作目录。如果我们要看到,我们可以通过如下目录查看:
2,ServletContext接口具体实例:
package com.vgxit.helloworld.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ContextTestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
try (PrintWriter pw = response.getWriter()) {
ServletContext context = getServletContext();
Object nvshen = context.getAttribute("nvshen");
if (nvshen == null) {
pw.println("<h2>您还没有设置您的女神</h2>");
} else {
pw.println("<h2>您的女神是:" + nvshen + "</h2>");
}
pw.println("<h2>" + context.getContextPath() + "</h2>");
pw.println("<h2>" + context.getInitParameter("teacher") + "</h2>");
pw.println("<h2>" + context.getInitParameter("course") + "</h2>");
pw.println("<h2>" + context.getServletContextName() + "</h2>");
pw.println("<h2>" + context.getMajorVersion() + "</h2>");
pw.println("<h2>" + context.getMinorVersion() + "</h2>");
pw.println("<h2>" + context.getServerInfo() + "</h2>");
pw.println("<h2>" + context.getRealPath("login.jsp") + "</h2>");
pw.println("<h2>" + context.getMimeType("login.jsp") + "</h2>");
context.log("当前的时间戳是:" + System.currentTimeMillis());
}
}
}