SpringMVC基礎[email protected]註解&P
阿新 • • 發佈:2019-01-10
在總結@ModelAttribute註解功能配合PUT請求方式使用之前,先來總結一下POJO類作為入參接收form表單POST提交方式提交資料。
POJO類接收引數
總的來說POJO類還是與普通的Java Bean類還是特別的相似的,私有的屬性,需要配置的空的構造方法,以及生成getter and setter,而且SpringMVC的form提交方式的確是比struts2簡單。
- User類(getter and setter toString省略)
package com.example.springmvc.entity;
/**
* Created by Administrator on 2016-01-25.
*/
public class User {
private String id;
private String username;
private String password;
private String email;
private int age;
private Address address;
public User() {
}
public User(String username, String password, String email, int age) {
this.username = username;
this .password = password;
this.email = email;
this.age = age;
}
public User(String id, String username, String password, String email, int age) {
this.id = id;
this.username = username;
this.password = password;
this.email = email;
this.age = age;
}
}
<form action="springmvc/testPojo" method="post">
username:<input type="text" name="username"/><br>
password:<input type="password" name="password"/><br>
email:<input type="text" name="email"/><br>
age:<input type="text" name="age"/><br>
city:<input type="text" name="address.city"/><br>
province:<input type="text" name="address.province"><br>
<input type="submit" value="submit"/><br>
</form>
form中每個input標籤的name對應了POJO類的每個屬性,在這裡我要強調一下 input隱藏域name屬性值為id的知識點,眾所周知,當涉及到資料庫連線時,POJO類必須加上id這個屬性,但是不論是編寫form表單還是form表單回顯資料,我們都不會將id資料顯示出來,但是,id資料對資料庫中資料的增刪改查是十分重要的,所以我們將id設定為隱藏域,form提交表單時將id值一起提交過去。
//pojo類接受引數,springmvc會按請求引數名和pojo引數名自動匹配,並支援級聯屬性
@RequestMapping("/testPojo")
public String testPojo(User user) {
System.out.println("testPojo" + user);
return SUCCESS;
}
POJO引數自動匹配,並支援級聯屬性。
@ModelAttribute註解
我們以User類物件為例子來學習ModelAttributes註解,ModelAttribute執行方法:
- 首先執行被@ModelAttributes註解標註的方法,將從”資料庫中取出的物件放入到map物件中,也就是放入到request域中,鍵值為“user”
@ModelAttribute
public void getUser(@RequestParam(value = "id",required = false) Integer id,
Map<String,Object> map){
System.out.println("test modelAttributes");
if (id!=null){
//模擬從資料庫取出一條訊息
User user=new User("1","Tom","123456","[email protected]",12);
System.out.println("從資料庫中得到一條資料"+user);
//map.put("user",user);
map.put("abc",user);//這裡map物件user對應testModelAttributes方法引數的引數類小寫
}
}
在這裡模擬了從資料庫取出一條資料,被modelAttribute註解標註的方法在任何處理方法執行前都將被呼叫,所以這個地方我們將RequestParam值得required屬性設定為fasle;
這裡得到是id對應的資料庫原始資料,將值放入到map中,SpringMVC將會來處理。
這裡還有一點就是map put資料時key的命名規則
- 預設是POJO類名首字母小寫,例如User類,則map的key為”user”
- 可以用@ModelAttribute來修飾入參,例如@ModelAttribute(“abc”) User user,當然就要將key設定為”abc”
- 而且這個命名還跟@SessionAttribute註解相關,若Handler 也就是處理方法的類被@SessionAttribute註解修飾,而且他的屬性值其中有”user”(拿User類來做例子),如果@SessionAttribute註解沒有存入”user”鍵值的value,執行時會丟擲異常
@RequestMapping(value = "/testModelAttributes",method = RequestMethod.PUT)
public String testModelAttributes(@ModelAttribute("abc") User user){
System.out.println("修改"+user);
return SUCCESS;
}
ModelAttribute功能強大,比如說你要修改資料庫裡面的資訊,但是我們不修改其中某些資訊;比如說上面的POJO類物件user,我們form表單提交修改資訊,但是不修改其中的password,我們就可以使用這種方法,但是如果我們不寫ModelAttribute標註的方法,直接form表單提交的話,哪隻是簡單的POJO類接收表單資訊。