Servlet學(xué)習(xí)筆記(二)

HTTP協(xié)議

  • 基于TCP連接的傳輸協(xié)議
  • 默認端口是80
  • 基于請求—響應(yīng)模式的協(xié)議

HTTP協(xié)議的請求頭


* GET http://localhost:8080/HelloWeb/Hello.html HTTP/1.1
    * 告訴服務(wù)器請求的是那一個資源
    * HTTP/1.1,使用的HTTP協(xié)議的版本
* Accept: text/html, application/xhtml+xml, image/jxr, */*
    * 支持的數(shù)據(jù)格式/類型,
    * */*: 代表我什么類型都支持
* Accept-Language: zh-CN
    * 支持的語言格式
* User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
    * 瀏覽器的類型和操作系統(tǒng)的信息
* Accept-Encoding: gzip, deflate
    * 支持的編碼方式,gzip數(shù)據(jù)壓縮模式,deflate默認
* Host: localhost:8080
    * 請求的主機名
* Connection: Keep-Alive(長連接)

HTTP協(xié)議的響應(yīng)頭

* 響應(yīng)碼:
    * 重要的響應(yīng)碼
    * 200 : 請求成功
    * 302 : 重定向
    * 304 : 請求的頁面沒有發(fā)生改變
    * 404 : 請求的資源不存在
    * 500 : 服務(wù)器內(nèi)部錯誤
* Location: 主要和302響應(yīng)碼結(jié)合,實現(xiàn)重定向的功能
* Server:服務(wù)器信息
* Content-Length:返回的數(shù)據(jù)的長度
* Content-Type:返回的數(shù)據(jù)的類型
* Last-Modified:標記當(dāng)前頁面最后修改時間.檢查頁面是否更新過,如果更新過,就請求新數(shù)據(jù);如果沒有更新過,使用緩存數(shù)據(jù).
* Refresh:1;url=xxx:第一個參數(shù)代表時間,多少秒后刷新當(dāng)前頁面,單位是秒;第二個參數(shù)代表要跳轉(zhuǎn)到的頁面
* Content-Disposition:attachment;filename=aaa.zip 
* Expires:-1 禁止客戶端緩存數(shù)據(jù)
* Cache-Control:no-cache: 禁止客戶端緩存數(shù)據(jù)
* Date:服務(wù)器返回數(shù)據(jù)的時間(GMT)

HttpServletResponse

  • setStatus(int sc) : 設(shè)置響應(yīng)碼
  • setHeader(String name, String value) : 設(shè)置響應(yīng)頭
  • getOutputStream() : 獲得字節(jié)流用于輸出響應(yīng)體內(nèi)容
  • getWriter() : 獲得字符流用于輸出響應(yīng)體內(nèi)容

重定向:

法一:通過設(shè)置狀態(tài)碼和頭信息來實現(xiàn)重定向

//通過設(shè)置狀態(tài)碼和頭信息來實現(xiàn)重定向
response.setStatus(302);
            response.setHeader("Location", request.getContextPath()+"/success.jsp");

法二:通過設(shè)定sendRedirect來重定向

response.sendRedirect(request.getContextPath()+"/success.jsp");

方法三:定時重定向

response.getWriter().write("一秒后跳轉(zhuǎn)");
            response.setHeader("Refresh", "1;URL=" + request.getContextPath() + "/success.jsp");

注意:定時跳轉(zhuǎn)還可以通過在jsp中設(shè)置meta標簽

<meta content="3;url=http://www.baidu.com" http-equiv="refresh">

設(shè)置禁止緩存

通過設(shè)置響應(yīng)頭:

  • 設(shè)置信息頭 : "Cache-Control", "no-cache"
  • 設(shè)置信息頭 : "Pragma", "no-cache"
  • 設(shè)置信息頭 : "Expires", "Thu, 01 Dec 1994 16:00:00 GMT"
  • setDateHeader("Expires", -1) 注:因為setHeader("Expires",日期)比較難寫,所以啊,用setDateHeader代替

注意:由于市面上的瀏覽器比較多,支持的屬性不一致,所以通常情況下會把三個信息頭同時設(shè)置

文件下載

方法一:通過對應(yīng)文件的超鏈接(如果該文件文件格式瀏覽器可以解析,將不會下載)

方法二:通過Servlet程序

package org.luoluo.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * Created by luozhiyun on 17/1/16.
 */
@WebServlet(name = "CServlet",urlPatterns = "/servlet/CServlet")
public class CServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //獲取文件名
        String fileName = request.getParameter("fileName");
        //獲取文件類型
        String mimeType = getServletContext().getMimeType(fileName);
        //設(shè)置文件類型
        response.setContentType(mimeType);
        //獲取文件的絕對磁盤路徑
        String path = getServletContext().getRealPath("/files/"+fileName);
        //設(shè)置響應(yīng)頭,并以附件的方式存儲
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
        //寫入IO流
        FileInputStream fis = new FileInputStream(path);
        //servlet的IO流不用關(guān),瀏覽器會自動處理
        ServletOutputStream os = response.getOutputStream();

        byte[] bytes = new byte[1024];
        int read = -1;
        while ((read = fis.read(bytes)) != -1) {
            os.write(bytes,0,read);
        }
        fis.close();
    }
}

HttpServletRequest

  • request.getMethod() : 獲取請求方式
  • request.getRequestURI() : 獲取請求資源路徑
  • request.getQueryString() : 獲取查詢字符串
  • request.getHeader() : 獲取請求頭信息
  • request.getParameter() : 獲取查詢參數(shù)

Request獲得請求行相關(guān)數(shù)據(jù)

  • 以下結(jié)果以請求 http://localhost:8080/HelloServlet/LineInfoServlet?name=zhangsan&age=12 為基準
  • getRequestURL() : 獲取用戶在瀏覽器地址欄中輸入的完整地址,但不包含請求參數(shù),即"?"以后的數(shù)據(jù)
  • getRequestURI() : 獲取資源的絕對路徑
    • 結(jié)果 : /HelloServlet/LineInfoServlet
  • getContextPath() : 獲取當(dāng)前Web應(yīng)用的路徑
    • 結(jié)果 : /HelloServlet
  • getServletPath() : 獲取當(dāng)前資源的路徑
    • 結(jié)果 : /LineInfoServlet
  • getQueryString() : 獲取查詢字符串
    • 結(jié)果 : name=zhangsan&age=12
  • getMethod() : 獲取請求方式
    • 結(jié)果 : GET
  • getRemoteAddr() : 獲取客戶端IP
  • getRemoteHost() : 獲取客戶端主機
  • getRemotePort() : 獲取客戶端端口號
    • 結(jié)果 : 49881

在設(shè)定默認的servlet的時候,獲取靜態(tài)資源:

String requestURI = request.getRequestURI();
        String path = requestURI.substring(request.getContextPath().length()+1);
        String realPath = getServletContext().getRealPath(path);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末解藻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嘶炭,更是在濱河造成了極大的恐慌贯莺,老刑警劉巖揍堕,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窝剖,死亡現(xiàn)場離奇詭異沃饶,居然都是意外死亡肤频,警方通過查閱死者的電腦和手機叹括,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宵荒,“玉大人,你說我怎么就攤上這事净嘀”龋” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵挖藏,是天一觀的道長暑刃。 經(jīng)常有香客問我,道長膜眠,這世上最難降的妖魔是什么岩臣? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任溜嗜,我火速辦了婚禮,結(jié)果婚禮上架谎,老公的妹妹穿的比我還像新娘炸宵。我一直安慰自己,他們只是感情好谷扣,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布土全。 她就那樣靜靜地躺著,像睡著了一般会涎。 火紅的嫁衣襯著肌膚如雪裹匙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天末秃,我揣著相機與錄音概页,去河邊找鬼。 笑死练慕,一個胖子當(dāng)著我的面吹牛惰匙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贺待,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼徽曲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了麸塞?” 一聲冷哼從身側(cè)響起秃臣,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哪工,沒想到半個月后奥此,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡雁比,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年稚虎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偎捎。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蠢终,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出茴她,到底是詐尸還是另有隱情寻拂,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布丈牢,位于F島的核電站祭钉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏己沛。R本人自食惡果不足惜慌核,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一距境、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧垮卓,春花似錦垫桂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钾怔,卻和暖如春碱呼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宗侦。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工愚臀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人矾利。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓姑裂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親男旗。 傳聞我的和親對象是個殘疾皇子舶斧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

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