1. 程式人生 > 其它 >Servlet 入門 2

Servlet 入門 2

HTTP協議2

響應訊息

  1. 請求訊息:
    a) 請求行
    b) 請求頭
    c) 請求空行
    d) 請求體
  2. 響應訊息
  • a) 響應行
    1.組成:協議/版本 響應狀態碼 狀態碼描述
    2.響應狀態碼:伺服器告訴客戶端瀏覽器本次請求和響應的狀態
    • 狀態碼都是3位數字;
    • 分類:5類
      1xx: 伺服器接收客戶端訊息,但沒有接收完成;等待一段時間後傳送
      2xx:成功。
      3xx:重定向。代表:302重定向;304資源沒有更改,訪問本地快取
      4xx:客戶端錯誤。
      代表:404:請求路徑沒有對應資源
      405:請求方式沒有對應的doXxx方法
      5xx:伺服器錯誤 500:伺服器內部出現異常
  • b) 響應頭
    1. 格式: 頭名稱:值
    2. 常見的響應頭:
      1. content-Type:伺服器告訴客戶端本次響應體資料格式以及編碼格式
      2. content-disposition:以什麼格式開啟響應體資料
        值:in-line:預設值,在當前頁面內開啟
        Attachment;filename=xxx:以附件形式開啟響應體,檔案下載
  • c) 響應空行
  • d) 響應體
    傳送的資料,網頁等

Response物件

  1. 功能:設定響應訊息
    1. 設定響應行
      格式:HTTP/1.1 200 OK
      設定狀態碼:setStatus(int sc)
    2. 設定響應頭 setHeader(string name,string value)
    3. 設定響應體
  2. 使用步驟:
  • 獲取輸出流:

字元輸出流:PrintWriter getWriter()
位元組輸出流 ServletOutputStream getOutputStream()

  • 使用輸出流,將資料輸出到客戶端瀏覽器

案例:

  1. 重定向
    資源跳轉的方式
  2. 程式碼實現:
    a) 告訴客戶端重定向,給狀態碼302
    Response.serStatus (302)
    b) 告訴客戶端跳轉資源的路徑,通過響應頭location來設定跳轉資源的路徑
    Response.serHeader(“location”,”/day15/responseDemo2”)
    c) 簡單的重定向方法
    Response.sendRedirect(”/day15/responseDemo2”)
  3. 重定向redirect的特點:
    1. 位址列發生變化
    2. 轉發可以訪問其他站點的資源
    3. 是兩次請求,不能使用request共享資料
  4. 轉發forward的特點:
    1. 轉發位址列路徑不變
    2. 只能訪問當前伺服器下的資源
    3. 轉發是一次請求,使用request物件共享資料
  5. 路徑寫法:
    1. 路徑分類:
      • 相對路徑:通過相對路徑不可以確定唯一資源
        • 不以/開頭,以.開頭 如./h.html 指當前目錄下 (./可以省略)
        • 規則:找到當前資源和目標資源的相對位置關係
        • ./ 當前目錄
        • ../ 後退一級目錄
      • 絕對路徑:
        通過絕對路徑可以確定唯一資源

        /day15/demo2

    2. 書寫規則:判斷定義的路徑給誰用?判斷請求將來從哪兒發出?
      • 給客戶端用:需要加虛擬目錄(專案的訪問路徑)
      • 給伺服器用:不需加虛擬目錄
    3. 動態獲取虛擬目錄:
      String contextPath = request.getContextPath();
      取代day15,考慮程式碼更改節省工作量
  6. 伺服器輸出字元資料到瀏覽器
    一般文字輸出用,步驟:
    1. 獲取流物件之前,設定流的預設編碼:(有了第2步,可以省略)
      Response.setCharacterEncoding(“GBK”)
    2. (亂碼問題)告訴瀏覽器,伺服器傳送訊息體資料的編碼,建議瀏覽器使用該編碼解碼
      Response.setHeader(“content-type”,”text/html;charset=utf-8”)編碼要與上面設定一致
      簡單設定編碼方法:
      Response.setContentType(“text/html;charset=utf-8”)
    3. 獲取字元輸出流
      PrintWriter pw = response.getWriter()
    4. 輸出資料
      Pw.write(“string”)
  7. 伺服器輸出位元組資料到瀏覽器
    一般寫圖片等格式用,步驟:
    1.(亂碼問題)告訴瀏覽器,伺服器傳送訊息體資料的編碼,建議瀏覽器使用該編碼解碼
    Response.setHeader(“content-type”,”text/html;charset=utf-8”)
    2.獲取位元組輸出流
    ServletOutputStream sos = response.getOutputStream()
    3.輸出資料
    Sos.write(“hello”.getBytes(“utf-8”))
  8. 驗證碼
    1. 本質:圖片
    2. 目的:防止惡意表單註冊
    3. 步驟:
      1. 建立物件,在記憶體中圖片(驗證碼圖片物件)
        Int width,height = 100,50
        BufferedIamge image = new BufferedImage(width,height,BufferedImage.Type_INT_RGB)
      2. 美化圖片

        2.1 填充背景色
        Graphics g=image.getGraphis() //畫筆物件
        g.setColor(Color,PINK);設定畫筆顏色
        g.fillRect(0,0,width,height)
        2.2 畫邊框
        g. setColor(Color,BLUE);設定畫筆顏色
        g.drawRect(0,0,width-1,height-1)
        2.3 寫驗證碼
        String str=”ABCDEFG。。abc。789”
        Random ran = new Random();
        For(int i=1;i<=4;i++){
        Int index = ran.nextint(str.length())//設定最大值str.length()
        Char c = str.charAt(index);//隨機字元
        g.drawstring(c + “”,width/5*i,height/2)
        }
        2.4 畫干擾線
        g. setColor(Color,GREEN);設定畫筆顏色
        //隨機生成座標點
        For(int i=0;i<=10;i++){
        Int x1 = ran.nextint(width)
        Int x2 = ran.nextint(width)
        Int y1 = ran.nextint(width)
        Int y2 = ran.nextint(width)
        g.drawline(x1,y1,x2,y2)
        }

      3. 將圖片輸出到頁面展示
        ImageIO.write(image,”jpg”,response.getOutputStream());

ServletContext物件

  1. 概念:代表整個web應用,可以和程式的容器(伺服器)通訊
  2. 獲取:
    a) 通過request物件獲取request.getServletContext()
    b) 通過HTTPServlet來獲取this.getServletContext()
  3. 功能:
    a) 獲取MIME型別
    - MIME型別:在網際網路通訊過程中定義的一種檔案資料型別
    - 格式:大型別/小型別 text/html image/jpeg
    - 獲取:string getMimeType(string file)
    b) 域物件:共享資料
    1. setAttribute(string name,object value)
    2. getAttribute(string name)
    3. removeAttribute(string name)
    ServletContext物件範圍:所有使用者所有請求的資料
    c) 獲取檔案的真實(伺服器)路徑
    1.方法 getRealPath(“string path”)
  4. 檔案下載案例:
    1. 案例目標:
      1. 頁面顯示超連結
      2. 點選超連結後彈出下載提示框
      3. 完成圖片檔案下載
    2. 分析:
      1. 超連結指向的資源如果能夠被瀏覽器解析,則在瀏覽器中展示;如果不能解析,則彈出下載提示框;不滿足上述要求;
      2. 任何資源都彈出下載提示框
      3. 使用響應頭設定資源的開啟方式
        Content-disposition:attachment;filename=xxx
    3. 步驟
      1. 定義頁面,編輯超連結href屬性,指向servlet,傳遞資源引數filename
      2. 定義servlet
        1.獲取檔名稱
        2.使用位元組輸入流載入檔案進記憶體
      3. 指定response響應頭Content-disposition:attachment;filename=xxx
      4. 將資料寫出到response輸出流