服务器启动的时候,为每个WEB应用创建一个单独的ServletContext对象
我们可以使用这个对象存取数据,用这个对象存取的数据可以在整个WEB应用中获得
ServletContext被称之为"Servlet上下文"
其意为"知上知下贯穿全文"!
一.获取ServletContext的四种方式
依赖类 | 途径 |
---|---|
ServletConfig | getServletContext() |
GenericServlet | getServletContext() |
Session | getServletContext() |
Request | getServletContext() |
下面通过代码演示四种方式
package controller;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author weihuanwen
* @Date 2019/7/25 10:16
* @Version 1.0
*/
@WebServlet(urlPatterns = "/gscs")
public class GetSCServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
获取ServletContext对象,输出地址作为验证
*/
//①GenericServlet获取ServletContext(
ServletContext servletContext = getServletContext();
System.out.println("GenericServlet ::: "+servletContext);
//②通过session获取servletContext
servletContext = req.getSession().getServletContext();
System.out.println("Session ::: "+servletContext);
//③通过request获取ServletContext
servletContext = req.getServletContext();
System.out.println("Request ::: "+servletContext);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
ServletContext servletContext = servletConfig.getServletContext();
System.out.println("ServletConfig ::: "+servletContext);
/*
这里一定要调用父类init(ServletConfig config)
这样doGet和doPost中才能获取到servletContext
否则在获取时抛出:
java.lang.NullPointerException
*/
super.init(servletConfig);
}
}
测试请求路径:http://localhost:8080/scr/gscs
控制台输出如下:
ServletConfig ::: org.apache.catalina.core.ApplicationContextFacade@190e2e16
GenericServlet ::: org.apache.catalina.core.ApplicationContextFacade@190e2e16
Session ::: org.apache.catalina.core.ApplicationContextFacade@190e2e16
Request ::: org.apache.catalina.core.ApplicationContextFacade@190e2e16
观察得知四种方式获得的ServletContext都是同一个(地址相同)
二.多个Servlet间的数据共享
1.servlet的几种常用方法介绍:
方法名 | 描述 |
---|---|
setAttribute(String var1, Object var2) | 向上下文中设置属性值 |
Object getAttribute(String var1) | 获取上下文中属性值 |
removeAttribute(String var1) | 删除上下文中属性值 |
2.代码演示几种常用方法以及多个servlet间的数据共享
①第一个servlet代码如下:
package controller;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author weihuanwen
* @Date 2019/7/25 10:16
* @Version 1.0
*/
@WebServlet(urlPatterns = "/scsf")
public class SCServletFir extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext(
ServletContext servletContext = getServletContext();
System.out.println("SCServletFir获取到Servlet上下文....");
servletContext.setAttribute("name","unknown");
System.out.println("SCServletFir向上下文中存入数据: {'name':'unknown'}");
String name = (String)servletContext.getAttribute("name");
System.out.println("SCServletFir从上下文中获取name属性值 ::: "+name);
servletContext.removeAttribute("name");
System.out.println("SCServletFir将上下文中name属性删除!");
name = (String)servletContext.getAttribute("name");
System.out.println("SCServletFir从上下文中获取name属性值 ::: "+name);
servletContext.setAttribute("name","Howie");
System.out.println("SCServletFir向上下文中存入数据: {'name':'Howie'}");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
②第二个servlet代码如下:
package controller;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author weihuanwen
* @Date 2019/7/25 10:16
* @Version 1.0
*/
@WebServlet(urlPatterns = "/scss")
public class SCServletSec extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext(
ServletContext servletContext = getServletContext();
System.out.println("SCServletSec获取到Servlet上下文....");
String name = (String)servletContext.getAttribute("name");
System.out.println("SCServletSec从上下文中获取name属性值 ::: "+name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
③测试:
请求路径:http://localhost:8080/scr/scsf
控制台输出:
SCServletFir获取到Servlet上下文....
SCServletFir向上下文中存入数据: {'name':'unknown'}
SCServletFir从上下文中获取name属性值 ::: unknown
SCServletFir将上下文中name属性删除!
SCServletFir从上下文中获取name属性值 ::: null
SCServletFir向上下文中存入数据: {'name':'Howie'}
请求路径:http://localhost:8080/scr/scss
控制台输出:
SCServletSec获取到Servlet上下文....
SCServletSec从上下文中获取name属性值 ::: Howie
三.ServletContext读取Web资源
1.servlet的几种常用方法介绍:
方法名 | 描述 |
---|---|
Set getResourcePaths(String path) | 获取资源目录中子目录和文件的路径名称 |
String getRealPath(String path) | 返回资源文件在服务器文件系统上的真实路径(文件的绝对路径) 如果Servlet容器不能将虚拟路径转换为文件系统的真实路径,则返回null |
URL getResource(String path) | 返回映射到某个资源文件的URL对象 |
InputStream getResourceAsStream(String path) | 返回映射到某个资源文件的InputStream输入流对象(使用相对路径) |
2.代码演示几种常用方法:
测试前准备:
①Set getResourcePaths(String path)
package controller;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
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.util.Set;
/**
* @Author weihuanwen
* @Date 2019/7/25 10:16
* @Version 1.0
*/
@WebServlet(urlPatterns = "/scgws")
public class SCGetWebServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext
ServletContext servletContext = getServletContext();
//获取资源目录中子目录和文件的路径名称
Set<String> resourcePaths = servletContext.getResourcePaths("/resources");
//遍历输出
for (String resourcePath : resourcePaths) {
System.out.println(resourcePath);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
测试请求路径:http://localhost:8080/scr/scgws
控制台输出:
/resources/3.mp3
/resources/2.jpg
/resources/4.mp4
/resources/1.txt
②String getRealPath(String path)
package controller;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
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.util.Set;
/**
* @Author weihuanwen
* @Date 2019/7/25 10:16
* @Version 1.0
*/
@WebServlet(urlPatterns = "/scgws")
public class SCGetWebServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext
ServletContext servletContext = getServletContext();
//获取文件完整路径
String realPath = servletContext.getRealPath("/resource/1.txt");
System.out.println(realPath);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
测试请求路径:http://localhost:8080/scr/scgws
控制台输出:
D:\apache-tomcat-8.5.32\webapps\ServletContextReview\resource\1.txt
③URL getResource(String path)
package controller;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
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.net.URL;
import java.util.Set;
/**
* @Author weihuanwen
* @Date 2019/7/25 10:16
* @Version 1.0
*/
@WebServlet(urlPatterns = "/scgws")
public class SCGetWebServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext
ServletContext servletContext = getServletContext();
URL url = servletContext.getResource("/resources/2.jpg");
System.out.println(url);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
测试请求路径:http://localhost:8080/scr/scgws
控制台输出:
file:/D:/apache-tomcat-8.5.32/webapps/ServletContextReview/resources/2.jpg
④InputStream getResourceAsStream(String path)
package controller;
import utils.FileUtils;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URL;
import java.util.Set;
/**
* @Author weihuanwen
* @Date 2019/7/25 10:16
* @Version 1.0
*/
@WebServlet(urlPatterns = "/scgws")
public class SCGetWebServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应体编码格式
resp.setContentType("text/html;charset=UTF-8");
//输文本格式的响应正文前需要先获取字符输出流
PrintWriter pw = resp.getWriter();
//获取Servlet上下文引用
ServletContext servletContext = getServletContext();
//文件的相对路径
String relativePath = "/text/noodle.txt";
//获取文件的绝对路径-->用于获取文件编码格式
String realPath = servletContext.getRealPath(relativePath);
//获取目标文件输入流
InputStream is = servletContext.getResourceAsStream(relativePath);
//创建字符输入流读取文件内容
InputStreamReader isr = new InputStreamReader(is,FileUtils.getCharset(realPath));
BufferedReader br = new BufferedReader(isr);
String lineStr = "";
while ((lineStr = br.readLine())!=null){
System.out.println(lineStr);
pw.write(lineStr);
pw.println("<br/>");
}
isr.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
测试请求路径:http://localhost:8080/scr/scgws
前端响应界面展示: