【问题标题】:Data binding without using spring taglib不使用 spring taglib 的数据绑定
【发布时间】:2012-07-22 20:10:14
【问题描述】:

我的 html 是在没有使用 spring taglib 的情况下构建的,现在我想将表单的参数绑定到我的控制器中的一个对象。

目前我的表单是这样的

<form>
<input type="text" name="frAccUserMgmt.userName"/>
<input type="password" name="frAccUserMgmt.userPwd"/>
</form>

我的对象的相关部分是

Class FrAccUserMgmt {
    private String userName;
    private Strint userPwd;
    // getter and setter
}

我的控制器是

@RequestMapping("login")
Public ModelAndView doLogin(FrAccUserMgmt frAccUserMgmt) {
    //code
}

我该如何绑定它。目前绑定没有发生。我只是在我的代码中得到一个空对象。

【问题讨论】:

    标签: spring data-binding spring-mvc taglib


    【解决方案1】:

    您可以尝试在方法签名中包含BindingResult 类,然后查看是否有任何绑定错误:

    @RequestMapping("login")
    Public ModelAndView doLogin(FrAccUserMgmt frAccUserMgmt, BindingResult result) {
        if (result.hasErrors()) {
            logger.warn("BindingResult errors: " + result.toString());
        }
        //code
    }
    

    从表单字段名称中删除frAccUserMgmt 部分。 Spring会根据命令对象中定义的getter和setter,自动找到命令对象绑定请求参数。

    【讨论】:

    • Niether 添加@ModelAttribute 有什么不同
    • 尝试将 HttpServletRequest 对象添加到方法签名中,并检查请求参数是否按预期通过。还可以尝试将输入重命名为“userName”和“userPwd”(删除 frAccUserMgmt 部分)。
    • 请求参数正在通过。如果我将方法更改为doLogin(String userName, String userPwd),那么它们就会被绑定。但是我希望它直接绑定到对象而不使用 taglib,因为我在应用程序中有复杂的表单,并且不想编写带有大量参数的控制器方法或从请求对象中一一删除它们。没有标签库可以这样做吗?谢谢
    • taglib 不应该在你点击控制器后对绑定产生影响——只要你的 HTML 代码生成相同的 HttpServletRequest 参数,它就没有区别。我认为你的问题是让你的纯 HTML 来制定正确的参数名称和值(以及正确的 URL、表单编码设置等)。这些可能需要添加到您的&lt;form&gt; 元素中。我做同样的事情(从不使用 Spring taglibs)并且绑定到我的表单支持 bean 类没有任何问题。我唯一添加的是&lt;input name="foo" value="${foo}"/&gt;
    • 是的。应该早点听你的.. :) 删除 frAccUserMgmt 部分就可以了。谢谢
    【解决方案2】:

    这也可以通过为应该使用请求参数填充的参数 bean 添加 @ModelAttribute 来完成。

    根据春季文档

    http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-ann-modelattrib-method-args (16.3.3.8 在方法参数上使用@ModelAttribute)

    方法参数上的@ModelAttribute 表示应从模型中检索该参数。如果模型中不存在,则应首先实例化参数,然后将其添加到模型中。一旦出现在模型中,参数的字段应该从具有匹配名称的所有请求参数中填充。这在 Spring MVC 中称为数据绑定,这是一种非常有用的机制,可以让您不必单独解析每个表单字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 2014-02-01
      相关资源
      最近更新 更多