1、請求處理參數 1.1 請求參數 @RequestParam 1.1.1 不使用 @RequestParam 註解 請求參數處理,不使用參數註解: 1.如果請求參數名和請求處理的形參名一致,springMvc 框架會自動將你的請求參數名對應的參數值,綁定到請求方法的形參中,方法內就可以直接使用,不 ...
1、請求處理參數
1.1 請求參數 @RequestParam
1.1.1 不使用 @RequestParam 註解
請求參數處理,不使用參數註解:
1.如果請求參數名和請求處理的形參名一致,springMvc 框架會自動將你的請求參數名對應的參數值,綁定到請求方法的形參中,方法內就可以直接使用,不用手動獲取;
2.如果你的請求沒有攜帶參數,不會報錯,只不過,請求處理方法的形參值都是null或其他值,如果請求處理方法形參是一個實體參數,原理和單個類型參數一致(只要請求參數名和實體名一致也可以自動綁定);
測試不使用 @RequestParam 註解
@RequestMapping("/testSpringMvcNoRequestParam")
public String testSpringMvcNoRequestParam( String userId,String userName){
System.out.println(String.format("------ 請求參數:uid :%s ,uname:%s------",userId,userName));
return "success";
}
測試 請求不帶參數
測試 請求帶參數
1.1.3 使用 @RequestParam 註解
@RequestParam 只能寫在請求方法的形參上;
required = false 設置參數不是必傳;
defaultValue 預設值;
- 1.如果請求處理方法,形參前,只增加了此註解,沒有指定任何屬性:
- 作用:當前形參必傳,且參數名與形參名必須一致,如果不一致,參數綁定失敗,請求直接報400錯誤,提示你的參數沒有提供;
- 2.如果請求處理方法,形參前,只增加了此註解,並添加了value屬性值:
- 作用:請求的參數名必須和value屬性指定的名稱一致,此value屬性可以省略(只寫 請求參數別名時,如果有其他的屬性,value屬性必須指定);
- 3.如果要取消每個參數的必傳校驗,可以給此註解增加屬性 required=false(預設是true,必傳),參數可以不傳,不需要參數值的綁定;
- 4.如果某個參數必傳,但是為了防止請求沒有攜帶此參數,可以通過指定屬性defaultValue增加預設值,如果調用當前請求方法處理,沒有提供參數,自動使用預設值,綁定到方法的對應形參中;
測試
@RequestMapping("/testSpringMvcRequestParam")
public String testSpringMvcRequestParam(@RequestParam("uid") String userId,
@RequestParam(value = "uname",required = false,defaultValue = "KH96-mvc") String userName,
@RequestParam String userPwd){
System.out.println(String.format("------ 請求參數:uid :%s ,uname:%s,uPwd:%s------",userId,userName,userPwd));
return "success";
}
測試結果
1.2 請求頭參數 @RequestHeader
請求頭參數@RequestHeader:
- 處理請求頭攜帶參數;
- 作用:從請求頭中獲取參數,根據別名或者參數形參名,將請求頭對應參數值,綁定到請求處理方法的形參中,直接使用,用法跟@RequestParam類似,也可以指定是否必傳,預設值;
測試
@RequestMapping("/testSpringMvcNoRequestHeader")
public String testSpringMvcNoRequestHeader(@RequestHeader(value = "token",required = false,defaultValue = "KH96_mvc") String token){
System.out.println(String.format("------ 請求頭參數:token :%s ------",token));
return "success";
}
測試結果
1.3 Cookie 參數 @CookieValue
@CookieValue:
從cookie中獲取參數,根據別名或者參數形參名,將請求頭對應參數值,綁定到請求處理方法的形參中,直接使用,用法跟@RequestParam,@RequestHeader類似,也可以指定是否必傳,預設值;
測試
@RequestMapping("/testSpringMvcCookieValue")
public String testSpringMvcCookieValue(@CookieValue("JSESSIONID") String sessionId){
System.out.println(String.format("------ 請求cookie參數:JSESSIONID :%s ------",sessionId));
return "success";
}
測試結果:
1.4 實體參數
請求參數處理 實體參數:
自動將請求參數自動將實體的屬性名與形參綁定,原理和單個參數類型一致;
測試
@RequestMapping("/testSpringMvcBeanParam")
public String testSpringMvcBeanParam(UserVO userVO){
System.out.println(String.format("------ 請求實體參數:userVO :%s ------",userVO));
return "success";
}
測試結果
1.5 原生servlet的API介面作為請求參數
用法和javaWeb截斷學習的用法完全一致;
@RequestMapping("testSpringMvcServletAPI")
public void testSpringMvcServletAIP(HttpServletRequest request, HttpServletResponse response,HttpSession session) throws IOException, ServletException {
//獲取請求方式
System.out.println(String.format("------ 請求方式:%s ------",request.getMethod()));
//獲取請求參數
System.out.println(String.format("------ 請求參數:%s ------",request.getParameter("userTel")));
//手動轉發
// request.getRequestDispatcher("/WEB-INF/views/success.jsp").forward(request,response);
//獲取session對象
//手動添加參數
HttpSession sessionHad = request.getSession();
//sessionHad.setAttribute("userTel",request.getParameter("userTel"));
//方式2;直接將HttpSession對象聲明在請求處理方法的形參中,可以自動獲取 session
//重定向到
// response.sendRedirect("http://www.baidu.com");
}
2、響應數據處理
2.1 ModelAndView
ModelAndView 的數據模型放在request的作用域中,視圖模型,放在request.getRequestDispatcher(首碼+視圖名字+尾碼);
結論:SpringMVC框架的前端核心控制器,會自動將返回的ModelAndView對象中的數據模型,添加到request作用域中使用內部轉發方式,轉發到目標視圖;
測試
@RequestMapping("/testSpringMvcModelAndView")
public ModelAndView testSpringMvcModelAndView(String userEmail){
//創建一個 ModelAndView 對象
ModelAndView mav = new ModelAndView();
//添加模型數據
mav.addObject("uemail",userEmail);
//可以添加多個模型數據,內部使用ModelMap集合存放的
mav.addObject("uage",18);
//設置目標視圖
mav.setViewName("ok");
//返回 ModelAndView 對象
return mav;
}
測試結果
2.2 Map
要求:使用map返回模型數據,必須將map聲明在請求處理方法的形參中,定義在方法的內部是無效的;
總結:
- 1.springMVC底層在調用目標請求處理方法前,會自動創建一個Model介面的隱含對象作為模型數據的存儲對象,如果目標請求處理方法定義了一個map介面,自動將隱含對象使用引用傳遞方式傳遞到目標請求處理方法中,方法體內就可以直接添加模型數據;
- 2.SpringMvc底層,在調用完你的請求處理方法後,不管返回什麼類型,都會被轉換為一個ModelAndView對象;
測試
@RequestMapping("/testSpringMvcMap")
public String testSpringMvcMap(String userEmail, Map<String,Object> map){
//輸出map的目標類型
System.out.println(map.getClass().getName());
//org.springframework.validation.support.BindingAwareModelMap
//添加模型數據
map.put("uemail",userEmail);
//返回目標視圖名稱
return "ok";
}
測試結果
2.3 Model
Model,可以添加模型數據;
必須將 Model 聲明在請求處理方法的形參中,定義在方法的內部是無效的,用法跟Map 一致;
測試
@RequestMapping("/testSpringMvcModel")
public String testSpringMvcModel(String userEmail, Model model){
//添加模型數據
model.addAttribute("uemail",userEmail);
//返回目標視圖名稱
return "ok";
}
測試結果
2.4 forward: 轉發 和 redirect: 重定向
2.4.1forward 轉發
只需要在返回的視圖名稱前,增加一個首碼:forward 即可,直接轉發到目標資源;
當前請求處理方法中的模型對象可以帶走;
@RequestMapping("/testSpringMvcForward")
public String testSpringMvcForward(Map<String,Object> map){
//轉發頁面跳轉
//return "forward:/forward.jsp";
//轉發到其他請求中
//return "forward:/[email protected]";
//自定義轉發,攜帶模型數據
map.put("uaddr","nj_wd_kh96");
return "forward:/[email protected]";
}
2.4.2 redirect 重定向
只需要在返回的視圖名稱前,增加一個首碼:redirect 即可,不做視圖解析器,直接重定向
註意,重定向,當前請求處理方法中的模型對象不能帶走
@RequestMapping("/testSpringMvcRedirect")
public String testSpringMvcRedirect(){
//重定向頁面跳轉
//return "redirect:/redirect.jsp";
//重定向 可以重定向到 其他請求中
return "redirect:/[email protected]";
}
2.5 @ResponseBody
返回JSON數據;
- 註意:返回不需要手動轉換為json字元串,直接返回對象;
- @ResponseBody 將返回請求處理方法返回的源對象數據,直接轉換為json格式字元串,返回,不走視圖解析;
- 註意:必須增加Jackson依賴的jar包,否者報錯,且必須要增加註解掃描<mvc:annotation-driven></mvc:annotation-driven> 才可以;
- 位置:可以寫在請求處理方法上或者類上,寫在類上,就是對當前類中所有請求處理方法生效,寫在方法上,只有對當前方法生效;
2.5.1 jar包
<!-- JSON begin -->
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.4</version>
</dependency>
<!--jackson-->
<!-- JSON end -->
2.5.2 配置
<beans xmlns=
xmlns:mvc="http://www.springframework.org/schema/mvc"
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
<!-- 開啟MVC 的註解掃描 -->
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
2.5.3 測試
@RequestMapping("/testSpringMvcJson")
@ResponseBody
public UserVO testSpringMvcJson(){
//模擬獲取去用戶詳情對象
UserVO userVO = new UserVO();
userVO.setUserId("KH96_01");
userVO.setUserName("GKC");
userVO.setUserPwd("123");
return userVO;
}
測試結果