天天看點

重溫Servlet學習筆記--request對象

  request和response是一對搭檔,一個負責請求一個負責響應,都是Servlet.service()方法的參數,response的知識點前面梳理過了,這裡隻說一下request,在用戶端發出每個請求時,伺服器都會建立一個request對象,把請求的資料封裝到request中,然後在調用Servlet.service()中傳遞進去.我們在建立一個servlet時通常會使用doGet或者doPost方法,并沒有看到service()方法,就是因為父類的service方法已經讀取到了request中的請求方式,然後根據請求方式再決定調用你重寫的doGet方法還是doPost方法.

  • 一些常見方法:
    • getRemoteAddr()  :擷取遠端IP位址
    • getMethod():     擷取請求方式,GET 或者 POST
    • getHeader(String name) :   擷取請求頭,例如getHeader("User-Agent"),就可以通過User_agent識别使用者作業系統和浏覽器資訊

這裡給出一個url:http://localhost:8080/myPro/AServlet?name="zhangSan"

    • String getScheme():擷取協定,http
    • String getServerName():擷取伺服器名,localhost
    • String getServerPort():擷取伺服器端口,8080
    • String getContextPath():擷取項目名,myPro
    • String getServletPath():擷取Servlet路徑,/AServlet
    •  String getQueryString():擷取參數部分,即問号後面的部分。name="zhangSan"
    • String getRequestURI():擷取請求URI,等于項目名+Servlet路徑。/myPro/AServlet
    • String getRequestURL():擷取請求URL,等于不包含參數的整個請求路徑。http://localhost:8080/myPro/AServlet
  • 擷取請求參數
    • String  getParameter(String name):擷取指定名稱的請求參數值,适用于單值請求
    •  String[] getParameterValues(String name):擷取指定名稱的請求參數值,适用于多值請求
    •  Enumeration<String> getParameterNames():擷取所有請求參數名稱,可以通過周遊名稱擷取到每個名稱對應的參數值
  • 請求轉發和請求包含(在一個請求鍊中包含多個servlet)
    1. 請求轉發:request.getRequestDispatcher("/BServlet").forward(request,response); ---> 最常用
    2. 請求包含:request.getRequestDispatcher("/BServlet").include(request,response);  --->不常用

    那麼這兩者到底有什麼差別呢?假設一個請求先指向了Aservlet,而Aservlet向浏覽器輸出了一行字"AServlet",然後請求轉發到了BServlet,BServlet也向浏覽器輸出了一行字"BServlet",那麼使用者在浏覽器隻能看到"BServlet",而如果是Aservlet請求包含到BServlet,則使用者在浏覽器中能看到"AservletBservlet",也就是說請求轉發不會包含目前servlet的響應體,而請求包含會包含目前頁面的響應體,特别注意的是,無論是請求轉發還是請求包含都在一個請求範圍内,使用的是同一個request和response,而重定向使用了兩個request和兩個response,這是很大的差別.這裡總結一下請求轉發和重定向的差別:

  1.  請求轉發是一個請求一次響應,而重定向是兩次請求兩次響應
  2.  請求轉發位址欄不變化,而重定向會顯示後一個請求的位址
  3.  請求轉發隻能轉發到本項目其他Servlet,而重定向不隻能重定向到本項目的其他Servlet,還能定向到其他項目
  4.  請求轉發是伺服器端行為,隻需給出轉發的Servlet路徑,而重定向需要給出requestURI,即包含項目名!
  5.  請求轉發和重定向效率是轉發高!因為是一個請求!
  6.  需要位址欄發生變化,那麼必須使用重定向!
  7.  需要在下一個Servlet中擷取request域中的資料,必須要使用轉發!
  • request域(用來傳值)
    1.    void setAttribute(String name, Object value):
    2.    Object getAttribute(String name)

繼續閱讀