org.springframework.web.servlet.mvc.SimpleFormController 是 AbstractFormController 的子类别,对于简单的表单可以直接继承这个类别,并重新定义其 onSubmit()或 doSubmitAction()方法以处理使用者的请求,SimpleFormController 的处理流程是这样的: </p>
<p> 1. 呼叫 processFormSubmission()以检验 Errors 物件,看看在绑定或验证时有无任何的 错误。 <br />
2. 如果有错误发生,返回"formView"所设定的页面。 <br />
3. 如果 isFormChangeRequest()根据 request 被重新定义并返回 true,则也会回到 "formView",在回到"formView"之前会呼叫 onFormChange() ,让您有机会修正表单物
件。 <br />
4. 如果没有错误发生,则会呼叫带有 HttpServletRequest、HttpServletResponse、Object、 BindException 参数的 onSubmit(),预设是呼叫仅带 Object 及 BindException 的
onSubmit(),而后者预设是呼叫只有 Object 参数的 onSubmit(),预设是导向设定的 "successView",可以考虑重新定义 doSubmitAction(),不用返回 ModelAndView,预设 会导向 "successView",在不需要向"successView"传送任何 Model 资料物件时可以使
用。 <br />
以下实作一个表单登入程式,以示范 SimpleFormController 的作用,首先设计一个 form.jsp: </p>
<h5> • form.jsp</h5>
<pre class="code"><%@pagecontentType="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></pre>
<p> 表单中传递两个参数"username"与"password",注意表单的"method"属性设定为"POST",这样 Spring 才会将请求参数填入表单物件中。先看看 LoginController 的撰写: </p>
<h5> • LoginController.java </h5>
<pre class="code">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());
}
}
}
</pre>
<p> nSumit()方法接收 command 物件,这个物件代表了表单物件,getSuccessView()与 getFormView()
是 SimpleFormController 中定义的两个方法,分别表示通过验证与失败的目标网页,待会可以 直接在 Bean 定义档中定义,先来看看表单物 件,它只是个简单的 JavaBean: </p>
<h5> • LoginForm.java</h5>
<pre class="code">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;
}
}</pre>
<p> 接下来看看 Bean 定义档是如何撰写的:</p>
<h5> • mvc-config.xml</h5>
<pre class="code"><?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></pre>
<p> 定义档中定义了"successView"与"formView",其中 form.jsp 之前已经撰写完成,来看一下
success.jsp 的撰写:</p>
<h5> • success.jsp</h5>
<pre class="code"><%@pagecontentType="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></pre>
<p>直接请求 login.do 的话,由于未通过登入检查,所以会返回表单登入画面,登入成功的话,会 进入 success.jsp 并显示使用者的名称,登入失败的话,依"formView"的设定,会回到原来的登 入表单。
<p> 1. 呼叫 processFormSubmission()以检验 Errors 物件,看看在绑定或验证时有无任何的 错误。 <br />
2. 如果有错误发生,返回"formView"所设定的页面。 <br />
3. 如果 isFormChangeRequest()根据 request 被重新定义并返回 true,则也会回到 "formView",在回到"formView"之前会呼叫 onFormChange() ,让您有机会修正表单物
件。 <br />
4. 如果没有错误发生,则会呼叫带有 HttpServletRequest、HttpServletResponse、Object、 BindException 参数的 onSubmit(),预设是呼叫仅带 Object 及 BindException 的
onSubmit(),而后者预设是呼叫只有 Object 参数的 onSubmit(),预设是导向设定的 "successView",可以考虑重新定义 doSubmitAction(),不用返回 ModelAndView,预设 会导向 "successView",在不需要向"successView"传送任何 Model 资料物件时可以使
用。 <br />
以下实作一个表单登入程式,以示范 SimpleFormController 的作用,首先设计一个 form.jsp: </p>
<h5> • form.jsp</h5>
<pre class="code"><%@pagecontentType="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></pre>
<p> 表单中传递两个参数"username"与"password",注意表单的"method"属性设定为"POST",这样 Spring 才会将请求参数填入表单物件中。先看看 LoginController 的撰写: </p>
<h5> • LoginController.java </h5>
<pre class="code">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());
}
}
}
</pre>
<p> nSumit()方法接收 command 物件,这个物件代表了表单物件,getSuccessView()与 getFormView()
是 SimpleFormController 中定义的两个方法,分别表示通过验证与失败的目标网页,待会可以 直接在 Bean 定义档中定义,先来看看表单物 件,它只是个简单的 JavaBean: </p>
<h5> • LoginForm.java</h5>
<pre class="code">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;
}
}</pre>
<p> 接下来看看 Bean 定义档是如何撰写的:</p>
<h5> • mvc-config.xml</h5>
<pre class="code"><?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></pre>
<p> 定义档中定义了"successView"与"formView",其中 form.jsp 之前已经撰写完成,来看一下
success.jsp 的撰写:</p>
<h5> • success.jsp</h5>
<pre class="code"><%@pagecontentType="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></pre>
<p>直接请求 login.do 的话,由于未通过登入检查,所以会返回表单登入画面,登入成功的话,会 进入 success.jsp 并显示使用者的名称,登入失败的话,依"formView"的设定,会回到原来的登 入表单。