使用POJO作為參數
springmvc會自動把參數注入到POJO對象的屬性中貌嫡,且包括級聯注入
<body>
<form action="springmvc/testPojo" method="post"><!-- 提交路徑不要以/開關 -->
用戶名:<input type="text" name="name"><br>
密碼:<input type="password" name="password"><br>
年齡:<input type="text" name="age"><br>
省份:<input type="text" name="address.province"><br>
城市:<input type="text" name="address.city"><br>
<button type="submit">登錄</button>
</form>
</body>
@RequestMapping("/testPojo")
public String testPojo(User user){
System.out.println(user);
return SUCCESS;
}
@Data
@AllArgsConstructor
public class User {
private String name;
private String password;
private int age;
private Address address;
}
使用原生servlet作為參數
支持的其他類型有
HttpServletRequest
HttpServletResponse
HttpSession
java.security.Principal
Locale
InputStream
OutputStream
Reader
Writer
<a href="springmvc/testServletApi?username='George'">testServletApi</a>
@RequestMapping("/testServletApi")
public void testServletApi(
HttpServletRequest request
,HttpServletResponse response) throws IOException{
String name = request.getParameter("username");
response.getOutputStream().write(name.getBytes());
}
傳參 @ModelAttribute修改數據
<form action="springmvc/modifyEmp" method="post">
編號:<input type="text" name="id" value="1"><br>
姓名:<input type="text" name="name" value="Bruce"><br>
<!-- 性別:<input type="text" name="sex" ><br>
注意:該性別組件不能寫架馋,因為我們不希望修改Emp的性別屬性
-->
<button type="submit">修改</button>
</form>
@ModelAttribute
public void getEmp(
@RequestParam(value="id",required=false) Integer id
,Map<String,Object>map){
//0.先從表單提交的數據中取出id,存在則繼續(xù)
if (id!=null){
//1.模擬到數據庫中查詢是否具有該id的Emp
//2.假設已經查到了,emp是從數據庫中取回來的數據
Emp emp = new Emp(2,"Smith","man");//數據庫中的原始數據
map.put("emp", emp);
}
}
@RequestMapping("/modifyEmp")
public String testModelAttribute(Emp emp){
System.out.println("修改后:"+emp);
return SUCCESS;
}
修改的后的數據:${requestScope.emp}
//修改的后的數據:Emp(id=1, name=Bruce, sex=man)
SpringMVC 確定目標方法 POJO 類型入參的過程
1. 確定一個 key:
* 目標方法的 POJO 類型的參數有沒有使用 @ModelAttribute 作為修飾, 有則 key 為 POJO 類名首字母小寫的字符串
* 若@ModelAttribute設置了value值, 則 key 為 @ModelAttribute 注解的 value 屬性值.
2. 在 implicitModel(@ModelAttribute修飾方法的model對象) 中查找 key 對應的對象, 若存在, 則作為入參傳入
* 若在 @ModelAttribute 標記的方法中用 Map或Model 保存過與1中key同名的對象碴里,那么將會獲取到該對象并傳入
3. 若 implicitModel 中不存在 key 對應的對象, 則檢查當前的Controller是否使用 @SessionAttributes 注解修飾
* 若使用了該注解, 且 @SessionAttributes 注解的 value 屬性值中包含了該key, 則會從 HttpSession 中來獲取 key 所對應的數據君仆。若包含了該key但沒有對應的數據則將拋出異常.
4. 若 Controller 沒有@SessionAttributes 注解或 @SessionAttributes 注解的 value 值中不包含該key
* 會通過反射來創(chuàng)建 POJO 類型的參數, 傳入為目標方法的參數
*5. SpringMVC 會把 key 和 POJO 類型的對象保存到 implicitModel 中, 進而會保存到 request 中. *