使用@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始終預設為空),我們經常見到的比較成熟的網站是不是都是這樣的?