目錄
ServletContext對象
概念:代表整個web應用,可以和程序的容器(服務器)來通信
獲取:下面兩種方式獲取的ServletContext爲同一對象, 因爲它標識整個web應用。
1. 通過request對象獲取
request.getServletContext();
2. 通過HttpServlet獲取
this.getServletContext();
功能:
1. 獲取MIME類型:
MIME類型: 在互聯網通信過程中定義的一種文件數據類型
格式: 大類型/小類型 text/html image/jpeg
獲取:String getMimeType(String file)
@WebServlet("/servletContextDemo2")
public class ServletContextDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//定義文件名稱
String filename = "a.jpg";//
//4.獲取MIME類型
String mimeType = context.getMimeType(filename);
System.out.println(mimeType);// 輸出爲 : image/jpeg
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
2. 它是域對象,可以用來共享數據
ServletContext對象範圍:所有用戶所有請求的數據,因爲ServletContext的作用域比較大,全局的作用域,所以注意數據的有效期,長期被系統持有將會佔用內存
- setAttribute(String name,Object value)
- getAttribute(String name)
- removeAttribute(String name)
3. 獲取文件的真實(服務器)路徑
@WebServlet("/servletContextDemo5")
public class ServletContextDemo5 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 通過HttpServlet獲取
ServletContext context = this.getServletContext();
// 獲取文件的服務器路徑
String b = context.getRealPath("/b.txt");//web目錄下資源訪問
System.out.println(b);
String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目錄下的資源訪問
System.out.println(c);
String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目錄下的資源訪問
System.out.println(a);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
demo:下載文件
文件下載需求:
1. 頁面顯示超鏈接
2. 點擊超鏈接後彈出下載提示框
3. 完成圖片文件下載
分析:
1. 超鏈接指向的資源如果能夠被瀏覽器解析,則在瀏覽器中展示,如果不能解析,則彈出下載提示框。不滿足需求
2. 任何資源都必須彈出下載提示框
3. 使用響應頭設置資源的打開方式:
content-disposition:attachment;filename=xxx
步驟:
1. 定義頁面,編輯超鏈接href屬性,指向Servlet,傳遞資源名稱filename
2. 定義Servlet
1. 獲取文件名稱
2. 使用字節輸入流加載文件進內存
3. 指定response的響應頭: content-disposition:attachment;filename=xxx
4. 將數據寫出到response輸出流
問題:中文文件問題
解決思路:
1. 獲取客戶端使用的瀏覽器版本信息
2. 根據不同的版本信息,設置filename的編碼方式不同
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/day15/downloadServlet?filename=九尾.jpg">圖片1</a>
<a href="/day15/downloadServlet?filename=1.avi">視頻</a>
</body>
</html>
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.獲取請求參數,文件名稱
String filename = request.getParameter("filename");
//2.使用字節輸入流加載文件進內存
//2.1找到文件服務器路徑
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/img/" + filename);
//2.2用字節流關聯
FileInputStream fis = new FileInputStream(realPath);
//3.設置response的響應頭
//3.1設置響應頭類型:content-type
String mimeType = servletContext.getMimeType(filename);//獲取文件的mime類型
response.setHeader("content-type",mimeType);
//3.2設置響應頭打開方式:content-disposition
//解決中文文件名問題
//1.獲取user-agent請求頭、
String agent = request.getHeader("user-agent");
//2.使用工具類方法編碼文件名即可
filename = DownLoadUtils.getFileName(agent, filename);
response.setHeader("content-disposition","attachment;filename="+filename);
//4.將輸入流的數據寫出到輸出流中
ServletOutputStream sos = response.getOutputStream();
byte[] buff = new byte[1024 * 8];
int len = 0;
while((len = fis.read(buff)) != -1){
sos.write(buff,0,len);
}
fis.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
public class DownLoadUtils {
public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
if (agent.contains("MSIE")) {
// IE瀏覽器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐瀏覽器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它瀏覽器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
}