SpringMVC參數傳遞 HttpServletRequest,HttpServletResponse和HttpSession


SpringMVC參數傳遞 HttpServletRequest,HttpServletResponse和HttpSession

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接: https://blog.csdn.net/DoUUnderstand/article/details/78646586

除了model,@RequestParam @PathVariable可以傳遞參數外,還有HttpServletRequest和HttpServletResponse也可以進行參數傳遞。

Web服務器收到一個http請求,會針對每個請求創建一個HttpServletRequest和HttpServletResponse對象,向客戶端發送數據找HttpServletResponse,從客戶端取數據找HttpServletRequest.


HttpServletRequest

HttpServletRequest對象代表客戶端的請求,當客戶端通過HTTP協議訪問服務器時,HTTP請求頭中的所有信息都封裝在這個對象中,開發人員通過這個對象的方法,可以獲得客戶這些信息。

主要功能:參數解析,Cookie讀取,http請求字段,文件上傳

1.請求行

getMethod(); 獲得請求方式
getQueryString() ; 返回請求行中的參數部分。
getRequestURI(); 返回請求行中的資源名部分。
getRequestURL();返回客戶端發出請求時的完整URL。

例子

@Controller public class IndexController { @RequestMapping(path={"/request"},method={RequestMethod.GET}) @ResponseBody public String index(HttpServletRequest request) { StringBuilder sb = new StringBuilder(); sb.append(request.getMethod()+"<br>"); sb.append(request.getQueryString()+"<br>"); sb.append(request.getRequestURI()+"<br>"); sb.append(request.getRequestURL()+"<br>"); return sb.toString(); } }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

頁面輸出:
這里寫圖片描述

我們還能獲取請求消息頭的信息

2.請求消息頭

String getHeader(String name) 根據請求消息頭名稱稱得到請求消息頭信息值
Enumeration getHeaderNames() 得到所有請求消息頭名稱
Enumeration getHeaders(String name) 根據頭名稱得到相同名稱請求頭信息值
String getCookies() 獲取請求消息頭中的cookie值

例子

@Controller public class IndexController { @RequestMapping("/request") @ResponseBody public String index(HttpServletRequest request) { StringBuilder sb = new StringBuilder(); Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { //讀取請求消息頭 String name = headerNames.nextElement(); sb.append(name + ":" + request.getHeader(name) + "<br>"); } return sb.toString(); } }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

請求消息頭的信息就被全部打印出來了
這里寫圖片描述
通過這種方法來獲取請求的一系列信息,比如通過user-agent來判斷用戶是通過手機還是電腦來登陸頁面,從而可以實現相對應的跳轉。

獲取cookie值

@Controller public class IndexController { @RequestMapping("/request") @ResponseBody public String index(HttpServletRequest request) { StringBuilder sb = new StringBuilder(); if(request.getCookies()!=null){ for(Cookie cookie :request.getCookies()){ sb.append("Cookie: " + cookie.getName()+" value: "+ cookie.getValue()); } } return sb.toString(); } }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

這里寫圖片描述

3. 獲得客戶機請求參數(客戶端提交的數據)

getParameter(name)方法 獲取請求中的參數,該參數是由name指定
getParameterValues(String name)方法 獲取指定名稱參數的所有值數組。它適用於一個參數名對應多個值的情況。如頁面表單中的復選框,多選列表提交的值。
getParameterNames() 方法返回一個包含請求消息中的所有參數名的Enumeration對象。通過遍歷這個Enumeration對象,就可以獲取請求消息中所有的參數名。
getCharacterEncoding() 返回請求的字符編碼方式
getAttributeNames()返回當前請求的所有屬性的名字集合賦值:setAttribute()
getAttribute(String name) 返回name指定的屬性值
getsession()返回和客戶端相關的session,如果沒有給客戶端分配session,則返回null
getParameterMap():返回一個保存了請求消息中的所有參數名和值的Map對象。Map對象的key是字符串類型的參數名,value是這個參數所對應的Object類型的值數組
RequestDispatcher.forward() 方法的請求轉發過程結束后,瀏覽器地址欄保持初始的URL地址不變。方法在服務器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求並得到了響應結果,並不知道在服務器程序內部發生了轉發行為。
setCharacterEncoding(“utf-8”);
getReader() 獲取請求體的數據流
getInputStream() 獲取請求的輸入流中的數據


HttpSerlvetResponse

HttpServletResponse對象代表服務器的響應。這個對象中封裝了向客戶端發送數據、發送響應頭,發送響應狀態碼的方法。

主要功能:頁面內容返回,cookie下發,Http字段設置,headers
1.響應行

setStatus(int sc) 設置響應狀態碼

響應狀態碼:200=服務器端OK
404=NOT FOUND 請求資源不存在
500=服務器端代碼錯誤

@Controller public class IndexController { @RequestMapping("/request") @ResponseBody public String index(HttpServletResponse response) { response.setStatus(404); //我們將狀態設置成404 return "hello"; } }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

可以看到頁面依然正常顯示
這里寫圖片描述
但是我們通過Restlet Client看其HTTP狀態,為404
這里寫圖片描述

2.響應頭

setHeader(String name,String value) //設置響應頭信息
sendRedirect(String location) //請求重定向
addHeader(String name,String value) //增加相應頭信息
addCookie(Cookie cookie) //添加Cookie

response.setHeader("content-type", "text/html;charset=UTF-8"); //告知瀏覽器使用什么碼表 //告知客戶端不緩存 response.setHeader("pragma", "no-cache"); response.setHeader("cache-control", "no-cache"); response.setDateHeader("expires", 0); //添加Cookie response.addCookie(new Cookie(String name ,String value))
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.響應正文(主體)

getWrite(); // 字符輸出流
getOutputStream(); //字節輸出流
setCharacterEncoding(String charset) //告知服務器使用什么編碼
setContentType(String type)

比如我們可以通過getOutputStream(); 返回圖片,驗證碼等信息。

4.請求重定向

response.sendRedirect()//請求重定向,讓客戶端去訪問另一個服務器

例子

@Controller public class IndexController { @RequestMapping("/request") @ResponseBody public String index(HttpServletResponse response)throws IOException { response.sendRedirect("/home"); return "hello"; //也可以直接 return "redirect:/home" } @RequestMapping("/home") @ResponseBody public String home(HttpServletResponse response) { return "hahah"; } }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

頁面輸出:hahah


PS:
一個web資源收到客戶端請求后,通知服務器去調用另外一個web資源進行處理,稱之為轉發 /307
一個web資源收到客戶端請求后,通知瀏覽器去訪問另外一個web資源進行處理,稱之為重定向/302

文章最后發布於: 2017-11-27 16:44:51


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM