複習點:一、重定向問題 二、輸出字符串到瀏覽器。三、文件下載需求:1. 頁面顯示超連接2. 點擊超連接後彈出下載提示框3. 完成圖片文件下載html
Request和Response程序員
Request:web
一、request和response原理:apache
一、瀏覽器向服務器發送請求,tomcat服務器會根據請求url中的資源路徑建立對應的ServletDemo類的對象。瀏覽器
二、tomcat會建立request和response對象,並將請求消息數據封裝到request對象緩存
三、tomcat調用service方法,並傳遞request和response兩個對象做爲參數。tomcat
四、程序員能夠經過request對象獲取請求消息數據,和經過response對象設置響應消息數據。服務器
五、服務器從response對象中拿出響應數據並反饋給瀏覽器。工具
二、request對象繼承體系結構:post
ServletRequest 接口 <--- HttpServletRequest 接口 <--- org.apache.catalina.connector.RequestFacade 類 (tomcat實現的)
三、request功能
一、獲取請求消息數據。
一、獲取請求行數據經常使用的方法:
*獲取虛擬目錄:String getContextPath()
*獲取請求URI:String getRequestURI(), URL:StringBuffer getRequestURL()
二、獲取請求頭數據:
* String getHeader(String name):經過請求頭的名稱獲取其值。
二、獲取請求體數據:
* 請求體只有POST請求方式纔有,在請求體中封裝了POST請求的請求參數。
* 步驟:一、獲取流對象:
*獲取字符輸入流:BufferedReader getReader()
* 獲取字節輸入流:ServletInputStream getInputStream()
二、從流對象中獲取數據。
二、request其餘功能:
一、獲取請求參數的通用方式(get/post均可以):
* String getParameter(String name):根據參數名稱獲取其值。
* String[ ] getParameterValues(String name):根據參數名稱獲取其值的數據(複選框)
* Enumeration<String> getParameterName():獲取全部請求參數名稱。
* Map<String,String[ ] > getParameterMap():獲取全部參數的map集合。
*中文亂問題:get方式:tomcat8自動解決。post方式:獲取參數前,設置編碼 request.setCharacterEncoding("utf-8");
二、請求轉發:一種在服務器內部的資源跳轉方式。
*步驟:一、經過request對象獲取請求轉發器對象:RequestDispatcher getRequestDispatcher(String path)
二、使用RequestDispatcher對象來轉發:forward(ServletRequest request,ServletResponse response)
*特色:一、瀏覽器地址欄不發生變化就訪問了多個資源。
二、只能轉發到當前服務器的內部資源。
三、轉發使用的是一次請求。
三、共享數據:
* 域對象:一個有做用範圍的對象,能夠在範圍內共享數據。
*request 域:表明一次請求的範圍,通常用於請求轉發的多個資源中共享數據。
* 方法:void setAttribute(String name,Object obj)存儲資源。
Object getAttribute(String name) :經過鍵獲取值。
void removeAttribute(String name) 經過鍵 移除鍵值對。
四、獲取ServletContext:
*ServletContext getServletContext();
Response:
一、響應消息:
數據格式:
一、響應行:組成:協議/版本 響應狀態碼 狀態碼描述 HTTP/1.1 200 OK
* 狀態碼都是三位數的,分類:
一、1XX:服務器接收了客戶端消息,可是沒接收完成,發送1xx詢問是否還要發送。
二、2xx:成功。表明:200.
三、3xx:重定向。表明:302(重定向),A資源沒法解決請求數據的問題,但A知道B能解決,返回302,讓客戶端訪問B。 304(訪問緩存),服務器發現請求的數據在你客戶端有,返回304讓客戶端在本地找。
四、4xx:客戶端錯誤。表明:404(請求路徑沒有對應資源)405(請求方式沒有對應的doXX方法)
五、5xx:服務端錯誤。表明:500(服務器內部錯誤)
*
二、響應頭:格式:頭名稱:值
* 常見的響應頭:一、Content-Type:告訴客戶端本此響應體數據格式和編碼格式。
二、Content-disposition:告訴客戶端用什麼格式打開響應體數據。
值:in-line:默認,在當前頁面打開。
attachment;filename=xxx :以附件形式打開響應體。用來文件下載。
三、響應空行:
四、響應體:傳輸的數據。
二、Response功能。
一、設置響應消息。
* 設置響應行:設置狀態碼:setStatus(int sc)
*設置響應頭:setHeader(String name ,String value)
*設置響應體:使用輸出流。
一、獲取輸出流:字符:PrintWriter getWriter() 字節:ServletOuntputStream getOutputStream()
案例:
一、完成重定向:資源跳轉的方式。response.sendRedirect(跳轉路徑)
* 轉發的特色:
一、地址欄路徑不變。二、轉發只能訪問當前服務器下的資源。三、轉發是一次請求,可共享數據。
*重定向的特色:
一、地址欄路徑改變。二、能夠訪問其餘服務器的資源。三、重定向是兩次請求,不能共享數據。
二、路徑的一些問題。
項目中正確使用相對/絕對路徑,使用虛擬目錄時,建議動態獲取虛擬目錄:request.getContextPath()
三、服務器輸出字符數據到瀏覽器:
一、解決亂碼問題:response.setContentType("text/html;charset=utf-8");
二、獲取字符輸出流 PrintWriter getWriter()。而後使用wite()輸出。
四、服務器輸出字節數據到瀏覽器:response.getOutputStream()
五、驗證碼。
ServletContext對象:
一、概念:表明整個web應用,能夠和程序的容器(服務器)來通訊。
二、獲取:
* 經過request來獲取 :request.getServletContext()
* 經過HttpServlet來獲取:this.getServletContext()
三、功能:
*獲取MIME類型。
MIME類型:在互聯網通訊過程當中定義的一種文件數據類型。格式:大類型/小類型 text/html
獲取:String getMimeType(String file)
*域對象:共享數據。setAttribute()
*獲取文件的真實(服務器)路徑 String getRealPath(String path)
案例:文件下載。
文件下載需求: 1. 頁面顯示超連接2. 點擊超連接後彈出下載提示框3. 完成圖片文件下載
@WebServlet("/downloadServlet") public class DownloadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String filename=request.getParameter("filename"); ServletContext servletContext = this.getServletContext(); String realPath = servletContext.getRealPath("/img/" + filename); FileInputStream fis=new FileInputStream(realPath); String mimeType = servletContext.getMimeType(filename); response.setHeader("content-type",mimeType); response.setHeader("content-disposition","attachment;filename="+filename); ServletOutputStream sos=response.getOutputStream(); byte[] buff=new byte[1024]; 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 { doPost(request,response); } }
中文文件問題:
解決思路:獲取客戶端使用的瀏覽器版本信息,而後根據不一樣的版本信息設置filename的編碼。
使用工具類方便操做。