1. 程式人生 > >Servlet詳解(二):request和response物件

Servlet詳解(二):request和response物件

什麼是request和response

request物件是伺服器對瀏覽器請求的封裝,而response是伺服器對伺服器響應的封裝。
這裡寫圖片描述

request用來取出請求資訊,而response則用來新增要返回給瀏覽器的資訊。

使用response物件設定http響應協議中的資訊

用來生成Http響應資訊,傳送給使用者。

響應首行

HTTP/1.1 200 OK

  • setStatus(int sc):設定正常的響應狀態碼 status code
  • setStatus(int sc, String sm):設定正常的響應狀態碼,狀態碼描述 status message,過時,因為正常狀態下,狀態碼資訊不會顯示給使用者,所以沒有必要設定
  • sendError(int sc):設定錯誤的狀態碼
  • sendError(int sc, String sm):設定錯誤的狀態碼,包含錯誤資訊

響應頭

key:value

  • setHeader(String name, String value):設定一個鍵值對,值為string
  • setDateHeader(String name, long date):設定一個鍵值對,值為long,long常用於毫秒的表示
  • setIntHeader(String name, int value):設定一個鍵值對,值為int型別
  • setHeader(String name, String value)
    :新增一個鍵值對,值為string
  • setDateHeader(String name, long date):新增一個鍵值對,值為long,long常用於毫秒的表示
  • setIntHeader(String name, int value):新增一個鍵值對,值為int型別
  • add 和 set 區別在於,前置直接新增(key是可以重複的),後者會修改原來的,沒有才會新增。

幾個常見的響應頭:

  • ContentType:text/html;charset=utf-8
  • Refresh:3;url=http://path 3秒後跳轉網頁

html中meta標籤的作用就是用於向響應頭中新增資訊。

響應空行

一個分隔符

響應正文

需要傳送的資源

  • response.getWriter():獲取字元流
  • 父類方法getOutputSteam():獲取輸出位元組流

實現請求重定向

手動實現:

實現重定向很簡單,只需要兩個步驟:

  1. 在響應頭中新增302狀態碼,告訴瀏覽器需要進行重定向
    response.setStatus(302)

  2. 在響應頭中新增Location,指定重定向的位置
    response.setHeader("Location", "http://www.baidu.com");

當用戶請求servlet時,伺服器返回一個類似上面的響應頭,上面的資訊告訴瀏覽器,應該重新進行一次請求,請求的地址為 Header中的Location地址。
所以,請求重定向實際上是兩次請求。

直接實現:

我們只需要使用:response.setRedirect("http://www.baidu.com")即可實現。

通過訪問Servlet向瀏覽器傳遞一個圖片

// 獲取圖片輸入流
InputStream is = getServletContext().getResourceAsStream("/WEB-INFO/mm.jpg");
// 獲取瀏覽器的輸出流
byte[] buffer = new byte[1024];
// 將圖片篇輸入流寫出到瀏覽器中
int len = -1;
while((len = is.readBuffer(buffer)) != -1){
    os.write(buffer, 0, len);
    os.flush();
}

通過訪問Servlet下載檔案

類似於圖片,但是瀏覽器不能識別檔案的名稱和檔案的型別,需要我們在響應頭中設定檔案的型別:

ServletContext sc = getServletContext();
String mimeType = sc.getMimeType("下載的檔名稱"); // 傳入下載的檔名稱,會根據名稱的拓展名識別mime型別
response.setContentType(type);

即可。

通過request物件獲取http請求協議中的內容

用來生成http請求資訊。

請求首行

請求方式 請求路徑 協議/版本號

  • request.getMethod() 請求方式
  • request.getContextPath()getServletPath()…獲取請求路徑
  • 父類方法 request.getScheme() 獲取請求協議

請求頭

鍵值對

  • request.getHeader(String name)
  • request.getIntHeader(String name)
  • request.getDateHeader(String name)
  • request.getHeaderNames()
  • request.getHeaders(Sring name)一個key對應多個value

請求空行

請求正文(post才有)

但是以下方法,無論是get還是post請求都可以獲得引數值

  • 父類方法 String getParameter(String name)
  • Map<String, String[]> getParameterMap()
  • Enumeration getParameterNames()
  • String[] getParameterValues(String name)

解決響應和請求的亂碼問題

處理get請求編碼問題

解決方案:在conf/server.xml中URIEncoding="UTF-8" 69行,

<Connector URIEncoding="UTF-8" 
    connectionTimeout="20000" 
    port="8888" 
    protocol="HTTP/1.1" 
    redirectPort="8443"/>

設定URIEncoding為UTF-8

處理post請求編碼問題

伺服器響應時的資料,即伺服器向瀏覽器傳遞的資料的編碼格式由伺服器決定:
編碼時使用的編碼表,使用getByte("編碼表")設定,或者使用response.setCharacterEncoding(編碼表)設定。兩者的區別在於 ,前者設定位元組流碼錶,後者設定字元流碼錶。

解碼時使用的編碼表,使response.setHeader("ContentType","text/html;charset=utf-8")指定http響應頭來設定。

這裡寫圖片描述

客戶端傳送請求時的亂碼解決:
GET提交,引數在URL中,設定URL的解碼配置,伺服器預設使用IOS-8855-1拉丁碼錶解碼URL,我們可以通過 tomcat/config/server.xml配置檔案中:

 <Connector 
     connectionTimeout="20000" 
     port="8080" 
     protocol="HTTP/1.1" 
     redirectPort="8443"/>

新增屬性URIEncoding="UTF-8"即可將伺服器預設的解碼url的方式設定為utf-8

或者在doget方法中

將接收的亂碼文字使用新的碼錶轉換:

String name = request.getParamter("name"); // 獲取亂碼文字
byte[] bs = name.getBytes("IOS-8859-1"); // 根據亂碼碼錶,將文字轉換為位元組陣列
    String s = new String(bs, "UTF-8"); // 將位元組陣列按照新的碼錶解碼,生成文字

這裡寫圖片描述

POST提交

與GET提交解碼的區別:
解碼事件不同,GET因為引數在URL中,所以伺服器一旦接受請求就會立刻解碼引數,而POST在Servlet呼叫獲取引數的方法時才會解碼。
所以,解決post請求的亂碼很簡單,只需要在引數呼叫前使用

request.setCharacterEncoding("utf-8");

設定請求解碼錶即可。

request 請求轉發實現和request域

這裡寫圖片描述

這就是請求轉發,瀏覽器傳送請求,servlet處理request和response部分業務,但是無法全部處理,也無法簡單的顯示到頁面中,所以將處理過得request和response傳送給jsp,jsp進行一些業務操作,並響應給瀏覽器,展示。

請求轉發主要用來分工操作。

AServlet doGet():


// ***** 不標準自定義轉發
//todo AServlet進行業務處理,比如從資料庫獲取資料
// 處理結束後:=>
// 傳送給Bservlet
BServlet bServlet = new BServlet();
bServlet.doGet(request, response);

//*****標準轉發
// 使用request域(一個請求內有效,主要用於請求轉發) 儲存資料庫的資訊,傳送給BServlet,即 AServlet和BServlet使用request域共享資料,request域是request物件中的一個Map。
request.setAttribute("name","Feathers");  // 向request域中存入一個鍵值對
request.getRequestDispatcher("/servlet/BServlet").forword(request.response);

BServlet doGet():

// todo 負責輸出顯示
// 從request域中取出值
System.out.println((String)request.getAttribute("name"));

注意:

不能在轉發的Servlet中向瀏覽器輸出任何響應正文的內容,但是可以新增響應頭。
因為Servlet中,即使你添加了響應體,也會被清空。

重定向和轉發的區別

  • 重定向是一次請求,轉發一次請求
  • 重定向可以訪問專案之外的地址,而轉發不能。
  • 重定向不可以使用request域,而轉使用request域,一次請求,一個request物件
  • 重定向位址列可能會發生會發生變化,而轉發一定不會
  • 重定向請求方式有可能發生改變(重定後的請求一定是get請求,只有顯示設定post才是post請求,否則是get請求),而轉發不會
  • 重定向時response的方法(通過修改response頭來完成重定向),而請求轉發是resquest的方法(一次請求,轉發給不同的Servlet)

請求包含

請求轉發,轉發的Servlet不能修改請求體,而請求包含中,同請求轉發類似,但是可以修改請求體。
用途:用來解決重複操作。
將重複的操作提取到這個Servlet中,統一進行處理。

這裡寫圖片描述

往往在多個JSP中使用,一個jsp用於處理相同的操作,其餘的jsp根據是否需要處理,進行依次處理。

實現:
AServlet doGet():

response.setContentType("text/html;charset=utf-8");
// 包含
request.getRequestDispatcher("/servlet/BServlet").include(request,response);
response.getWriter().write("Aservlet 處理");

BServlet doGet():

response.getWriter().write("Bservlet 處理");

結果:

Aservlet 處理Bservlet 處理

相關推薦

Servlet()requestresponse物件

什麼是request和response request物件是伺服器對瀏覽器請求的封裝,而response是伺服器對伺服器響應的封裝。 request用來取出請求資訊,而response則用來新增要返回給瀏覽器的資訊。 使用response物件設定h

Servlet(四)requestresponse物件

Request物件:問題:   瀏覽器發起請求到伺服器,會遵循HTTP協議將請求資料傳送給伺服器。 那麼伺服器接受到請求的資料改怎麼儲存呢?不但要存,而且要保證完成性。 解決:   使用物件進行儲存,伺服器每接受一個請求,就建立一個物件專門的存 儲此次請求的請求資料。 實現:    requ

Servlet入門(五)requestresponse物件

前言       本章學習servlet中的request、response物件 方法 1.概念 相信大家在之前的章節已經看到了,我用到了request物件獲取前臺傳遞過來的資料: String username = request.getPar

【原創】Junit4Junit4 Runner以及test case執行順序原始碼理解

1 package com.citi.risk.services.credit.facility.impl; 2 3 import java.io.Closeable; 4 import java.io.IOException; 5 6 import org.juni

C++ 模板()類模板的概念基本使用方式

與函式模板類似地(C++模板詳解(一):函式模板的概念和特性) ,類也可以被一種或多種型別引數化。例如,容器類就是一個具有這種特性的典型例子,它通常被用於管理某種特定型別的元素。只要使用類模板,我們就可以實現容器類,而不需要確定容器中元素的型別。 一、類模板的實現 在這篇博文中,我們使用Stack作為類模板的

HTTPS協議()TLS/SSL工作原理

-c 基本 公鑰加密 工作方式 通信 使用 sha2 公開 原理 HTTPS協議的主要功能基本都依賴於TLS/SSL協議,本節分析TLS/SSL協議工作原理。 TLS/SSL的功能實現主要依賴於三類基本算法:散列函數 Hash、對稱加密和非對稱加密,其利用非對稱加密實

mysql系列sql語句操作-技術流ken

option art sql con student redundant cascade 枚舉 創建索引 1.簡介 本篇博客將詳細講解mysql的一些常用sql語句操作,例如創建數據庫,刪除數據庫,創建表,修改表,刪除表,以及簡單查詢案例。 2.關於mysql數據中的S

CKfinder for java縮圖及圖片上傳的縮放

我們找到  <thumbs><enabled>true</enabled><url>�SE_URL%_thumbs/</url><directory>�SE_DIR%_thumbs</directory>&l

OpenLayers官方示例Drag-and-Drop Image Vector

目錄 四、總結 一、示例概述     本示例實現了從資料夾中拖拉檔案到瀏覽器從而載入地理資料的功能,地理資料是以圖片的形式展示在瀏覽器。 二、程式碼詳解 2.1、建立DragAndDrop控制元件並新增到地圖 var

docker容器初識docker原理及命令

docker容器詳解二:初始docker原理及命令 docker原理 先來理解一下虛擬機器概念,廣義來說,虛擬機器是一種模擬系統,即在軟體層面上通過模擬硬體的輸入和輸出,讓虛擬機器的作業系統得以執行在

Android Studio 外掛開發工具類

轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/78112856 本文出自【趙彥軍的部落格】 在外掛開發過程中,我們按照開發一個正式的專案來操作,需要整理一些常用工具類。 Http 請求封裝 在外掛的專案中,我們看到依賴庫如下圖所示:

java io流的分類

一、根據流向分為輸入流和輸出流:   注意輸入流和輸出流是相對於程式而言的。   輸出:把程式(記憶體)中的內容輸出到磁碟、光碟等儲存裝置中             輸入:讀取外部資料(磁碟、光碟等儲存裝置的資料)到程式(記憶體)中  

VRTK外掛鐳射移動

反過來說Play Space Falling 選項是在玩家頭盔在一個物件上方時會自動傳送到一個物件的頂部,這一點在模擬爬梯子時很有用,不需要使用指標光束定位。如果這個選項關閉,玩家就能在他們所站在的物件的同樣y高度的空中行走(也就是有一部分遊玩區在物件外部)。 (adsbygoog

Java集合2LinkedListQueue

這位大俠,這是我的公眾號:程式設計師江湖。 分享程式設計師面試與技術的那些事。 乾貨滿滿,關注就送。 今天我們來探索一下LinkedList和Queue,以及Stack的原始碼。 具體程式碼在我的GitHub中可以找到 喜歡的話麻煩star一下哈

Java集合4HashMapHashTable

var strong 大表 Java後端 們的 col keyword 創建 spl Java集合詳解4:HashMap和HashTable 今天我們來探索一下HashMap和HashTable機制與比較器的源碼。 具體代碼在我的GitHub中可以找到 https://gi

live555傳輸Speex音訊Speex 使用SDP及其它事項

1. Speex使用SDP 當使用SDP來描述使用Speex格式的會話時,對映是下面這樣的: o 媒體型別 ("audio") 在"m="行中指定媒體的名字。 o 媒體子型別 ("speex") 在SDP "a=rtpmap"行中指定編碼名字。所需的"rate"引數 也在

QtAndroid(2)startActivity它的小夥伴們

    上一篇,“QtAndroid詳解(1):QAndroidJniObject”,我們做了好多好多準備工作,目的就是為使用 QtAndroid 名字空間裡的 startActivity() 方法呼叫 Android 系統功能奠定基礎。那這次呢,我們就要來研究如何使用 st

StreamVR外掛UI及手柄

## HUD?  ### 什麼是HUD  HUD (head-up display)是非VR遊戲中最常見的UI型別。它的用處是實時顯示狀態和提供按鈕、輸入框等控制元件。比如在遊戲中顯示生命值、彈藥數、分數、小地圖,以及技能按鈕、選單按鈕等,都會用到HUD。  ### 為什麼不能在VR中使用HUD  HUD的

NginxNginx的優勢

微軟 ffi 線程 輕量級 ima 描述 順序 多線程 一個 Nginx是一個開源且高性能、可靠的HTTP中間件、代理服務 常見的HTTP服務: HTTPD--Apache基金會 IIIS--微軟 GWS--Google Nginx優勢:

Java Stream函數語言程式設計圖文()管道資料處理

一、Java Stream管道資料處理操作 在本號之前釋出的文章《Java Stream函數語言程式設計?用過都說好,案例圖文詳解送給你》中,筆者對Java Stream的介紹以及簡單的使用方法給大家做了介紹。在開始本文之前,我們有必要介紹一下這張Java Stream 資料處理過程圖,圖中主要分三個部分