ServletContext
1.ServletContext对象,tomcat为每一个web项目单独创建的一个上下文(知上知下贯穿全文)对象。服务器启动的时候,为每个WEB应用创建一个单独的ServletContext对象,我们可以使用这个对象存取数据,用这个对象存取的数据可以在整个WEB应用中获得。
2.常用功能
可以使用如下方法可以在多个servlet之间共享数据
可以获得当前WEB项目中的指定资源(文件)
可以进行整个web项目初始化数据设置 , 在web.xml可以给整个web项目配置初始化参数
<!-- 全局初始化参数(整个项目) -->
<context-param>
<param-name>参数名</param-name>
<param-value>参数值</param-value>
</context-param>
3.ServletContext获取或存储对象
package scon;
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;
@WebServlet(urlPatterns = "/t")
public class MyCon extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取ServletContext对象的方法getServletContext()
ServletContext servletContext = getServletContext();
servletContext.setAttribute("name","tom");
System.out.println(servletContext.getAttribute("name"));
}
}
4.ServletContext读取WEB项目中的指定资源
既然 ServletContext 是 贯穿全文 的对象 ,所以项目中的资源 它都能访问到 , 主要 用它 获取
web项目中文件.
文件保存的位置 :
1.src下 : 发布到 /WEB-INF/classes/文件名
2.web目录下 : 发布到 /文件名
3.WEB-INF目录下 : 发布到 /WEB-INF/文件名
代码中获取路径 , 写法 应该是发布后的路径 .
getRealPath(String str) : 获取真实路径 .
参数 : 相对的路径
返回值 : 真实文件路径.
new File("真实路径")
new FileInputStream("真实路径")
======================================================
总结 :
1. / 表示 web目录
2. web目录下的文件 : /文件名
3. web-inf目录下的文件 : /WEB-INF/文件名
4. src 目录下文件 : /WEB-INF/classes/文件名
@WebServlet(urlPatterns = "/file")
public class FileServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("FileServlet.doGet");
// 获取 ServletContext 对象
ServletContext sc = getServletContext();
// 读取 web目录下文件 .
String realPath = sc.getRealPath("/web下文件.txt");
System.out.println(realPath); // G:\apache-tomcat-8.5.34\webapps\day09\web下文件.txt
// BufferedReader 直接读取一行数据
BufferedReader br = new BufferedReader(new FileReader(realPath));
String s = br.readLine();
System.out.println(s);
}
}
@WebServlet(urlPatterns = "/file2")
public class File2Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("FileServlet.doGet");
// 获取 ServletContext 对象
ServletContext sc = getServletContext();
// 读取 web-inf目录下文件 .
String realPath = sc.getRealPath("/WEB-INF/web-inf下文件.txt");
System.out.println(realPath);
// BufferedReader 直接读取一行数据
BufferedReader br = new BufferedReader(new FileReader(realPath));
String s = br.readLine();
System.out.println(s);
System.out.println("=====================================");
// 读取 src目录下文件 .
String realPath2 = sc.getRealPath("/WEB-INF/classes/src下文件.txt");
System.out.println(realPath2);
// BufferedReader 直接读取一行数据
BufferedReader br2 = new BufferedReader(new FileReader(realPath2));
String s2 = br2.readLine();
System.out.println(s2);
}
}
package hm02_context_file;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/*
getResourceAsStream(String str) 获取资源输入流对象
参数 : str 与 getRealPath()的参数一致
返回值 : 输入流对象, 用来直接读取文件.
*/
@WebServlet(urlPatterns = "/file3")
public class File3Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 读取 a.jpg
// 使用路径读取方式 (较麻烦)
// String realPath = getServletContext().getRealPath("/a.jpg");
// FileInputStream fileInputStream = new FileInputStream(realPath);
// 使用 流 读取方式 (较简单)
InputStream in = getServletContext().getResourceAsStream("/a.jpg");
// 回写字节数据
ServletOutputStream out = response.getOutputStream();
// 读写数据
byte[] b = new byte[1024];
int len = 0;
while ((len = in.read(b)) != -1) {
out.write(b , 0 , len);
}
//释放资源
out.close();
in.close();
}
}