Spirng MVC +Velocity 表单绑定命令对象

通常,表单中的数据在提交之后可以通过Spring MVC的@RequestParam注解在控制器函数的参数列表中中提取出来,但是一旦表单数据过多的话,参数列表将会变得非常长,最好的解决方案是将表单中的数据封装到一个自定义的对象中,这样就可以直接用一个命令对象传递整个表单所包含的数据了。

关键字:#springBind宏

没错,这个宏是绑定的关键。首先我们需要开启spring mvc在velocity模板中对宏的支持,这个需要做以下设置:

<bean id="viewResolver"
class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"
>
## ....
<property name="exposeSpringMacroHelpers">
<value>true</value>
</property>
</bean>

我们以一个简单的登录控制系统来说明一下绑定流程,假设我们要实现如下图的一个界面:

image

从Spring MVC的角度来看,渲染出这个模板(假设此模板为login.vm)首先需要经过一个控制器的函数处理,假设这个函数名称为autoBindLogin,那么这个函数在渲染模板时完成一件事,那就是告诉模板需要绑定的命令对象的实例是什么。

当然,我们首先得介绍一下命令对象所属类的定义:

package com.lipan.DO;

public class AccountModel {
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;
}
}

可以看到,这只是一个简单的POJO类,纯粹为了封装数据产生的,其两个成员变量分别对应login.vm中的两个表单输入。

回到刚才的问题,如何告诉表单绑定对象的实例呢?下面的代码就是答案--我们生成一个给它,然后通过名称约定(名称相同)传递给模板。

//lipan : 传入表单的对象
@RequestMapping(value="/autoBind", method={RequestMethod.GET})
public String autoBindLogin(Model model){
model.addAttribute("accountmodel", new AccountModel());
return "login";
}


这之后模板就可以用到传递进来的命令对象索引"$accountmodel"了,用法如下:

## login.vm 
## author:lipan
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=GBK">
<title>data binding example</title>
</head>
<body>
<form method="post">
#springBind("accountmodel.username")
姓名:<input type="text" name="${status.expression}" value="$!status.value"/>
<font color="#FF0000">${status.errorMessage}</font><br/>
#springBind("accountmodel.password")
密码:<input type="text" name="${status.expression}" value="$!status.value"/>
<font color="#FF0000">${status.errorMessage}</font><br/>
<input type="submit" name="Submit"/><br/>
</form>
</body>
</html>


一旦表单内容submit成功,这个实例可以传到处理表单请求(此处是POST请求)的控制器中,由对应的函数处理,比如下面这个函数:

@RequestMapping(value="/autoBind", method={RequestMethod.POST})
public String autoBindResult(Model model,AccountModel am){
/*am.setPassword("lipantestpw");
am.setUsername("lipan");*/
model.addAttribute("accountmodel",am );
return "autoBindResult";
}

然后autoBindResult.vm就可以展现命令对象的具体内容了:

##autoBindResult.vm
##author:lipan
username: ${accountmodel.username}</br>
password: ${accountmodel.password}</br>

autoBindResult.vm的渲染结果如下:
image
 

posted @ 2014-07-14 23:52  曾见绝美的阳光  阅读(4437)  评论(0编辑  收藏  举报