日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Request对象及其API应用实操

發布時間:2023/12/15 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Request对象及其API应用实操 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用戶的瀏覽器往服務器端發送數據的時候,把傳送的數據都放在Request對象中進行封裝,到服務器端的Servlet代碼中就需要使用Request把數據提取出來

文章目錄

    • Request對象
    • Request對象獲取請求頭
    • 😈Request獲取請求參數
    • Request對象接收表單請求參數的中文亂碼處理
    • Request域對象
    • Request域對象實際應用——請求、轉發
    • 轉發和重定向

Request對象

在Java端通過Request對象獲取用戶瀏覽器傳來的數據,負責獲取客戶端的請求數據。Request對象是客戶端向服務器發出請求,包括客戶端提供的信息和一些服務器的信息,比如說我們在客戶端通過HTML網頁或者網頁地址超鏈接提供的一些鍵值對信息,通過Request就可以獲取出來。

  • 以下是Request對象獲取請求行
methodreturndescribe
getMethod()String獲取提交的方式
getRequestURI()String獲取請求的參數,請求服務器相對路徑
getRequestURL()StringBuffer獲取請求的參數,請求服務器絕對路徑
getQueryString()String獲取請求行 ?后面的參數 (GET)
getContextPath()String獲取WEB應用名稱

URI:統一資源標識符
URL:統一資源定位器

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;/*** Request對象獲取請求行** @author 18147*/ @WebServlet("/line") public class LineServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//因為運行時調用的是doGet方法,所以所有演示代碼都在doGet函數中編寫//實際操作時,兩種方法也是相互調用關系,只需寫一個即可}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//獲取提交的方式//getMethod()獲取客戶端的請求?式String method = request.getMethod();System.out.println("method = " + method);//獲取請求的參數,獲取請求的服務器路徑String uri = request.getRequestURI();//uri是相對路徑StringBuffer url = request.getRequestURL();//url是從http協議開始的絕對路徑System.out.println("uri = " + uri);System.out.println("url = " + url);//獲取請求行?之后的參數String queryString = request.getQueryString();System.out.println("queryString = " + queryString);//獲取當前web項目訪問地址String contextPath = request.getContextPath();System.out.println("contextPath = " + contextPath);} }

修改方案:




成功!!!

Request對象獲取請求頭

請求頭數據格式鍵值對: k:v

用瀏覽器舉例:每當用戶發出一條請求的時候(例如說刷新界面),瀏覽器就會把請求頭中所有的鍵值對信息通過Request對象傳到Servlet中,然后在Servlet中再通過Request對象把所有請求頭獲取出來

methodreturndescription
getHeader(String name)String獲得?個key對應?個value的請求頭
getHeaderNames()enum獲得所有請求頭的鍵

測試上述兩種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* 舉例:用Host鍵值對來測試通過key值來返回指定value值* 舉例:*/ @WebServlet("/head") public class HeadServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//因為運行時調用的是doGet方法,所以所有演示代碼都在doGet函數中編寫//實際操作時,兩種方法也是相互調用關系,只需寫一個即可}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//獲取指定key的請求頭信息String header = request.getHeader("Host");System.out.println("Host : " + header);//獲取所有請求頭的key} }

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; import java.util.Enumeration;/*** @author 18147*/ @WebServlet("/head") public class HeadServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//因為運行時調用的是doGet方法,所以所有演示代碼都在doGet函數中編寫//實際操作時,兩種方法也是相互調用關系,只需寫一個即可}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//獲取指定key的請求頭信息String header = request.getHeader("Host");System.out.println("Host : " + header);//獲取所有請求頭的key(枚舉類型)/* * Enumeration getHeaderNames() 獲取所有的請求頭的鍵 * 返回值Enumeration接? (向量枚舉) * 集合:1.0-1.1 Enumeration 集合1.2 迭代器 * Iterator迭代器接?: hasNext() next() * Enumeration接?: hasMoreElement() nextElement() */Enumeration<String> headerNames = request.getHeaderNames();while(headerNames.hasMoreElements()){//如果請求頭中還有keyString key = headerNames.nextElement();//獲取鍵String values = request.getHeader(key);//通過當前的鍵來確定對應的值,和第一個API的效果一樣System.out.println(key +" = "+values);//輸出測試}} }

😈Request獲取請求參數

methodreturndescription
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>
  • getParameter()


  • getParameterValues()

  • getParameterMap()

  • 總代碼:

    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; import java.util.Arrays; import java.util.Map;@WebServlet("/param") public class ParamsServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);//兩個用同一套方式}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//獲取瀏覽器提交的參數(一個name對應一個值的情況)String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username = "+username);System.out.println("password = "+password);//獲取瀏覽器提交的參數(一個name對應多個值的情況)String[] hobbies = request.getParameterValues("hobby");//提供給的html界面只有hobby一項是對應多個值的System.out.println("hobby = "+ Arrays.toString(hobbies));//獲取瀏覽器提交的參數(將提交的參數名稱和參數值存入到一個Map集合當中)Map<String, String[]> map = request.getParameterMap();for (Map.Entry entry : map.entrySet()){Object key = entry.getKey();String[] value =(String[]) entry.getValue();System.out.println(key+"-----------"+Arrays.toString(value));}} }

    Request對象接收表單請求參數的中文亂碼處理

    method為get時就算輸入中文也不會出現亂碼的問題,但是當我們調用post方法的時候中文亂碼的問題就出現了

    • 產生亂碼的原因:
      post方式提交的數據是在請求體中,request對象接收到數據之后,放入request的緩沖區中。緩沖區默認編碼格式為ISO-8859-1,不支持中文

    下面是已經將method改為post的html

    可以看到下面中文部分已經變成了亂碼

    處理辦法就是在doGet函數獲取參數之前寫入下面這條語句(將request的緩沖區的編碼修改了即可):

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //將request的緩沖區的編碼修改 request.setCharacterEncoding("utf-8"); //獲取請求參數 String user = request.getParameter("user"); System.out.println("user = " + user); }

    之后再進行其他操作


    中文亂碼問題已經解決!!!

    get方法寫入中文
    Tomcat8.5以及之后的版本會自動解決中文亂碼問題,但是以前的版本不確定,如果和post方法同樣出現了中文亂碼問題和上面一樣辦法解決

    • 生成亂碼原因:
      get方式提交的數據在請求行的url后面,在地址欄上其實就已經進行了一次URL的編碼了
    • 解決方案:
      將存入到request緩沖區中的值以ISO-8859-1的方式獲取到,以UTF-8的方式進行解碼
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* get?式提交的數據在 請求?中 Tomcat8.5之后, Tomcat?動處理了get請求的中?亂碼問題, 但在之前的Tomcat版本 中,get請求的中?亂碼需要??處理 ?版本Tomcat中?亂碼的解決:將存?到request緩沖區中的值以ISO-8859-1的?式獲取 到,以UTF-8的?式進?解碼。 */ String user = request.getParameter("username"); //將存?到request緩沖區中的值以ISO-8859-1的?式獲取到 //把給到的ISO-8859-1的數據拆開,按utf-8的格式拼裝起來 byte[] bytes = user.getBytes("iso-8859-1"); //以UTF-8的?式進?解碼 String value = new String(bytes, "utf-8"); System.out.println("user = " + user); }

    Request域對象

    瀏覽器發送請求給服務器的Servlet,Servlet處理完Java代碼后通過Response響應對象把結果返回給瀏覽器

    Request作為域對象的API
    Request對象就是從客戶端瀏覽器向服務器發送的一次請求信息的封裝,服務器端的Response響應對象將這些個對象返回給瀏覽器,實質上Request中所保存的數據有效期也是一次請求范圍(從客戶端瀏覽器向服務器發送?次請求,服務器針對這次請求對瀏覽器作出響應。當服務器作出響應之后,通過Response對象將處理后的數據返回給瀏覽器客戶端響應,當用戶響應了返回數據后,Request和Response對象就銷毀了,保存在其中的數據就無效了),也就是一次請求與響應的閉環區間。

    methodreturndescription
    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了解

    methodreturndescription
    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应用实操的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。