Spring提供它自訂的標籤庫,可以與相關的組件結合,提供頁面與表單物件、錯誤訊息的數據綁定功能,為節省篇幅,在這邊以 SimpleFormController 來進行修改擴充,加入Spring的<bind>標籤功能,首先修改一下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類別作一些修正:
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 相同,如果登入錯誤,則會顯示以下的內容,數據綁定標籤將錯誤訊息與之前輸入的資料顯示在對應的標籤上。
|