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