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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Request请求

發(fā)布時間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Request请求 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Request請求:

  • Request請求,就是客戶端希望從服務器端獲取資源,向服務器發(fā)出詢問。在B/S架構(gòu)中,就是客戶瀏覽器向服務器發(fā)出詢問。在我們的JavaEE工程中,客戶瀏覽器發(fā)出詢問,要遵循HTTP協(xié)議所規(guī)定的。
  • 請求對象,就是在JavaEE工程中,用于發(fā)送請求的對象。我們常用的對象就是ServletRequest和HttpServletRequest,它們的區(qū)別就是是否和HTTP協(xié)議有關。是Servlet四大域之一
請求對象方法:
返回值方法名說明
StringgetContextPath()獲取虛擬目錄名稱
StringgetServletPath()獲取Servlet映射路徑
StringgetRemoteAdd()獲取訪問者ip地址
StringgetQueryString()獲取請求的消息數(shù)據(jù)
StringgetRequestURI()獲取統(tǒng)一資源標識符
StringBuffergetRequestURL()獲取統(tǒng)一資源定位符

演示:

@WebServlet("/requestMethod") public class RequestMethod extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 訪問地址http://localhost:8081/demo/requestMethod// getContextPath() 獲取虛擬目錄名稱 /demoSystem.out.println(req.getContextPath());// getServletPath() 獲取Servlet映射路徑 /requestMethodSystem.out.println(req.getServletPath());// getRemoteAdd() 獲取訪問者ip地址 0:0:0:0:0:0:0:1System.out.println(req.getRemoteAddr());// getQueryString() 獲取請求的消息數(shù)據(jù) nullSystem.out.println(req.getQueryString());// getRequestURI() 獲取統(tǒng)一資源標識符 /demo/requestMethodSystem.out.println(req.getRequestURI());// getRequestURL() 獲取統(tǒng)一資源定位符 http://localhost:8081/demo/requestMethodSystem.out.println(req.getRequestURL());// URI的范圍更大(共和國),URL更具體(中華人民共和國)} }
獲取請求頭方法:
返回值方法名說明
StringgetHeader(String name)根據(jù)請求頭名稱獲取一個值
EnumerationgetHeaders(String name)根據(jù)請求頭名稱獲取多個值
EnumerationgetHeaderNames()獲取所有請求頭

演示:

@WebServlet("/requestHeaderDemo") public class RequestHeaderDemo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// getHeader(String name) 根據(jù)請求頭名稱獲取一個值System.out.println(req.getHeader("connection"));System.out.println("------------------------");// getHeaders(String name) 根據(jù)請求頭名稱獲取多個值Enumeration<String> values = req.getHeaders("accept-encoding");while (values.hasMoreElements()) {String value = values.nextElement();System.out.println(value);}System.out.println("------------------------");// getHeaderNames() 獲取所有請求頭Enumeration<String> names = req.getHeaderNames();while (names.hasMoreElements()) {String name = names.nextElement();String value = req.getHeader(name);System.out.println(name + " : " + value);}}
獲取請求參數(shù)信息:
返回值方法名說明
StringgetParameter(String name)根據(jù)名稱獲取數(shù)據(jù)
String[]getPaeameterValues(String name)根據(jù)名稱獲取所有數(shù)據(jù)
EnumerationgetParameterNames()獲取所有名稱
Map<String,String[]>getParameterMap()獲取所有參數(shù)的鍵值對

演示:
注冊頁面:

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>注冊頁面</title> </head> <body><form action="/servletDemo08" method="get" autocomplete="off">姓名:<input type="text" name="username"><br/>密碼:<input type="password" name="password"><br/>愛好:<input type="checkbox" name="hobby" value="game">游戲<input type="checkbox" name="hobby" value="study">學習<br/><button type="submit">提交</button> </form></body> </html>

獲取請求參數(shù):

@WebServlet("/servletDemo08") public class ServletDemo08 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// String getParameter(String name) 根據(jù)名稱獲取數(shù)據(jù)System.out.println(req.getParameter("username"));System.out.println(req.getParameter("password"));System.out.println("——————————————————————");// String[] getParameterValues(String name) 根據(jù)名稱獲取所有數(shù)據(jù)String[] hobbies = req.getParameterValues("hobby");for (String hobby : hobbies) {System.out.println(hobby);}System.out.println("——————————————————————");// Enumeration<String> getParameterNames() 獲取所有名稱Enumeration<String> names = req.getParameterNames();while (names.hasMoreElements()) {System.out.println(names.nextElement());}System.out.println("——————————————————————");// Map<String,String[]> getParameterMap() 獲取所有參數(shù)的鍵值對Map<String, String[]> map = req.getParameterMap();for (String key : map.keySet()) {String[] values = map.get(key);System.out.print(key + ":");for (String value : values) {System.out.print(value + " ");}System.out.println();}} }
獲取參數(shù)手動封裝到對象:

學生類:

public class Student {private String username;private String password;private String[] hobby; }

注冊頁面不變,改一下提交路徑即可

@WebServlet("/servletDemo09") public class ServletDemo09 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1.獲取所有的數(shù)據(jù)String username = req.getParameter("username");String password = req.getParameter("password");String[] hobby = req.getParameterValues("hobby");// 2.封裝學生對象Student student = new Student(username, password, hobby);// 3.打印學生對象System.out.println(student);} }
反射封裝對象:
@WebServlet("/servletDemo10") public class ServletDemo10 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) {// 1. 獲取所有的數(shù)據(jù)Map<String, String[]> map = req.getParameterMap();// 2. 封裝學生對象Student student = new Student();// 3. 遍歷集合for (String name : map.keySet()) {String[] value = map.get(name);try {// 獲取Student對象的屬性描述器,就是獲取get/set,然后把get/set封裝到pd里// 拿到User對象中的屬性描述器。是誰的屬性描述器:是由構(gòu)造函數(shù)的第一個參數(shù)決定的。第二個參數(shù)是指定javabean的字節(jié)碼PropertyDescriptor pd = new PropertyDescriptor(name, student.getClass());//參數(shù)指的就是拿哪個類的哪個屬性的描述器// 設置javabean屬性的值Method writeMethod = pd.getWriteMethod();if (value.length > 1) {writeMethod.invoke(student, (Object) value);} else {writeMethod.invoke(student, value);//第一個參數(shù)是指的給哪個對象,第二個參數(shù)指的是賦什么值}} catch (IntrospectionException | IllegalAccessException | InvocationTargetException e) {e.printStackTrace();}}// 4. 輸出對象System.out.println(student);} }
BeanUtils封裝對象:

使用apache的commons-beanutils實現(xiàn)封裝
如果遇到報500可能是沒有將jar包要導入到項目中

@WebServlet("/servletDemo11") public class ServletDemo11 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) {//1.獲取所有的數(shù)據(jù)Map<String, String[]> map = req.getParameterMap();//2.封裝學生對象Student stu = new Student();try {// 通過該方法將map中的數(shù)據(jù)映射/封裝到javabean的get和set方法中BeanUtils.populate(stu, map);} catch (Exception e) {e.printStackTrace();}//4.輸出對象System.out.println(stu);} }
流對象獲取請求信息:

方法:

返回值方法名說明
BufferedReadergetReader()獲取字符輸入流
ServletInputStreamgetInputStream()獲取字節(jié)輸入流

演示:

@WebServlet("/servletDemo04") public class ServletDemo04 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 字符流獲取必須使用post,字符流不是new出來的不需要關閉 /* BufferedReader reader = req.getReader();String len;while ((len = reader.readLine()) != null) {System.out.println(len);}*/// 如果用post出現(xiàn)亂碼就在代碼前加個編碼格式就可以了// setCharacterEncoding:設置編碼格式req.setCharacterEncoding("UTF-8");// 字節(jié)流ServletInputStream inputStream = req.getInputStream();byte[] bytes = new byte[1024];int len;while ((len = inputStream.read(bytes)) != -1) {System.out.println(new String(bytes, 0, len));}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }
中文亂碼問題:

GET方式請求:

  • GET方式請求的正文是在地址欄中,在Tomcat8.5版本及以后,Tomcat服務器已經(jīng)幫我們解決了,所以不會有亂碼問題了。

POST方式請求

  • 在POST方式請求中,我們的亂碼問題可以用如下代碼解決:
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/** GET方式:正文在地址欄* username=%D5%C5%C8%FD* %D5%C5%C8%FD是已經(jīng)被編過一次碼了** 解決辦法:* 使用正確的碼表對已經(jīng)編過碼的數(shù)據(jù)進行解碼。*/// setCharacterEncoding:設置編碼格式req.setCharacterEncoding("UTF-8");String username = request.getParameter("username");System.out.println(username); }

請求域:

  • 請求域(request域):可以在一次請求范圍內(nèi)進行共享數(shù)據(jù)
  • 一般用于請求轉(zhuǎn)發(fā) 的多個資源中共享數(shù)據(jù)
請求對象操作共享數(shù)據(jù)方法:
返回值方法名說明
voidsetAttribute(String name,Object value)向請求域?qū)ο笾写鎯?shù)據(jù)
objectsetAttribute(String name)通過名稱獲取請求域?qū)ο笾械臄?shù)據(jù)
voidremoveAttribute(String name)通過名稱移除請求域?qū)ο笾械臄?shù)據(jù)
請求轉(zhuǎn)發(fā):

客戶端的一次請求到達以后,發(fā)現(xiàn)借助其他的Servlet來實現(xiàn)功能

特點:

  • 瀏覽器地址不變
  • 域?qū)ο笾械臄?shù)據(jù)不丟失
  • 負責轉(zhuǎn)發(fā)的Servlet轉(zhuǎn)發(fā)前后的顯示正文會丟失
  • 由轉(zhuǎn)發(fā)的目的地來響應客戶端
請求轉(zhuǎn)發(fā)的方法:
返回值方法名說明
RequestDispatchergetRequestDispatcher(String name)獲取請求調(diào)度對象
voidforward(ServletRequest req,ServletResponse resp)實現(xiàn)轉(zhuǎn)發(fā)
@WebServlet("/servletDemo12") public class ServletDemo12 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 設置共享數(shù)據(jù)req.setAttribute("itzhuzhu", "正在學習");// 獲取請求調(diào)度對象RequestDispatcher rd = req.getRequestDispatcher("servletDemo13");// 實現(xiàn)轉(zhuǎn)發(fā)功能rd.forward(req, resp);} } @WebServlet("/servletDemo13") public class ServletDemo13 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 獲取共享數(shù)據(jù)System.out.println(req.getAttribute("itzhuzhu"));System.out.println("ServletDemo13執(zhí)行");} }
請求包含:

可以合并其它Servlet中的功能一起響應給客戶端

特點:

  • 瀏覽器地址不變
  • 域?qū)ο髷?shù)據(jù)不丟失
  • 被包含的Servlet響應頭會丟失
請求包含方法:
返回值方法名說明
RequestDispatchergetRequestDispatcher(String name)獲取請求調(diào)度對象
voidinclude(ServletRequest req,ServletResponse resp)實現(xiàn)包含
@WebServlet("/servletDemo14") public class ServletDemo14 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 設置共享數(shù)據(jù)req.setAttribute("itzhuzhu", "正在學習");// 獲取請求調(diào)度對象RequestDispatcher rd = req.getRequestDispatcher("/servletDemo13");// 實現(xiàn)包含功能rd.include(req, resp);} }
重定向和請求轉(zhuǎn)發(fā) :
  • 重定向:通過各種方法將各種網(wǎng)絡請求重新定個方向轉(zhuǎn)到其它位置,地址會變
  • 請求轉(zhuǎn)發(fā):客戶端發(fā)起請求后,在服務器之間的跳轉(zhuǎn),然后服務器返回頁面給客戶端進行顯示,地址不變

總結(jié)

以上是生活随笔為你收集整理的Request请求的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。