控制器方法中參數的接收
(1)以前的參數接收:
String param = req.getParameter(name);
(2)SpringMVC簡化這個操作,只需要給控制器方法添加參數即可
a:本質上還是調用上述方法進行接收,只不過做了封裝
b:參數類型(特殊類型除外,例如:Date)可以自動轉換
注意:
(1)表單中的name屬性值和方法列表值保持一致,如果不一致,不會報錯,但那是接收到的值是null,需要注意的是,int類型的參數不能是null,所以服務器和頁面都會報錯:所以,為避免這種錯誤,在定義實體類的時候實體類中的屬性類型,基本類型最好定義成包裝類型
(2)當接收到的數據屬於日期類型時,如果僅僅使用Date作為接收參數類型時,是不能解決問題的,因為日期是有格式定義的,並且表單中的日期格式必須要和方法參數列表中的日期格式一一對應,不然也會報錯;可以通過注解@DateTimeFormat(pattern = "yyyy-MM-dd") Date birthday,兩次避免錯誤;此外,在SpringMVC中,400類型的錯誤,一般都是由於接收參數類型不匹配所造成的
(3)當參數列表為Boolean類型的數據時,表單中提交的參數值可以是true或者false,能夠正常接收,也可以是1或者0,其中1代表true,0代表false
婚否: <input type="radio" name="married" value="1"> 已婚
<input type="radio" name="married" value="0"> 未婚<br>
(4)當方法參數列表為一個對象時,SpringMV也可以進行參數接收,不過要求對象的屬性名稱必須和表單中的name值保持一致。其中,如果對象中的屬性為另一個對象,在表單中可以通過對象名.屬性名來進行對屬性的賦值
地址: <select name="address.city">
(5)當方法參數列表為list集合,表單中的name屬性值,可以通過下面方式進行命名:
地址1: <select name="addrList[0].city">
(6)不能使用map集合作為方法參數列表
<form action="${pageContext.request.contextPath}/demo1" method="post"> 用戶名: <input type="text" name="username"><br> 年齡: <input type="text" name="age"><br> 生日: <input type="text" name="birthday">yyyy-MM-dd<br> 愛好: <input type="checkbox" name="hob" value="java"> java <input type="checkbox" name="hob" value="C++"> C++ <input type="checkbox" name="hob" value="PHP"> PHP<br> 婚否: <input type="radio" name="married" value="1"> 已婚 <input type="radio" name="married" value="0"> 未婚<br> 地址: <select name="address.city"> <option value="北京">北京</option> <option value="上海">上海</option> <option value="天津">天津</option> </select><br> 地址1: <select name="addrList[0].city"> <option value="北京">北京</option> <option value="上海">上海</option> <option value="天津">天津</option> </select><br> 地址2: <select name="addrList[1].city"> <option value="北京">北京</option> <option value="上海">上海</option> <option value="天津">天津</option> </select><br> <input type="submit" value="提交"> </form>
package com.bjsxt.controller; import com.bjsxt.pojo.User; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import java.util.Arrays; import java.util.Date; @Controller public class DemoController { @RequestMapping("/demo1") public String demo1(User user) { System.out.println(user); return "index.jsp"; } @RequestMapping("/demo2") public String demo2(String username, Integer age, @DateTimeFormat(pattern = "yyyy-MM-dd") Date birthday, String[] hob, Boolean married) { System.out.println("username = " + username); System.out.println("age = " + age); System.out.println("birthday = " + birthday); System.out.println("hob = " + Arrays.toString(hob)); System.out.println("married = " + married); return "index.jsp"; } }
public class User implements Serializable {
//此處省略getter和setter方法,正常測試時需要添加 private String username; private Integer age; @DateTimeFormat(pattern = "yyyy-MM-dd") private Date birthday; private String[] hob; private Boolean married; private Address address; private List<Address> addrList = new ArrayList<>(); }
public class Address implements Serializable { private String city; }
請求參數的進階優化
使用SpringMVC進行參數接收,這種方式存在的問題:
(1)如果前台傳遞的參數和后台接收的參數名稱不一致
(2)如果參數為空(null,“ ”),怎么處理
(3)如何對參數進行限制
解決名稱不一致問題
@RequestParam:可以對請求參數進行加工,常用屬性如下:
(1)value:用於定義參數的名稱,如果同名,可以不寫
(2)required:布爾值,用於表示參數是否必須接收
true:默認值,表示必須傳遞,否則會拋出400錯誤
false:表示可以不進行傳遞,使用null為參數賦值
(3)defaultValue:默認值,當接收到的參數為null或者空字符串時,默認值生效
注:當使用defalutValue時,required無效
@RequestMapping("/demo") public String demo( @RequestParam(value = "page", defaultValue = "1") int page, @RequestParam(required = false, defaultValue = "10") int size) { System.out.println("page = " + page); System.out.println("size = " + size); return "index.jsp"; }
對參數進行限制
在某些情況下,傳遞的參數是有限制的,例如管理系統中,要求管理員登錄時,用戶名和密碼必須傳遞,同時,又要求用戶名必須為admin。
這時,就可以通過@RequestMapping進行限制
@RequestMapping:用於給控制器進行映射,使用位置是在一個方法上
控制器類:對當前控制器中所有的方法添加訪問前綴(窄化:使路徑匹配更加精確)
屬性:
value:默認屬性,用於配置映射的路徑,/login
可以精確匹配:/demo
模糊后綴匹配:/demo.xxx
可以目錄匹配:/demo/
params:用於對請求參數做限制
method:表示當前控制器方法能處理的請求參數,例如get或者post
produces:可以設置響應頭,需要配置@ResponseBody注解來使用
@RequestMapping(value = "/login", params = {"username=admin", "password"}) public String login(String username, String password) { System.out.println("username = " + username); System.out.println("password = " + password); return "index.jsp"; }
Restful風格參數的傳遞
Restful風格的參數傳遞:即參數偽裝到路徑中,參數也作為路徑的一部分
傳統方式傳參: localhost:8080/demo?name=admin&pwd=123
Restful風格: localhost:8080/demo/admin/123
例如:京東商城,書旗網
Restful風格傳參需要配置@pathvariable注解和SpEL一起實現:
{name}/{pwd}類似於占位符
@RequestMapping("/rest/{name}/{pwd}") public String rest( @PathVariable("name") String username, @PathVariable String pwd) { System.out.println("username = " + username); System.out.println("pwd = " + pwd); return "/index.jsp"; }
<a href="${pageContext.request.contextPath}/rest/zhangsan/123">Restful風格傳參</a>