1. 程式人生 > >使用@ModelAttribute和表單標籤庫將表單提交的值繫結到類中

使用@ModelAttribute和表單標籤庫將表單提交的值繫結到類中

使用@ModelAttribute和表單標籤庫將表單提交的值直接繫結到類中

場景:使用spring框架時,在控制類方法中可以使用@ModelAttribute標記自定義類引數,spring會自動將表單提的值繫結到標記的類中同名屬性中。

作用:用於轉化表單資料型別,同時便於將表單值傳遞到類中,在複雜的提交中很有用。

下面例子將講述怎麼使用:
控制類:

@RequestMapping(value="/login")
public String login(@ModelAttribute("login") Login login) {
    return "loginform";
}

注:@ModelAttribute(“login”)中"login"可以不用寫。

Login類:

public class Login {
private String userName;
private int password;

public void setUserName(String userName){
    this.userName=userName;
}
public void setPassword(String password2){
    //轉String型別為int
    this.password=Integer.parseInt(password2);
}

注:login類必須有set方法,spring框架會呼叫這個方法為類屬性賦值;方法名必須是set+屬性名,不區分大小寫;方法中形參型別必須是String(或一些固定類,不在本文所講範圍),因為表單提交的值都是以字串型別提交的,形參名不一定要與屬性名相同。

提交表單的檢視jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    //form標籤中modelAttribute屬性值必須是Login類的類名,不區分大小寫
    <form:form action="login" method="post"  modelAttribute="login" >
  //表單提交項中,path屬性值必須是Login類中對應的屬性名(不是set方法中的形參名),區分大小寫
         使用者名稱:<form:input path="userName"/>
         密碼: <form:password path="password"/>
         <input id="submit" type="submit"  value="登陸">
     </form:form>
</body>
</html>

注:提交的表單必須使用form: 標籤,要使用這個標籤,需要在<html>上新增<%@ taglib prefix=“form” uri=“http://www.springframework.org/tags/form” %>;表單提交型別是post還是get不限。

還應注意的是,第一次執行@ModelAttribute Login login時就會建立一個Login類物件,之後載入檢視jsp會自動將Login類中屬性值載入到檢視jsp的表單中(注:如果不先建立一個Login物件,載入表單時會報錯),比如,在本例項中,載入檢視jsp的控制方法就是第一個類中的唯一個方法,如果Login類寫private String userName = “me”; 第一次載入表單,表單使用者名稱一項就會顯示me 初始值,當提交表單時實際上是更改之前建立的Login物件屬性值,如果再次載入檢視jsp,表單每項預設顯示值會是更改後的Login物件屬性值,利用這個,我們可以設定使用者登入失敗後,返回登入介面,之前輸入的值不會消失(但form:password始終預設為空),我們經常見到的比較成熟的網站是不是都是這樣的?