天天看點

SpringMVC架構----ModelAttribute注解

作用:

該注解是 SpringMVC4.3 版本以後新加入的。它可以用于修飾方法和參數。

出現在方法上,表示目前方法會在控制器的方法執行之前,先執行。它可以修飾沒有傳回值的方法,也可以修飾有具體傳回值的方法。

出現在參數上,擷取指定的資料給參數指派。

屬性: value:用于擷取資料的 key。key 可以是 POJO 的屬性名稱,也可以是 map 結構的 key。

應用場景: 當表單送出資料不是完整的實體類資料時,保證沒有送出資料的字段使用資料庫對象原來的資料。

(比如user類中有三個屬性,而我們表單隻送出了兩個屬性,另外一個屬性沒有送出值,預設為空,但是我們想用原來資料庫的值,現在我們就可以選擇modelattribute這個注解)

例如: 我們在編輯一個使用者時,使用者有一個建立資訊字段,該字段的值是不允許被修改的。在送出表單數 據是肯定沒有此字段的内容,一旦更新會把該字段内容置為 null,此時就可以使用此注解解決問題。

index.jsp

<br/>
<form action="anno/testModelAttribute" method="post">
    使用者姓名:<input type="text" name="username"/><br/>
    使用者年齡:<input type="text" name="age"/><br/>
    <input type="submit" value="送出"/>
</form>
           

controller類

/*ModelAttribute注解*/
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
    System.out.println("testModelAttribute執行了...");
    System.out.println(user);
    return "success";
}
@ModelAttribute
public void showUser(){
    System.out.println("showUser執行了");
}
           
SpringMVC架構----ModelAttribute注解

即送出表單資訊不完整。那我們想用資料庫(模拟)中原來的資料。

<br/>
<form action="anno/testModelAttribute" method="post">
    使用者姓名:<input type="text" name="uname"/><br/>
    使用者年齡:<input type="text" name="age"/><br/>
    <input type="submit" value="送出"/>
</form>
           

我們事先建立了一個javabean的User類,

public class User implements Serializable {
    private String uname;
    private Integer age;
    private Date date;

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return "User{" +
                "uname='" + uname + '\'' +
                ", age=" + age +
                ", date=" + date +
                '}';
    }
}
           
/*ModelAttribute注解*/
@RequestMapping("/testModelAttribute")
//注意,這裡面的參數會拿到showUser方法中的user對象裡面的未被指派的date
public String testModelAttribute(User user){
    System.out.println("testModelAttribute執行了...");
    System.out.println(user);
    return "success";
}
/*
* 該方法會先執行
*
* */
@ModelAttribute
public User showUser(String uname){
    System.out.println("showUser執行了");
    //通過使用者查詢資料庫(模拟)
    User user =new User();
    user.setUname(uname);
    user.setAge(20);
    user.setDate(new Date());
    return user;
}
           
SpringMVC架構----ModelAttribute注解

如果沒有傳回值呢,我們需要使用map集合,把user對象存入到map集合中,然後用modelattribute修飾這個參數,從集合中取出這個user對象。

*ModelAttribute注解*/
@RequestMapping("/testModelAttribute")
//注意,這裡面的參數會拿到showUser方法中的user對象裡面的未被指派的date
public String testModelAttribute(@ModelAttribute("abc") User user){
    System.out.println("testModelAttribute執行了...");
    System.out.println(user);
    return "success";
}

@ModelAttribute
public void showUser(String uname, Map<String,User> map){
    System.out.println("showUser執行了");
    //通過使用者查詢資料庫(模拟)
    User user =new User();
    user.setUname(uname);
    user.setAge(20);
    user.setDate(new Date());
    map.put("abc",user);
}
           
SpringMVC架構----ModelAttribute注解