ITEEDU

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