通常,表单中的数据在提交之后可以通过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>

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

从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的渲染结果如下:

 

Spirng MVC +Velocity 表单绑定命令对象的更多相关文章

  1. C# MVC提交表单的四种方式(转)

    Mvc 提交表单的4种方法全程详解(转) 一,MVC  HtmlHelper方法 Html.BeginForm(actionName,controllerName,method,htmlAttribu ...

  2. Spring MVC与表单日期提交的问题

    Spring MVC与表单日期提交的问题 spring mvc 本身并不提供日期类型的解析器,需要手工绑定, 否则会出现非法参数异常. org.springframework.beans.BeanIn ...

  3. Knockout学习之表单绑定器(上)

    表单绑定器 “click”绑定 Click 绑定器可以将javascript函数绑定到指定的dom元素,并且再该元素被点击时将触发绑定的函数,大多数情况下都会使用button.input和a元素,当然 ...

  4. vue基础-动态样式&表单绑定&vue响应式原理

    动态样式 作用:使用声明式变量来控制class和style的值 语法: :class/:style 注意:尽可能不要把动态class和静态class一起使用,原因动态class起作用的时间会比较晚,需 ...

  5. 用Typescript 的方式封装Vue3的表单绑定,支持防抖等功能。

    Vue3 的父子组件传值.绑定表单数据.UI库的二次封装.防抖等,想来大家都很熟悉了,本篇介绍一种使用 Typescript 的方式进行统一的封装的方法. 基础使用方法 Vue3对于表单的绑定提供了一 ...

  6. spring mvc form表单提交乱码

    spring mvc form表单submit直接提交出现乱码.导致乱码一般是服务器端和页面之间编码不一致造成的.根据这一思路可以依次可以有以下方案. 1.jsp页面设置编码 <%@ page ...

  7. mvc异步表单遇到的问题

    1,mvc异步表单遇到的问题    问题:使用jqury easy ui 时提交异步数据不能请求到服务器   解决办法:经过细心调试和检测,发现jqury的加载顺序放在了easy ui之后,所以首先加 ...

  8. Vue表单绑定(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)

    <!DOCTYPE html><html>    <head>        <meta charset="utf-8">      ...

  9. form表单转化json对象

    利用 $.fn 可以让每一个jquery 对象都能直接使用这个方法. //form表单转化json对象$.fn.serializeObject = function () { var o = {}; ...

随机推荐

  1. COCOS2DX学习之Box2d物理引擎使用之------动态物体的创建

    1.创建一个物理世界 首先要引入一个头文件#include "Box2D\Box2D.h" 之后利用b2word创建一个对象,而且指定这个物理世界中的加速度方向. word = n ...

  2. Sql Server 导入还有一个数据库中的表数据

    在涉及到SQL Server编程或是管理时一定会用到数据的导入与导出, 导入导出的方法有多种,此处以SQL Server导入表数据为例.阐述一下: 1.打开SQL Server Management ...

  3. rand和srand的用法(转载)

    首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand产生随机数,下面将详细说明. rand(产生随机数)表头文件: #include<stdlib.h> ...

  4. [原创+分享]Mandelbrot Explorer

    Mandelbrot Explorer 是一款用于在MandelBort集/Julia集上进行无限漫游的软件,使用VS2013+CUDA6.5开发而成.它也是我学习CUDA开发的一个小小的成果,欢迎大 ...

  5. canvas鼠标点击划线

    今天学习了canvas,打算写一个鼠标划线的效果. <!DOCTYPE html> <html lang="en"> <head> <me ...

  6. Windows Server 2012 R2 安装.NET Framework 3.5报错

    简单记录一下,Windows Server 2012 R2 安装.NET Framework 3.5报错,下面是解决方法 载入ISO文件Windows Server 2012 R2,而且在安装的过程中 ...

  7. Ctags基本配置

    一般linux系统都会自带ctags,也可输入"ctags"看有木有该命令.有的话速度配置吧,没有话yum install ctags安装吧. 打开vim 配置文件,要是没该文件就 ...

  8. 2016/3/31 拾遗 php字符串中 转义字符 “ ’‘ ” ’ “” ‘ " \’ ' ' \‘ " " \" '' \ " " 使用

    <?php echo $str_string1='甲问:"你在哪里学的PHP?"'; echo "<br />"; echo $str_str ...

  9. mysql 转换编码方式

    进入mysql 的安装文件夹找到 “ my.ini” 文件  (mysql配置文件) 一.编辑MySql的配置文件 vim /etc/my.cnf 在 [mysqld] 标签下加上三行 default ...

  10. caioj1275&&hdu4035: 概率期望值6:迷宫

    期望的大难题,%%ZZZ大佬的解释,不得不说这是一道好题(然而膜题解都没完全看懂,然后就去烦ZZZ大佬) 简单补充几句吧,tmp的理解是个难点,除以tmp的原因是,当我们化简时,子节点也有一个B*f[ ...