org.springframework.web.servlet.mvc.SimpleFormController
是AbstractFormController的子類別,對於簡單的表單可以直接繼承這個類別,並重新定義其onSubmit()或
doSubmitAction()方法以處理使用者的請求,SimpleFormController的處理流程是這樣的:
- 呼叫processFormSubmission()以檢驗 Errors 物件,看看在綁定或驗證時有無任何的錯誤。
- 如果有錯誤發生,返回"formView"所設定的頁面。
- 如果isFormChangeRequest()根據request被重新定義並返回true,則也會回到"formView",在回到"formView"之前會呼叫 onFormChange() ,讓您有機會修正表單物件。
- 如果沒有錯誤發生,則會呼叫帶有HttpServletRequest、
HttpServletResponse、Object、BindException參數的onSubmit(),預設是呼叫僅帶Object及
BindException的onSubmit(),而後者預設是呼叫只有Object參數的onSubmit(),預設是導向設定的
"successView",可以考慮重新定義doSubmitAction(),不用返回ModelAndView,預設會導向
"successView",在不需要向"successView"傳送任何Model資料物件時可以使用。
以下實作一個表單登入程式,以示範SimpleFormController的作用,首先設計一個form.jsp:
<%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%>
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Login Form</title> </head> <body> <h1>登入表單</h1> 請輸入使用者名稱與密碼:<p> <form name="loginform" action="/SimpleFormDemo/login.do" method="POST"> 名稱 <input type="text" name="username"/><br> 密碼 <input type="password" name="password"/><br> <input type="submit" value="確定"/> </form> 注意:輸入錯誤會再回到這個頁面中。 </body> </html>
表單中傳遞兩個參數"username"與"password",注意表單的"method"屬性設定為"POST",這樣Spring才會將請求參數填入表單物件中。先看看LoginController的撰寫:
package onlyfun.caterpillar;
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) throws Exception { LoginForm form = (LoginForm) command;
if("caterpillar".equals(form.getUsername()) && "123456".equals(form.getPassword())) { return new ModelAndView( getSuccessView(),"user", form.getUsername()); } else { return new ModelAndView(getFormView()); } } }
nSumit()方法接收command物件,這個物件代表了表單物件,getSuccessView()與getFormView()是
SimpleFormController中定義的兩個方法,分別表示通過驗證與失敗的目標網頁,待會可以直接在Bean定義檔中定義,先來看看表單物
件,它只是個簡單的JavaBean:
package onlyfun.caterpillar;
public class LoginForm { private String username; private String password; public void setUsername(String username) { this.username = username; } public void setPassword(String password) { this.password = password; } public String getUsername() { return username; } public String getPassword() { return password; } }
接下來看看Bean定義檔是如何撰寫的:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="urlMapping" class="org.springframework.web.servlet. → handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/login.do">loginController</prop> </props> </property> </bean> <bean id="viewResolver" class="org.springframework.web.servlet. → view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> <bean id="loginController" class="onlyfun.caterpillar.LoginController"> <property name="successView"> <value>success</value> </property> <property name="formView"> <value>form</value> </property> </bean> </beans>
定義檔中定義了"successView"與"formView",其中form.jsp之前已經撰寫完成,來看一下success.jsp的撰寫:
<%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%>
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>登入成功</title> </head> <body> <H1>哈囉! ${user}!!</H2> 這是您的神秘禮物!^o^ </body> </html>
直接請求login.do的話,由於未通過登入檢查,所以會返回表單登入畫面,登入成功的話,會進入success.jsp並顯示使用者的名稱,登入失敗的話,依"formView"的設定,會回到原來的登入表單。
|