Spring附有一些简单的窗体处理handler,这些handler都实现了Controller接口,您可以使用这些类别,让它自动为您收集窗体参数并填入窗体对象(form object),而无需您亲自处理这些细节。
org.springframework.web.servlet.mvc.SimpleFormController是Spring提供的一个 Controller接口实现,以下实现一个窗体登入程序,以示范SimpleFormController的作用,首先我们先设计一个 form.jsp:
< html >
< head >< title > Login </ title ></ head >
< body >
请输入使用者名称与密码: < p >
< form name = " loginform " action = " /springapp/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才会将我们的参数填入窗体对象中。先看看我们的LoginAction:
LoginAction.java
import org.springframework.web.servlet.mvc.SimpleFormController;
import org.springframework.web.servlet. * ;
public class LoginAction extends SimpleFormController {
// 重载父类onSubmit方法
protected ModelAndView onSubmit(Object command) throws Exception {
LoginForm form = (LoginForm) command;
if ( " caterpillar " .equals(form.getUsername()) && " 123456 " .equals(form.getPassword())) {
return new ModelAndView( this .getSuccessView(), " user " , form.getUsername());
} else {
return new ModelAndView( this .getFormView());
}
}
}
LoginAction继承了SimpleFormController,并重新定义其onSumit()方法,Spring会呼叫这个方法, onSumit()接收command对象,这个对象代表了窗体对象,onSumit()有几个不同的版本,这边所使用的是最简单的版本,您可以看看 API文件了解它的其它版本。
getSuccessView()与getFormView()是SimpleFormController中定义的两个方法,分别表示通过验证与物败的目标网页,我们待会可以直接在Bean定义档中定义,先来看看窗体对象,它只是个简单的JavaBean:
LoginForm.java :
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;
}
}
Spring会收集Request中相关的参数,并将之填入有对应到的属性,至于LoginAction如何得到command,这我们要在Bean定义档中撰写:
<! 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 " > loginAction </ prop ></ props >
</ property >
</ bean >
< bean id = " viewResolver " class = " org.springframework.web.servlet.view.InternalResourceViewResolver " >
< property name = " viewClass " >
< value > org.springframework.web.servlet.view.InternalResourceView </ value >
</ property >
< property name = " prefix " >< value >/ WEB - INF / jsp /</ value ></ property >
< property name = " suffix " >< value > .jsp </ value ></ property >
</ bean >
< bean id = " loginAction " class = " onlyfun.caterpillar.LoginAction " >
< property name = " commandClass " >< value > onlyfun.caterpillar.LoginForm </ value ></ property >
< property name = " successView " >< value >/ WEB - INF / jsp / success.jsp </ value ></ property >
< property name = " formView " >< value >/ html / form.htm </ value ></ property >
</ bean >
</ beans >
在loginAction中的commandClass,即使定义它所要使用的窗体对象,注意我们也定义了successView与formView,其中我们的success.jsp如下:
< head >< title > Login Success </ title ></ head >
< body >
< H1 > Hello, $ {user} !!</ H2 >
This is your secret gift.
</ body >
</ html >
登入成功的话,会进入success.jsp并显示使用者的名称,登入失败的话,依formView的设定,会回到原来的登入窗体。