日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

inputstream转fileinputstream对象_Java Web--Servlet--HttpServletResponse对象

發布時間:2025/3/15 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 嫩草影院一区二区 | 欧美另类精品xxxx孕妇 | av嫩草 | 国产一二区在线观看 | 国产熟女一区二区三区四区 | 久久日视频 | 国产精品综合久久久 | tube极品少妇videos | 黄色男人的天堂 | 欧美日韩中文一区 | 综合人人 | 熟女视频一区二区三区 | 五月天婷婷综合网 | 在线观看av日韩 | 精品在线一区二区三区 | 欧美黄色性生活 | 成人一区二 | 日本免费a级片 | 日韩一区二区视频在线 | 精品国产麻豆 | 欧美高清在线视频 | 99久久婷婷国产精品综合 | 日韩黄色成人 | 国家队动漫免费观看在线观看晨光 | a∨视频 | 一区二区在线视频观看 | 伊人98 | 99亚洲国产精品 | 一区二区三区视频在线播放 | 撸大师av| xxx黄色片 | 99久久久无码国产精品6 | 手机在线永久免费观看av片 | 成人在线观看你懂的 | 国产91沙发系列 | 亚洲欧美一区二区精品久久久 | 亚洲吧 | 日韩黄网站 | 国产无套内射普通话对白 | 国产精品视频亚洲 | 美女洗澡无遮挡 | 午夜视频在线免费 | 无码人妻精品一区二区蜜桃网站 | 91黄漫| av影片在线观看 | 91网站免费观看 | 一级特黄录像免费看 | 亚洲av无码专区在线播放中文 | 亚洲av成人精品一区二区三区 | 成人国产综合 | 欧美少妇网| 96精品在线 | 欧美巨鞭大战丰满少妇 | 国产免费看黄 | 欧美大片免费在线观看 | 久久9久久 | 另类国产 | 日本美女毛片 | 亚洲一区二区电影网 | 91久久影院 | 亚洲一区电影 | 亚洲精品久久久久久 | aaaaaaa毛片 | 狠狠影视| 麻豆一区二区三区精品视频 | 久久久久性色av无码一区二区 | 传媒视频在线观看 | 久久激情婷婷 | 天天色影网 | 欧美 日韩 国产 精品 | 久草福利资源 | 五月婷婷,六月丁香 | 国产特级av | 中文字幕一区电影 | 人物动物互动39集免费观看 | 日韩人妻一区二区三区蜜桃 | 亚洲va国产天堂va久久 en | 致单身男女免费观看完整版 | 国产一级视频在线 | 日韩在线专区 | 校园伸入裙底揉捏1v1h | 亚洲在线视频观看 | 成人刺激视频 | 国产在线一二三区 | 人人妻人人澡人人爽人人精品 | 一本到av| 成人一级毛片 | 国产精品玖玖玖 | 黄色国产在线播放 | 麻豆国产精品 | 国产免费又爽又色又粗视频 | 无码人妻精品一区二区蜜桃色欲 | 麻豆蜜臀 | 神马午夜影院 | 国产精品久久久久久亚洲影视 | 欧美亚洲天堂网 | 亚洲成人激情在线 | 四虎影视成人永久免费观看亚洲欧美 | 婷婷的五月天 |