web14 HttpServletResponse

  • response是在請(qǐng)求網(wǎng)址時(shí)候和request一起創(chuàng)建好的只不過(guò)是空的月腋,在doget方法中寫入返回的數(shù)據(jù)(寫給的是response,之后toncat將響應(yīng)行響應(yīng)頭一起和數(shù)據(jù)封裝成返回給客戶端的響應(yīng))
  • 302是為了代碼重定向使用的?重定向請(qǐng)求一次以上服務(wù)器
5秒之后跳轉(zhuǎn)到百度:不常用因?yàn)槭欠?wù)器端寫死頁(yè)面不會(huì)有動(dòng)態(tài)效果
response.setHeader("refresh", "5,url=http://www.baidu.com");
  • html等輔助輸入提示
    繼續(xù)打開(kāi)web→html Files→Editor→Content Assist
    修改Prompt when these characters are inserted:<=.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW
    js 類似值 :.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW

  • 寫圖片先有字節(jié)輸入流需要去讀圖片(絕對(duì)地址用相對(duì)地址去獲得)缰趋,寫時(shí)候用快速方法byte【1024】总放,while((len=in.read(byte))>0){out.write(byte,0,len)}

1.響應(yīng)的response的運(yùn)行流程

  • 因?yàn)閞esponse代表響應(yīng),所以我們可以通過(guò)該對(duì)象分別設(shè)置Http響應(yīng)的響應(yīng)行谷浅,響 應(yīng)頭和響應(yīng)體
Paste_Image.png
  • 通過(guò)response設(shè)置響應(yīng)行
    設(shè)置響應(yīng)行的狀態(tài)碼
    setStatus(int sc)
  • 通過(guò)response設(shè)置響應(yīng)頭(add增加扒俯,set覆蓋)
addHeader(String name, String value) 
addIntHeader(String name, int value) 
addDateHeader(String name, long date) 
setHeader(String name, String value) ***
setDateHeader(String name, long date) 
setIntHeader(String name, int value)
  • 通過(guò)response設(shè)置響應(yīng)體
(1)響應(yīng)體設(shè)置文本
PrintWriter getWriter()
獲得字符流,通過(guò)字符流的write(String s)方法可以將字符串設(shè)置到response  緩沖區(qū)中一疯,隨后Tomcat會(huì)將response緩沖區(qū)中的內(nèi)容組裝成Http響應(yīng)返回給瀏覽    器端撼玄。

關(guān)于設(shè)置中文的亂碼問(wèn)題
原因:response緩沖區(qū)的默認(rèn)編碼是iso8859-1,此碼表中沒(méi)有中文墩邀,可以通過(guò) response的setCharacterEncoding(String charset) 設(shè)置response的編碼

但我們發(fā)現(xiàn)客戶端還是不能正常顯示文字
原因:我們將response緩沖區(qū)的編碼設(shè)置成UTF-8掌猛,但瀏覽器的默認(rèn)編碼是本地系  統(tǒng)的編碼,因?yàn)槲覀兌际侵形南到y(tǒng)磕蒲,所以客戶端瀏覽器的默認(rèn)編碼是GBK留潦,我們可以  手動(dòng)修改瀏覽器的編碼是UTF-8。

我們還可以在代碼中指定瀏覽器解析頁(yè)面的編碼方式辣往,
通過(guò)response的setContentType(String type)方法指定頁(yè)面解析時(shí)的編碼是UTF-8
response.setContentType("text/html;charset=UTF-8");

上面的代碼不僅可以指定瀏覽器解析頁(yè)面時(shí)的編碼兔院,同時(shí)也內(nèi)含        setCharacterEncoding的功能,所以在實(shí)際開(kāi)發(fā)中只要編寫    response.setContentType("text/html;charset=UTF-8");就可以解決頁(yè)面輸出中文亂碼問(wèn)題站削。

(2)響應(yīng)頭設(shè)置字節(jié)
ServletOutputStream  getOutputStream()
獲得字節(jié)流坊萝,通過(guò)該字節(jié)流的write(byte[] bytes)可以向response緩沖區(qū)中寫入字  節(jié),在由Tomcat服務(wù)器將字節(jié)內(nèi)容組成Http響應(yīng)返回給瀏覽器许起。

2.文件下載

-----------重定向路徑----
設(shè)置兩個(gè)頭
//  設(shè)置狀態(tài)碼302
//      response.setStatus(302);
//      重定向路徑
//      response.setHeader("Location",   "/web14/servlet2");
//      效果一樣
//  response.sendRedirect( "/web14/servlet2");
//5秒后跳轉(zhuǎn)
    response.setHeader("refresh", "5,url=http://www.baidu.com");
-------亂碼問(wèn)題產(chǎn)生-------
有兩方面:tomcat讀取時(shí)候和讀取完客戶端展示時(shí)候
//      告訴tomcat存時(shí)候要utf-8
response.setCharacterEncoding("UTF-8");
//      告訴瀏覽器取時(shí)候要utf-8十偶,僅這一句就可以讓tomcat存時(shí)候也用u8
//response.setHeader("content-Type", "text/html;charset=utf-8");
//等同于
//response.setContentType( "text/html;charset=utf-8");
    PrintWriter writer = response.getWriter();
    writer.write("你好");
    
----------相當(dāng)于上傳圖片瀏覽器展示---------------
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 使用response獲得字節(jié)輸出流
        ServletOutputStream out = response.getOutputStream();
        // 獲得文件字節(jié)流
        String path = getServletContext().getRealPath("a.jpg");
        FileInputStream in = new FileInputStream(path);
        int len = 0;
        byte[] butter = new byte[1024];
        while ((len = in.read(butter)) > 0) {
            out.write(butter, 0, len);
        }
        in.close();
        out.close();
    }
-------------下載文件---------

----展示的下載頁(yè)面-------
<a href="/web14/fileDownload?filename=a.flv">a.flv</a><br>
參數(shù)filename讓response獲取到文件名字
fileDownload是xml中url
----xml------
<servlet-mapping>
    <servlet-name>FileDownload</servlet-name>
    <url-pattern>/fileDownload</url-pattern>
  </servlet-mapping>
--------servlet-------
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
主要修改兩個(gè)頭ContentType和Content-Disposition
        // 從html的參數(shù)或取名字
        String name = request.getParameter("filename");
        // 告訴瀏覽器下載文件的類型參數(shù)是從全局web.xml中的mime類型轉(zhuǎn)化
        // response.setContentType(this.getServletContext().getMimeType(name));
        // 告訴瀏覽器要附件下載而不是解開(kāi)
        response.setHeader("Content-Disposition", "attachment;filename=" + name);
        FileInputStream in = new FileInputStream(this.getServletContext().getRealPath("download/" + name));
        ServletOutputStream out = response.getOutputStream();
        int len = 0;
        byte[] buffer = new byte[1024];
        while ((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }
        in.close();
        out.close();// out是response獲取會(huì)自動(dòng)被關(guān)閉
    }
  • 1)告知瀏覽器文件的類型:response.setContentType(文件的MIME類型);(不寫也可以?)
  • 2)告示瀏覽器文件的打開(kāi)方式是下載:
    response.setHeader("Content-Disposition","attachment;filename=文件名稱");
  • 但是园细,如果下載中文文件惦积,頁(yè)面在下載時(shí)會(huì)出現(xiàn)中文亂碼或不能顯示文件名的情況, 原因是不同的瀏覽器默認(rèn)對(duì)下載文件的編碼方式不同猛频,ie是UTF-8編碼方式狮崩,而火狐 瀏覽器是Base64編碼方式。所里這里需要解決瀏覽器兼容性問(wèn)題鹿寻,解決瀏覽器兼容 性問(wèn)題的首要任務(wù)是要辨別訪問(wèn)者是ie還是火狐(其他)睦柴,通過(guò)Http請(qǐng)求體中的一個(gè)屬性可以辨別其中agent就是請(qǐng)求頭User-Agent的值
Paste_Image.png
  • 也就是在tomcat識(shí)別時(shí)候轉(zhuǎn)成u8(new String(filename.getBytes("ISO8859-1"), "UTF-8")),在客戶端識(shí)別之前根據(jù)不同客戶端以不同形式轉(zhuǎn)碼(if (agent.contains("MSIE")) {)
protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // *******文件名稱是中文的下載*******
        // 獲得要下載的文件的名稱
        String filename = request.getParameter("filename");// ????.jpg
        // 解決獲得中文參數(shù)的亂碼----
        filename = new String(filename.getBytes("ISO8859-1"), "UTF-8");// 美女.jpg
        // 獲得請(qǐng)求頭中的User-Agent
        String agent = request.getHeader("User-Agent");
        // 根據(jù)不同瀏覽器進(jìn)行不同的編碼
        String filenameEncoder = "";
        if (agent.contains("MSIE")) {
            // IE瀏覽器
            filenameEncoder = URLEncoder.encode(filename, "utf-8");
            filenameEncoder = filenameEncoder.replace("+", " ");
        } else if (agent.contains("Firefox")) {
            // 火狐瀏覽器
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filenameEncoder = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
        } else {
            // 其它瀏覽器
            filenameEncoder = URLEncoder.encode(filename, "utf-8");
        }
        // 要下載的這個(gè)文件的類型-----客戶端通過(guò)文件的MIME類型去區(qū)分類型      response.setContentType(this.getServletContext().getMimeType(filename));
        // 告訴客戶端該文件不是直接解析 而是以附件形式打開(kāi)(下載)----filename="+filename 客戶端默認(rèn)對(duì)名字進(jìn)行解碼
        response.setHeader("Content-Disposition", "attachment;filename=" + filenameEncoder);
        // 獲取文件的絕對(duì)路徑原來(lái)中文名字否則找不到
        String path = this.getServletContext().getRealPath("download/" + filename);
        // 獲得該文件的輸入流
        InputStream in = new FileInputStream(path);
        // 獲得輸出流---通過(guò)response獲得的輸出流 用于向客戶端寫內(nèi)容
        ServletOutputStream out = response.getOutputStream();
        // 文件拷貝的模板代碼
        int len = 0;
        byte[] buffer = new byte[1024];
        while ((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }
        in.close();
        // out.close();
    }
  • //response.getOutputStream();
    //response.getWriter();全局可以認(rèn)為兩種是一個(gè)不可以同時(shí)寫(就算有多個(gè)servlet)
  • 默認(rèn)重定向就是編碼結(jié)束時(shí)候
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末毡熏,一起剝皮案震驚了整個(gè)濱河市坦敌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖狱窘,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杜顺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡训柴,警方通過(guò)查閱死者的電腦和手機(jī)哑舒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)幻馁,“玉大人洗鸵,你說(shuō)我怎么就攤上這事≌锑拢” “怎么了膘滨?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)稀拐。 經(jīng)常有香客問(wèn)我火邓,道長(zhǎng),這世上最難降的妖魔是什么德撬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任铲咨,我火速辦了婚禮,結(jié)果婚禮上蜓洪,老公的妹妹穿的比我還像新娘纤勒。我一直安慰自己,他們只是感情好隆檀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布摇天。 她就那樣靜靜地躺著,像睡著了一般恐仑。 火紅的嫁衣襯著肌膚如雪泉坐。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天裳仆,我揣著相機(jī)與錄音腕让,去河邊找鬼。 笑死歧斟,一個(gè)胖子當(dāng)著我的面吹牛记某,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播构捡,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼壳猜!你這毒婦竟也來(lái)了勾徽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤统扳,失蹤者是張志新(化名)和其女友劉穎喘帚,沒(méi)想到半個(gè)月后畅姊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吹由,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年若未,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倾鲫。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粗合,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乌昔,到底是詐尸還是另有隱情隙疚,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布磕道,位于F島的核電站供屉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏溺蕉。R本人自食惡果不足惜伶丐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疯特。 院中可真熱鬧哗魂,春花似錦、人聲如沸辙芍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)故硅。三九已至庶灿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吃衅,已是汗流浹背往踢。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留徘层,地道東北人峻呕。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像趣效,于是被迫代替她去往敵國(guó)和親瘦癌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理跷敬,服務(wù)發(fā)現(xiàn)讯私,斷路器,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 10,970評(píng)論 6 13
  • 一、概念(載錄于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434閱讀 8,354評(píng)論 6 152
  • Http協(xié)議詳解 標(biāo)簽(空格分隔): Linux 聲明:本片文章非原創(chuàng)斤寇,內(nèi)容來(lái)源于博客園作者M(jìn)IN飛翔的HTTP協(xié)...
    Sivin閱讀 5,223評(píng)論 3 82
  • 蘋果服務(wù)器數(shù)據(jù) 地理編碼:將具體位置轉(zhuǎn)換為經(jīng)緯度 CLGeocoder 地理編碼對(duì)象 反地理編碼:經(jīng)緯度轉(zhuǎn)換為具體位置
    rebeccaBull閱讀 240評(píng)論 0 0