zoukankan      html  css  js  c++  java
  • 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
     

  • 相关阅读:
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    落忆枫音(我们终将成为”枫音乡的过客“)
    PID221 / 烦人的幻灯片☆ x
    codevs 5971 打击犯罪 x
    洛谷 P2330 [SCOI2005] 繁忙的都市 x
  • 原文地址:https://www.cnblogs.com/obama/p/3843792.html
Copyright © 2011-2022 走看看