request詳解

這兩個對象可以模擬成袋子和手機:

服務器每次收到請求,都會給這個請求開闢一個新的線程

 服務器會把客戶端的請求數據封裝到request對象中,request就是請求數據的載體!(袋子)
 服務器還會創建response對象,這個對象與客戶端連接在一起,它可以用來向客戶端發送響應。(手機) 

********************************************************************************************************************

request:

request是jsp中 重要的對象,每個request對象封裝這一次用戶請求,並且所有的請求參數都被封裝在request對象中,因此request對象是獲取請求參數的重要途徑。

除此之外,request可代表本次請求範圍,所以還可用於操作request範圍內的屬性。

request的方法大家可以查看HttpServletRequest的API下面對其中的幾個常用的方法做詳細的解釋

* 獲取常用信息
    > 獲取客戶端IP,案例:封IP。request.getRemoteAddr()
    > 請求方式,request.getMethod(),可能是POST也可能是GET(HttpServlet中的service方法有判斷是get和post請求的語句,好讓子類通過該方法根據需要執行get或者post)
* 獲取HTTP請求頭(****標記的是最重要的方法)
    > *****String getHeader(String name),適用於單值頭
    > int getIntHeader(String name),適用於單值int類型的請求頭
    > long getDateHeader(String name),適用於單值毫秒類型的請求頭
    > Enumeration<String> getHeaders(String name),適用於多值請求頭

<span style="font-size:18px;">/**
 * 演示:獲取客戶端IP地址,獲取請求方式,獲取user-Agent,得到客戶端的信息(操作系統瀏覽器)。
 * @author PC
 */
public class ASerlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
        String addr = request.getRemoteAddr();//獲取客戶端的IP地址
        System.out.println("IP:"+addr);
        System.out.println("請求方式:"+request.getMethod());//獲取請求方式
        String userAgent = request.getHeader("User-Agent");
        System.out.println(userAgent);
	}
}</span>

* 獲取請求URL

假設一路徑爲:
http://localhost:8080/day10_2/AServlet?username=xxx&password=yyy

則執行下列方法分別取值爲
    > String getScheme():獲取協議,http
    > String getServerName():獲取服務器名,localhost
    > String getServerPort():獲取服務器端口,8080
    > *****String getContextPath():獲取項目名,/day10_2
    > String getServletPath():獲取Servlet路徑,/AServlet
    > String getQueryString():獲取參數部分,即問號後面的部分。username=xxx&password=yyy
    > String getRequestURI():獲取請求URI,等於項目名+Servlet路徑。/day10_2/AServlet
    > String getRequestURL():獲取請求URL,等於不包含參數的整個請求路徑。http://localhost:8080/day10_2/AServlet



* 獲取請求參數:請求參數是由客戶端發送給服務器的!有可能是在請求體(POST),也可能是在URL之後(GET)
請求參數:有一個參數一個值的,還有一個參數多個值!
    > *****String getParameter(String name):獲取指定名稱的請求參數值,適用於單值請求參數
    > String[] getParameterValues(String name):獲取指定名稱的請求參數值,適用於多值請求參數
    > Enumeration<String> getParameterNames():獲取所有請求參數名稱
    > *****Map<String,String[]> getParameterMap():獲取所有請求參數,其中key爲參數名,value爲參數值。

* 請求轉發和請求包含
    RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");  使用request獲取RequestDispatcher對象,方法的參數是被轉發或包含的Servlet的Servlet路徑
    請求轉發:*****rd.forward(request,response);
    請求包含:rd.include(request,response);


    有時一個請求需要多個Servlet協作才能完成,所以需要在一個Servlet跳到另一個Servlet!
    > 一個請求跨多個Servlet,需要使用轉發和包含。
    > 請求轉發:由下一個Servlet完成響應體!當前Servlet可以設置響應頭!(留頭不留體)
    > 請求包含:由兩個Servlet共同未完成響應體!(都留)
    > 無論是請求轉發還是請求包含,都在一個請求範圍內!使用同一個request和response!

* 請求轉發和重定向的區別
    > 請求轉發是一個請求一次響應,而重定向是兩次請求兩次響應
    > 請求轉發地址欄不變化,而重定向會顯示後一個請求的地址
    > 請求轉發只能轉發到本項目其他Servlet,而重定向不只能重定向到本項目的其他Servlet,還能定向到其他項目
    > 請求轉發是服務器端行爲,只需給出轉發的Servlet路徑,而重定向需要給出requestURI,即包含項目名!
    > 請求轉發和重定向效率是轉發高!因爲是一個請求!
      <> 需要地址欄發生變化,那麼必須使用重定向!
      <> 需要在下一個Servlet中獲取request域中的數據,必須要使用轉發

* request域
    Servlet中三大域對象:request、session、application,都有如下三個方法:
    > void setAttribute(String name, Object value)
    > Object getAttribute(String name)
> void removeAttribute(String name);
    > 同一請求範圍內使用request.setAttribute()、request.getAttribute()來傳值!前一個Servlet調用setAttribute()保存值,後一個Servlet調用getAttribute()獲取值。

getAttribute和getParameter的區別:

getParameter是獲取參數的方法,參數是客戶端給服務器傳的值,而getAttribute是servlet轉發之間爲了共享某些數據的方法,這是兩者間的本質差別。

注意:請求參數的相關方法全是get方法,不允許設置,相當於用戶傳遞什麼你就得用什麼,而request域中有設置屬性的方法,因爲轉發的雙方都是服務器,所以可以一個服務器使用setAttribute設置屬性,一個服務器getAttribute使用屬性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章