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)
-
- 請求轉發:request.getRequestDispatcher("/BServlet").forward(request,response); ---> 最常用
- 請求包含:request.getRequestDispatcher("/BServlet").include(request,response); --->不常用
那麼這兩者到底有什麼差別呢?假設一個請求先指向了Aservlet,而Aservlet向浏覽器輸出了一行字"AServlet",然後請求轉發到了BServlet,BServlet也向浏覽器輸出了一行字"BServlet",那麼使用者在浏覽器隻能看到"BServlet",而如果是Aservlet請求包含到BServlet,則使用者在浏覽器中能看到"AservletBservlet",也就是說請求轉發不會包含目前servlet的響應體,而請求包含會包含目前頁面的響應體,特别注意的是,無論是請求轉發還是請求包含都在一個請求範圍内,使用的是同一個request和response,而重定向使用了兩個request和兩個response,這是很大的差別.這裡總結一下請求轉發和重定向的差別:
- 請求轉發是一個請求一次響應,而重定向是兩次請求兩次響應
- 請求轉發位址欄不變化,而重定向會顯示後一個請求的位址
- 請求轉發隻能轉發到本項目其他Servlet,而重定向不隻能重定向到本項目的其他Servlet,還能定向到其他項目
- 請求轉發是伺服器端行為,隻需給出轉發的Servlet路徑,而重定向需要給出requestURI,即包含項目名!
- 請求轉發和重定向效率是轉發高!因為是一個請求!
- 需要位址欄發生變化,那麼必須使用重定向!
- 需要在下一個Servlet中擷取request域中的資料,必須要使用轉發!
- request域(用來傳值)
-
- void setAttribute(String name, Object value):
- Object getAttribute(String name)