SimpleFormController


org.springframework.web.servlet.mvc.SimpleFormController 是AbstractFormController的子類別,對於簡單的表單可以直接繼承這個類別,並重新定義其onSubmit()或 doSubmitAction()方法以處理使用者的請求,SimpleFormController的處理流程是這樣的:
  1. 呼叫processFormSubmission()以檢驗 Errors 物件,看看在綁定或驗證時有無任何的錯誤。
  2. 如果有錯誤發生,返回"formView"所設定的頁面。
  3. 如果isFormChangeRequest()根據request被重新定義並返回true,則也會回到"formView",在回到"formView"之前會呼叫 onFormChange() ,讓您有機會修正表單物件。
  4. 如果沒有錯誤發生,則會呼叫帶有HttpServletRequest、 HttpServletResponse、Object、BindException參數的onSubmit(),預設是呼叫僅帶Object及 BindException的onSubmit(),而後者預設是呼叫只有Object參數的onSubmit(),預設是導向設定的 "successView",可以考慮重新定義doSubmitAction(),不用返回ModelAndView,預設會導向 "successView",在不需要向"successView"傳送任何Model資料物件時可以使用。

以下實作一個表單登入程式,以示範SimpleFormController的作用,首先設計一個form.jsp:
  • 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的撰寫:
  • LoginController.java
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:
  • LoginForm.java
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定義檔是如何撰寫的:
  • mvc-config.xml
<?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的撰寫:
  • 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"的設定,會回到原來的登入表單。