Java Web学习(七)HttpServletResponse(客户端响应)
生活随笔
收集整理的這篇文章主要介紹了
Java Web学习(七)HttpServletResponse(客户端响应)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文借鑒:孤傲蒼狼(特此感謝!)
一、定義
HttpServletResponse對象代表服務端的響應,通過這個對象提供的方法,可以向客戶機輸出數據。
二、常用方法
PS:在JavaWeb開發中,只要是寫URL地址,那么建議最好以"/"開頭,也就是使用絕對路徑的方式,如果"/"是給服務器用的,則代表當前的web工程,如果"/"是給瀏覽器用的,則代表webapps目錄。
PS:也可以使用request.getContextPath()來代替"/項目名稱"的方式,這樣更加靈活。
/*** 1.向客戶端(瀏覽器)發送數據* 原理:Servlet程序向ServletOutputStream或PrintWriter對象中寫入的數據將被Servlet引擎從response里面獲取,Servlet引擎將這些數據當作響應消息的正文,然后再與響應狀態行和各響應頭組合后輸出到客戶端。* PS:getOutputStream和getWriter這兩個方法互相排斥,調用了其中的任何一個方法后,就不能再調用另一方法。* PS:Serlvet的service方法結束后,Servlet引擎將檢查getWriter或getOutputStream方法返回的輸出流對象是否已經調用過close方法,如果沒有,Servlet引擎將調用close方法關閉該輸出流對象。*/OutputStream outputStream = response.getOutputStream();//獲取OutputStream輸出流(輸出二進制數據)PrintWriter out = response.getWriter();//獲取PrintWriter輸出流(輸出文本數據)/*** 2.設置響應頭相關(設置響應頭可以控制瀏覽器的行為)*/response.setCharacterEncoding("UTF-8");//設置將數據以"UTF-8"編碼輸出到客戶端瀏覽器response.setHeader("content-type", "text/html;charset=UTF-8");//控制瀏覽器以UTF-8的編碼顯示數據response.setStatus(HttpServletResponse.SC_OK);//設置響應碼response.setHeader("refresh", "5");//控制瀏覽器每隔5秒鐘刷新一次response.setContentType("image/jpeg");//告訴瀏覽器以該類型處理數據(控制瀏覽器以圖片的方式打開)response.setDateHeader("expries", -1);//控制瀏覽器不緩存數據response.setHeader("Cache-Control", "no-cache");//控制瀏覽器不緩存數據response.setHeader("Pragma", "no-cache");//控制瀏覽器不緩存數據/*** 3.重定向*///法1:調用sendRedirect()方法response.sendRedirect("重定向地址");//重定向(內部的實現原理:使用response設置302狀態碼和設置location響應頭實現重定向)//法2:設置響應頭的Location屬性和Status狀態碼response.setHeader("Location", "跳轉地址");//設置跳轉地址response.setStatus(HttpServletResponse.SC_FOUND);//設置302狀態碼,等同于response.setStatus(302);?
三、字符解析詳解(中文亂碼的問題)
/*** 服務器響應(中文亂碼問題)* PS:在開發過程中,如果希望服務器輸出什么瀏覽器就能看到什么,那么在服務器端都要以字符串的形式進行輸出(無論輸出的是字符還是數字)。*/ public class ResponseDemo extends HttpServlet {/*** 輸出中文** @param response* @throws IOException*/public void outputChinese(HttpServletResponse response) throws IOException {String data = "中國";/*** 1.使用OutputStream流向客戶端瀏覽器輸出中文數據* PS:服務器端可以通過設置響應頭控制瀏覽器的行為* 例:設置響應頭控制瀏覽器以UTF-8的編碼顯示數據:response.setHeader("content-type", "text/html;charset=UTF-8");*/byte[] dataByteArr = data.getBytes("UTF-8");//將字符轉換成字節數組,指定以UTF-8編碼進行轉換(將字符轉換成字節數組的過程,這個過程中一定會去查碼表,如果是中文的操作系統環境,默認就是查找查GB2312的碼表)OutputStream outputStream = response.getOutputStream();//獲取OutputStream輸出流response.setHeader("content-type", "text/html;charset=UTF-8");//通過設置響應頭控制瀏覽器以UTF-8的編碼顯示數據,如果不加這句話,那么瀏覽器顯示的將是亂碼outputStream.write(dataByteArr);//使用OutputStream流向客戶端輸出字節數組/*** 2.使用PrintWriter流向客戶端瀏覽器輸出中文數據* PS:當需要向瀏覽器輸出字符數據時,使用PrintWriter比較方便,省去了將字符轉換成字節數組那一步。*/response.setCharacterEncoding("UTF-8");//設置將字符以"UTF-8"編碼輸出到客戶端瀏覽器PrintWriter out = response.getWriter();//獲取PrintWriter輸出流(PS:這句代碼必須放在response.setCharacterEncoding("UTF-8");之后,否則response.setCharacterEncoding("UTF-8")這行代碼的設置將無效,瀏覽器顯示的時候還是亂碼)response.setHeader("content-type", "text/html;charset=UTF-8");//設置響應頭,控制瀏覽器以指定的字符編碼編碼進行顯示out.write(data);//使用PrintWriter流向客戶端輸出字符 }}?
四、文件下載
PS:編寫文件下載功能時推薦使用OutputStream流,避免使用PrintWriter流,因為OutputStream流是字節流,可以處理任意類型的數據,而PrintWriter流是字符流,只能處理字符數據,如果用字符流處理字節數據,會導致數據丟失。
/*** 下載文件,通過OutputStream流* @param response* @throws FileNotFoundException* @throws IOException*/private void downloadFileByOutputStream(HttpServletResponse response)throws FileNotFoundException, IOException {//1.獲取要下載的文件的絕對路徑String realPath = this.getServletContext().getRealPath("/download/1.JPG");//2.獲取要下載的文件名String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);//3.設置content-disposition響應頭控制瀏覽器以下載的形式打開文件(PS:中文文件名的情況要使用URLEncoder.encode方法進行編碼:response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8"));)response.setHeader("content-disposition", "attachment;filename="+fileName);//4.獲取要下載的文件輸入流InputStream in = new FileInputStream(realPath);int len = 0;//5.創建數據緩沖區(一次讀取1024個字節)byte[] buffer = new byte[1024];//6.通過response對象獲取OutputStream流OutputStream out = response.getOutputStream();//7.將FileInputStream流寫入到buffer緩沖區while ((len = in.read(buffer)) > 0) {//8.使用OutputStream將緩沖區的數據輸出到客戶端瀏覽器out.write(buffer,0,len);}in.close();}?
轉載于:https://www.cnblogs.com/riches/p/11413798.html
總結
以上是生活随笔為你收集整理的Java Web学习(七)HttpServletResponse(客户端响应)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue子组件改变父组件的值
- 下一篇: 爬虫百度图片