Request对象及其API应用实操
用戶的瀏覽器往服務器端發送數據的時候,把傳送的數據都放在Request對象中進行封裝,到服務器端的Servlet代碼中就需要使用Request把數據提取出來
文章目錄
- Request對象
- Request對象獲取請求頭
- 😈Request獲取請求參數
- Request對象接收表單請求參數的中文亂碼處理
- Request域對象
- Request域對象實際應用——請求、轉發
- 轉發和重定向
Request對象
在Java端通過Request對象獲取用戶瀏覽器傳來的數據,負責獲取客戶端的請求數據。Request對象是客戶端向服務器發出請求,包括客戶端提供的信息和一些服務器的信息,比如說我們在客戶端通過HTML網頁或者網頁地址超鏈接提供的一些鍵值對信息,通過Request就可以獲取出來。
- 以下是Request對象獲取請求行
| getMethod() | String | 獲取提交的方式 |
| getRequestURI() | String | 獲取請求的參數,請求服務器相對路徑 |
| getRequestURL() | StringBuffer | 獲取請求的參數,請求服務器絕對路徑 |
| getQueryString() | String | 獲取請求行 ?后面的參數 (GET) |
| getContextPath() | String | 獲取WEB應用名稱 |
URI:統一資源標識符
URL:統一資源定位器
修改方案:
成功!!!
Request對象獲取請求頭
請求頭數據格式鍵值對: k:v
用瀏覽器舉例:每當用戶發出一條請求的時候(例如說刷新界面),瀏覽器就會把請求頭中所有的鍵值對信息通過Request對象傳到Servlet中,然后在Servlet中再通過Request對象把所有請求頭獲取出來
| getHeader(String name) | String | 獲得?個key對應?個value的請求頭 |
| getHeaderNames() | enum | 獲得所有請求頭的鍵 |
測試上述兩種API
😈Request獲取請求參數
| getParameter(表單中的name值) | String | 獲得提交的參數(?個name對應?個value) |
| getParameterValues(表單中的name值) | String[] | 獲得提交的參數(?個name對多個value) |
| getParameterMap() | Map<String,String[]> | 獲得提交的參數,將提交的參數名稱和對應值存?到?個Map集合中 |
首先建立一個頁面的框架,新建一個html文件:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <form action="/param" method="get">?戶名:<input type="text" name="username"><br/>密 碼:<input type="password" name="password"><br/>愛 好:<input type="checkbox" name="hobby" value="Basketball">籃球<input type="checkbox" name="hobby" value="football">?球<input type="checkbox" name="hobby" value="pingpang">乒乒球<br/><input type="submit"> </form> </body> </html>
總代碼:
Request對象接收表單請求參數的中文亂碼處理
method為get時就算輸入中文也不會出現亂碼的問題,但是當我們調用post方法的時候中文亂碼的問題就出現了
- 產生亂碼的原因:
post方式提交的數據是在請求體中,request對象接收到數據之后,放入request的緩沖區中。緩沖區默認編碼格式為ISO-8859-1,不支持中文
下面是已經將method改為post的html
可以看到下面中文部分已經變成了亂碼
處理辦法就是在doGet函數獲取參數之前寫入下面這條語句(將request的緩沖區的編碼修改了即可):
之后再進行其他操作
中文亂碼問題已經解決!!!
get方法寫入中文
Tomcat8.5以及之后的版本會自動解決中文亂碼問題,但是以前的版本不確定,如果和post方法同樣出現了中文亂碼問題和上面一樣辦法解決
- 生成亂碼原因:
get方式提交的數據在請求行的url后面,在地址欄上其實就已經進行了一次URL的編碼了 - 解決方案:
將存入到request緩沖區中的值以ISO-8859-1的方式獲取到,以UTF-8的方式進行解碼
Request域對象
瀏覽器發送請求給服務器的Servlet,Servlet處理完Java代碼后通過Response響應對象把結果返回給瀏覽器
Request作為域對象的API
Request對象就是從客戶端瀏覽器向服務器發送的一次請求信息的封裝,服務器端的Response響應對象將這些個對象返回給瀏覽器,實質上Request中所保存的數據有效期也是一次請求范圍(從客戶端瀏覽器向服務器發送?次請求,服務器針對這次請求對瀏覽器作出響應。當服務器作出響應之后,通過Response對象將處理后的數據返回給瀏覽器客戶端響應,當用戶響應了返回數據后,Request和Response對象就銷毀了,保存在其中的數據就無效了),也就是一次請求與響應的閉環區間。
| setAttribute(String name, Object obj) | void | 向Request域中保存數據 |
| getAttribute(String name) | Object | 從Request域中獲取數據 |
| removeAttribute(String name) | void | 從Request域中移除數據 |
在一個包下創建兩個Servlet,測試API使用
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;/*** @author 18147*/ @WebServlet("/my") public class MyServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//存數據到Request域對象request.setAttribute("key","value");//從Request域對象中取出數據Object value = request.getAttribute("key");System.out.println("MyServlet == "+value);} } import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;/*** @author 18147*/ @WebServlet("/my2") public class My2Servlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//從Request域對象中取出數據Object value = request.getAttribute("key");System.out.println("MyServlet == "+value);} }
Request域對象實際應用——請求、轉發
首先從客戶端瀏覽器發送一個請求到服務器中的Servlet1,在服務器內部進行轉發,將請求的數據由Servlet1轉發給Servlet2,最后給客戶端瀏覽器響應回結果。
轉發的作用:之前創建的兩個Servlet文件
請求轉發API了解
| getRequestDispatcher(String path) | RequestDispatcher | 通過ServletRequest對象獲得RequestDispatcher對象 |
| forward(ServletRequest request, ServletResponse response) | void | 根據RequestDispatcher中的方法進行請求轉發 |
在之前的代碼基礎上添加轉發功能
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;/*** @author 18147*/ @WebServlet("/my") public class MyServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//存數據到Request域對象request.setAttribute("key", "value");//從Request域對象中取出數據Object value = request.getAttribute("key");System.out.println("MyServlet == " + value);//請求轉發給Servlet2request.getRequestDispatcher("/my2").forward(request, response);} }
這里要強調的是:請求轉發操作是不能跨項目操作的,其中forward()方法包含的兩個參數實際上就是Myservlet中的,既然是同一個request和response,也沒有響應到瀏覽器中銷毀,所以能自動跳轉到轉發地址“/my2”,并調用其方法。
轉發和重定向
區別總結
- 請求轉發是一次請求一次響應,而重定向是兩次請求兩次響應。
- 請求轉發地址欄不會變化的,重定向地址欄發生變化。
- 請求轉發路徑不帶工程名,重定向需要帶工程名路徑。
- 請求轉發只能在本網站內部,重定向可以定向到任何網站。
如果需要使用request進行值傳遞,需要通過請求轉發完成。
如果頁面需要跳轉到其他網站上必須使用重定向, 不能使用request進行值傳遞。
總結
以上是生活随笔為你收集整理的Request对象及其API应用实操的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吉利汽车也要“捅破天”?一图看懂超级智能
- 下一篇: 张朝阳称《流浪地球2》跟好莱坞还是没法比