JavaWeb10-HTML篇筆記(一)
HTTP協議: * HTTP協議請求部分: * 請求行 :請求方式 請求路徑 協議版本 * 請求頭 :一個key對應一個value ,也有一個key對應多個value * Referer,User-Agent,If-Modified-Since * 請求體 :POST方式的參數. * HTTP協議響應部分: * 響應行 :協議版本 狀態碼 狀態碼描述 * 狀態碼:200 302 304 404 500 * 響應頭 :一個key對應一個value ,也有一個key對應多個value * Location,Refresh,Last-Modified,禁用本地緩存,Content-Dispostion * 響應體 :顯示到頁面的內容. Servlet:服務器端程序. * 編寫Servlet: * 編寫一個類,實現Servlet接口.繼承GenericServlet,HttpServlet. * 配置Servlet.在web.xml中配置Servlet * Servlet的執行原理: * Servlet的生命周期: * 第一次訪問Servlet的時候,服務器創建一個Servlet的對象.init方法就會執行.任何一次請求服務器都會創建一個新的線程執行service方法.service的方法內部根據請求方式調用doXXX方法.當服務器關閉的時候,servlet就會被銷毀.destroy方法就會執行. * Servlet的接口實現關系: * Servlet的登錄的案例: * 頁面提交Servlet * 獲得請求參數:request.getParameter(); * 封裝請求參數: * 調用業務層類: * 根據處理結果作出響應: * 頁面定時刷新: * ServletConfig對象:(了解) * ServletContext對象:(重要)-被多個用戶共享. * 記錄網站被登錄的次數. * 在服務器啟動的時候ServletContext就會被創建.一個WEB項目創建一個ServletContext對象.
在服務器關閉的時候銷毀.域對象-存的數據有作用範圍.
- 功能:
- 1.獲得文件的MIME的類型.
- 2.獲得全局初始化參數.
- 3.存取數據-作為域對象來使用.
- setAttribute(String name,String value);
- getAttribute(String name);
- removeAttribute(String name);
- 4.讀取WEB項目的文件:
- getResourceAsStream(String path);
- getRealPath(String path);
1.2 案例一:完成登錄用戶對他提供文件的下載的功能.1.2.1 需求:
之前的案例中已經完成的了一個登錄的功能,登錄失敗後回到登錄頁面.登錄成功以後,服務器提供多個文件的下載的鏈接,點擊鏈接可以完成文件的下載的功能.
【響應對象-Response對象】
? 響應行:
Response設置狀態碼:
? 響應頭:
Response設置響應頭:- 一個key對應一個value
- 一個key對應多個value
? 響應體:
Response設置響應體:
【response處理中文亂碼】
- 一個key對應一個value
? 字節流:
設置瀏覽器默認打開編碼
response.setHeader("Content-Type", "text/html;charset=UTF-8");
中文轉成字節數組編碼
response.getOutputStream().write("王守義".getBytes("UTF-8"));
? 字符流:
設置response的緩沖區的編碼
response.setCharacterEncoding("UTF-8");
設置瀏覽器默認打開的編碼.
response.setHeader("Content-Type", "text/html;charset=UTF-8");
response.setContentType("text/html;charset=UTF-8");相當於上面兩句
【文件下載】
一種:超鏈接方式.(不推薦)
- <a href=”aa.zip”>下載</a>
- <a href=”1.jpg”>下載</a>
二種:手動編碼方式完成文件下載. - 設置兩個頭和一個流:
- Content-Type:文件MIME的類型.
- Content-Dispostion:
- 文件的輸入流:
1.2.2.2 步驟分析:
? 之前的登錄案例已經存在:
? 登錄成功跳轉的頁面上提供一組鏈接:
? 當點擊下載的鏈接之後,提交到Servlet:
? 設置兩個頭和一個流:
1.2.3 代碼實現:
1.在頁面中提供一組下載的鏈接:
response.getWriter().println("<h2>手動編碼方式下載</h2>");
response.getWriter().println("<a href=‘/WEB10/downloadServlet?filename=a.bmp‘>a.bmp</a><br/>");
response.getWriter().println("<a href=‘/WEB10/downloadServlet?filename=WEB01.zip‘>WEB01.zip</a>");
2.編寫DownloadServlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 接收參數:
* 設置兩個頭和一個流:
* 文件輸入流和響應的輸出流對接:
*/
// 接收參數:get亂碼 new String("中文".getBytes("ISO-8859-1"),"UTF-8");
String filename = request.getParameter("filename");
System.out.println(filename);
// 設置兩個頭和一個流:
// 設置Content-Type頭
String fileType = this.getServletContext().getMimeType(filename);
response.setContentType(fileType);
// 設置Content-Disposition:
response.setHeader("Content-Disposition", "attachment;filename="+filename);
// 設置文件的輸入流:
String path = this.getServletContext().getRealPath("/download/"+filename); //
InputStream is = new FileInputStream(path);
OutputStream os = response.getOutputStream();
int len = 0;
byte[] b = new byte[1024];
while((len = is.read(b))!=-1){
os.write(b, 0, len);
}
is.close();
}
1.2.4 總結:
1.2.4.1 中文文件名下載:
中文文件在不同的瀏覽器中編碼方式不同:
IE :URL編碼
Firefox :Base64編碼
if(agent.contains("Firefox")){
// 火狐瀏覽器
filename = base64EncodeFileName(filename);
}else{
// IE,其他瀏覽器
filename = URLEncoder.encode(filename, "UTF-8");
}
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
JavaWeb10-HTML篇筆記(一)