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