Spring提供它自訂的標籤庫,可以與相關的組件結合,提供頁面與表單物件、錯誤訊息的數據綁定功能,為節省篇幅,在這邊以 SimpleFormController 來進行修改擴充,加入Spring的<bind>標籤功能,首先修改一下form.jsp:
- form.jsp
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib prefix="spring"
uri="http://www.springframework.org/tags"%>
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8">
<title>Login Form</title>
</head>
<body>
<h1>登入表單</h1>
<spring:bind path="command.*">
<font color="red">
<b>\${status.errorMessage}</b>
</font><br>
</spring:bind>
請輸入使用者名稱與密碼:<p>
<form name="loginform"
action="/SpringBindDemo/login.do"
method="post">
<spring:bind path="command.username">
名稱 <input type="text"
name="\${status.expression}"
value="\${status.value}"/><br>
</spring:bind>
<spring:bind path="command.password">
密碼 <input type="password"
name="\${status.expression}"
value="\${status.value}"/><br>
</spring:bind>
<input type="submit" value="確定"/>
</form>
注意:輸入錯誤會再回到這個頁面中。
</body>
</html>
<spring:bind>的"path"屬性設定了要綁定的表單物件名稱,這個名稱是設定在loginController中的 "commandName"屬性,預設名稱是"command",當設定為"command.*"時,表示綁定表單物件上所有相關的數據, "status"的"errorMessage"會顯示在Controller中設定的錯誤訊息,這待會在Controller的實作中會再看到說明。
在表單中,對於"username"欄位,綁定了"command.username"屬性,"status"的"expression"會顯示綁定的屬 性名稱,而"value"則顯示表單物件中所儲存的值,這邊設計的程式在登入失敗後會回到form.jsp,這樣可以在同一個頁面上顯示錯誤訊息與之前輸 入錯誤的值。
為了配合form.jsp上的綁定標籤之訊息顯示,可以對SimpleFormDemo專案中LoginController類別作一些修正:
- LoginController.java
package onlyfun.caterpillar;
import org.springframework.validation.BindException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.
mvc.SimpleFormController;
import org.springframework.web.servlet.*;
public class LoginController extends SimpleFormController {
public LoginController() {
setCommandClass(LoginForm.class);
}
protected ModelAndView onSubmit(Object command,
BindException errors)
throws Exception {
LoginForm form = (LoginForm) command;
if("caterpillar".equals(form.getUsername()) &&
"123456".equals(form.getPassword())) {
return new ModelAndView(getSuccessView(),"user",
form.getUsername());
}
else {
// 返回Form頁面時,要有一個errors的Model實例
errors.reject("loginfail", "使用者名稱或密碼錯誤");
return new ModelAndView(getFormView(),
errors.getModel());
}
}
}
Spring標籤綁定需要一個BindException物件,所以這次使用了onSumit()的另一個版本,當驗證失敗時,在 BindException中使用reject()方法,表示拒絕接受這次輸入的數據,reject()接受兩個參數,第一個是error code,如果您有設定 MessageSource(參考3.3.2),這會到您設定的.properties檔中依error code為鍵(Key),以找出相對應的訊息,如果沒有設定MessageSource,則使用第二個參數所設定的值作為錯誤訊息輸出。
errors的getModel()方法返回一個Map物件,之前使用reject()所儲存的錯誤訊息就包括在這個物件中,將之設定給ModelAndView,這之後會處理為綁定訊息以在標籤上輸出。剩下的未呈現JSP網頁、類別與定義檔等,都與 SimpleFormController 相同,如果登入錯誤,則會顯示以下的內容,數據綁定標籤將錯誤訊息與之前輸入的資料顯示在對應的標籤上。