inputstream转fileinputstream对象_Java Web--Servlet--HttpServletResponse对象
HttpServletResponse對象
- 一、HttpServletResponse對象介紹
- 1.1、負責向客戶端(瀏覽器)發送數據的相關方法
- 1.2、負責向客戶端(瀏覽器)發送響應頭的相關方法
- 1.3、負責向客戶端(瀏覽器)發送響應狀態碼的相關方法
- 1.4、響應狀態碼的常量
- 二、HttpServletResponse對象常見應用
- 2.1、Response輸出方法
- 2.2、Response亂碼問題
- 2.3、中文文件下載
- 三、HttpServletResponse常見應用——設置響應頭控制瀏覽器的行為
- 3.1、設置http響應頭控制瀏覽器禁止緩存當前文檔內容
- 3.2、設置http響應頭控制瀏覽器定時刷新網頁(refresh)
- 3.3、通過response實現請求重定向
- 3.4、重定向與轉發的區別
- 四、web工程中URL地址的推薦寫法
- 4.1、"/"代表當前web工程的常見應用場景
- 4.2、"/"代表webapps目錄的常見應用場景
HttpServletResponse對象
一、HttpServletResponse對象介紹
HttpServletResponse對象代表服務器的響應。這個對象中封裝了向客戶端發送數據、發送響應頭,發送響應狀態碼的方法。查看HttpServletResponse的API,可以看到這些相關的方法。
1.1、負責向客戶端(瀏覽器)發送數據的相關方法
1.2、負責向客戶端(瀏覽器)發送響應頭的相關方法
1.3、負責向客戶端(瀏覽器)發送響應狀態碼的相關方法
1.4、響應狀態碼的常量
HttpServletResponse定義了很多狀態碼的常量(具體可以查看Servlet的API),當需要向客戶端發送響應狀態碼時,可以使用這些常量,避免了直接寫數字,常見的狀態碼對應的常量:狀態碼404對應的常量
狀態碼200對應的常量
狀態碼500對應的常量
二、HttpServletResponse對象常見應用
2.1、Response輸出方法
- PrintWriter getWriter()
- 獲得字符流,通過字符流的write(String s)方法可以將字符串設置到response緩沖區中,隨后Tomcat會將response緩沖區中的內容組裝成Http響應返回給瀏覽器端。
- ServletOutputStream getOutputStream()
- 獲得字節流,通過該字節流的write(byte[] bytes)可以向response緩沖區中寫入字節,再由Tomcat服務器將字節內容組成Http響應返回給瀏覽器。
注意:雖然response對象的getOutSream()和getWriter()方法都可以發送響應消息體,但是他們之間相互排斥,不可以同時使用,否則會發生異常。
2.2、Response亂碼問題
亂碼發生的原因:
計算機中的數據都是以二進制進行存儲的,因此傳輸文本時,就會發生字節和字符之間的轉換。字符與字節之間的轉換需要查碼表完成,將字符轉換為字節的過程叫做編碼,將字節轉換為字符的過程叫做解碼。如果編碼和解碼使用的碼表不一致,就會發生亂碼。這就是亂碼發生的根本原因①、response緩沖區的默認編碼是iso8859-1,此碼表中沒有中文。所以需要更改response的編碼方式:
②、通過更改response的編碼方式為UTF-8,任然無法解決亂碼問題,因為發送端服務端雖然改變了編碼方式為UTF-8,但是接收端瀏覽器端仍然使用GB2312編碼方式解碼,還是無法還原正常的中文,因此還需要告知瀏覽器端使用UTF-8編碼去解碼。
上面通過調用兩個方式分別改變服務端對于Response的編碼方式以及瀏覽器的解碼方式為同樣的UTF-8編碼來解決編碼方式不一樣發生亂碼的問題。response.setContentType("text/html;charset=UTF-8")這個方法包含了上面的兩個方法的調用,因此在實際的開發中,只需要調用一個response.setContentType("text/html;charset=UTF-8")方法即可。
2.3、中文文件下載
示例:文件下載 注意:下載中文文件時,需要注意的地方就是中文文件名要使用URLEncoder.encode方法進行編碼:URLEncoder.encode(fileName, "字符編碼"),否則會出現文件名亂碼。ResponseDemo02.java
- package com.lovo.study;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.URLEncoder;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class ResponseDemo02 extends HttpServlet {
- private static final long serialVersionUID = 1L;
- public ResponseDemo02() {
- super();
- }
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- //獲取要下載文件的絕對路勁
- String realPath = this.getServletContext().getRealPath("/downloads/美女.jpg");
- //獲取要下載的文件名
- String fileName = realPath.substring(realPath.lastIndexOf("") + 1);
- //設置content-disposition響應頭控制瀏覽器以下載的形式打開文件,
- //中文文件名要使用URLEncoder.encode方法進行編碼,否則會出現文件名亂碼
- response.setHeader("Content-disposition",
- "attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
- InputStream in = new FileInputStream(realPath);
- int len = 0;
- byte [] buffer = new byte[1024];
- OutputStream out = response.getOutputStream();
- while((len = in.read(buffer)) > 0){
- out.write(buffer,0,len);
- }
- in.close();
- }
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- doGet(request, response);
- }
- }
三、HttpServletResponse常見應用——設置響應頭控制瀏覽器的行為
3.1、設置http響應頭控制瀏覽器禁止緩存當前文檔內容
- response.setDateHeader("expries", -1);
- response.setHeader("Cache-Control", "no-cache");
- response.setHeader("Pragma", "no-cache");
3.2、設置http響應頭控制瀏覽器定時刷新網頁(refresh)
- response.setHeader("refresh", "5");//設置refresh響應頭控制瀏覽器每隔5秒鐘刷新一次
3.3、通過response實現請求重定向
請求重定向:一個web資源收到客戶端請求后,通知客戶端去訪問另外一個web資源,這稱之為請求重定向。實現方式:response.sendRedirect(String location),即調用response對象的sendRedirect方法實現請求重定向sendRedirect內部的實現原理:使用response設置302狀態碼和設置location響應頭實現重定向
- package com.lovo.study;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class ResponseDemo03 extends HttpServlet {
- private static final long serialVersionUID = 1L;
- public ResponseDemo03() {
- super();
- }
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- /**
- * 1.調用sendRedirect方法實現請求重定向,
- * sendRedirect方法內部調用了
- * response.setHeader("Location", "/request_form.jsp");
- * response.setStatus(HttpServletResponse.SC_FOUND);//設置302狀態碼,等同于response.setStatus(302);
- */
- response.sendRedirect("/request_form.jsp");
- }
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- doGet(request, response);
- }
- }
3.4、重定向與轉發的區別
1)轉發是服務器行為,重定向是客戶端行為。 為什么這樣說呢,這就要看兩個動作的工作流程:轉發過程:客戶瀏覽器發送http請求——web服務器接受此請求——調用內部的一個方法在容器內部完成請求處理和轉發動作——將目標資源發送給客戶;在這里,轉發的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到服務器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。重定向過程:客戶瀏覽器發送http請求——web服務器接受后發送302狀態碼響應及對應新的location給客戶瀏覽器——客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location地址——服務器根據此請求尋找資源并發送給客戶。在這里location可以重定向到任意URL,既然是瀏覽器重新發出了請求,則就沒有什么request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。2).對信息的傳輸不一樣重定向,其實是兩次request第一次,客戶端request A,服務器響應,并response回來,告訴瀏覽器,你應該去B。這個時候IE可以看到地址變了,而且歷史的回退按鈕也亮了。重定向可以訪問自己web應用以外的資源。在重定向的過程中,傳輸的信息會被丟失。請求轉發是服務器內部把對一個request/response的處理權,移交給另外一個對于客戶端而言,它只知道自己最早請求的那個A,而不知道中間的B,甚至C、D。傳輸的信息不會丟失。3).對于路徑的認知不一樣請求轉發是服務器端的動作,所以當轉發路徑如:
- request.getRequestDispatcher("/RequestDemo07").forward(request, response);
路徑前的絕對路徑"/",會被認為是當前工程的根目錄,也就是說,如果當前路徑是:http://localhost:8080/ServletDemo/RequestDemo06那么根據上面的跳轉就會跳轉到http://localhost:8080/ServletDemo/RequestDemo07而重定向,如下面的路徑: response.sendRedirect("/RequestDemo07");如果當前路徑是: http://localhost:8080/ServletDemo/RequestDemo06就會跳轉到: http://localhost:8080/RequestDemo07
四、web工程中URL地址的推薦寫法
在JavaWeb開發中,只要是寫URL地址,那么建議最好以"/"開頭,也就是使用絕對路徑的方式,那么這個"/"到底代表什么呢?可以用如下的方式來記憶"/":如果"/"是給服務器用的,則代表當前的web工程,如果"/"是給瀏覽器用的,則代表webapps目錄。
4.1、"/"代表當前web工程的常見應用場景
①.ServletContext.getRealPath(String path)獲取資源的絕對路徑
- /**
- * 1.ServletContext.getRealPath("/download/1.JPG")是用來獲取服務器上的某個資源,
- * 那么這個"/"就是給服務器用的,"/"此時代表的就是web工程
- * ServletContext.getRealPath("/download/1.JPG")表示的就是讀取web工程下的download文件夾中的1.JPG這個資源
- * 只要明白了"/"代表的具體含義,就可以很快寫出要訪問的web資源的絕對路徑
- */
- this.getServletContext().getRealPath("/download/1.JPG");
②.在服務器端forward到其他頁面
- /**
- * 2.forward
- * 客戶端請求某個web資源,服務器跳轉到另外一個web資源,這個forward也是給服務器用的,
- * 那么這個"/"就是給服務器用的,所以此時"/"代表的就是web工程
- */
- this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
③.使用include指令或者<jsp:include>標簽引入頁面
- <%@include file="/jspfragments/head.jspf" %>
- <jsp:include page="/jspfragments/demo.jsp" />
此時"/"代表的都是web工程。
4.2、"/"代表webapps目錄的常見應用場景
①.使用sendRedirect實現請求重定向
- response.sendRedirect("/index.jsp");
服務器發送一個URL地址給瀏覽器,瀏覽器拿到URL地址之后,再去請求服務器,所以這個"/"是給瀏覽器使用的,此時"/"代表的就是webapps目錄,也就是上面的路徑實際是:
- http://localhost:8080/index.jsp
這樣的路徑肯定不不正確的,所以要正常訪問需要改為:
- response.sendRedirect("/SerlvetDemo(工程名)/index.jsp");
這種寫法是將項目名稱寫死在程序中的做法,不靈活,萬一哪天項目名稱變了,此時就得改程序,所以推薦使用下面的靈活寫法:
- response.sendRedirect(request.getContextPath()+"/index.jsp");
request.getContextPath()獲取到的內容就是"/ServletDemo",這樣就比較靈活了,使用request.getContextPath()代替"/項目名稱",推薦使用這種方式,靈活方便!②.使用超鏈接跳轉
- <a href="/ServletDemo/index.jsp">跳轉到首頁</a>
這是客戶端瀏覽器使用的超鏈接跳轉,這個"/"是給瀏覽器使用的,此時"/"代表的就是webapps目錄。使用超鏈接訪問web資源,絕對路徑的寫法推薦使用下面的寫法改進:
- <a href="${pageContext.request.contextPath}/index.jsp">跳轉到首頁</a>
③.Form表單提交④.js腳本和css樣式文件的引用 處理方案等同于超鏈接案例:生成隨機圖片
- package com.lovo.study;
- import java.awt.Color;
- import java.awt.Font;
- import java.awt.Graphics2D;
- import java.awt.image.BufferedImage;
- import java.io.IOException;
- import javax.imageio.ImageIO;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class ResponseDemo04 extends HttpServlet {
- private static final long serialVersionUID = 1L;
- public ResponseDemo04() {
- super();
- }
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- response.setHeader("refresh", "5");
- BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
- Graphics2D g = (Graphics2D)image.getGraphics();
- //先設置畫筆顏色然后畫背景顏色
- g.setColor(Color.WHITE);
- g.fillRect(0, 0, 80, 20);
- //設置畫筆顏色畫數字
- g.setColor(Color.BLUE);
- //設置字體
- g.setFont(new Font(null, Font.BOLD, 20));
- //生產隨機數
- int [] nums = {0,1,2,3,4,5,6,7,8,9};
- String str = "";
- for(int i=0; i<6; i++){
- int n = (int)Math.floor(Math.random() * 10);
- str += n;
- }
- //畫字符串
- g.drawString(str, 0, 20);
- //設置響應頭以圖片方式打開
- response.setContentType("image/jpeg");
- //設置響應頭清除緩存
- response.setDateHeader("expries", -1);
- response.setHeader("Cache-Control", "no-cache");
- response.setHeader("Pragma", "no-cache");
- //6.將圖片寫給瀏覽器
- ImageIO.write(image, "jpg", response.getOutputStream());
- }
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- doGet(request, response);
- }
- }
總結
以上是生活随笔為你收集整理的inputstream转fileinputstream对象_Java Web--Servlet--HttpServletResponse对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: numberformatexceptio
- 下一篇: java native方法_并发系列-n