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:
<%@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"的设定,会回到原来的登 入表单。