【问题标题】:SpringMVC Custom Collection Editor Not Returning Data To JspSpringMVC 自定义集合编辑器不向 Jsp 返回数据
【发布时间】:2013-03-22 16:48:20
【问题描述】:

我在春季绑定了一个多选列表,该项目没有从 DAO 获取其数据,数据是从另一个选择选项列表添加的。用户点击一个按钮,数据使用 jquery 发送到多选选项列表。

当表单发布时,项目不会发生数据绑定,因为它是一种复杂的数据类型,所以我注册了一个 CustomEditor 并将其附加到 @initbinder。

已编辑 我已经更新了 CollectionEditor 的代码,现在将公民列表返回到视图,但是我无法获取列表中的数据来填充选择选项。我正在尝试将元素添加到列表中,但是当从服务器返回时,jsp 仍然选择保持 null。

下面是代码:

CustomCollectionEditor

@InitBinder("crime")    
    protected void initBinder(WebDataBinder binder, HttpServletRequest request, ServletRequestDataBinder victimbinder){
     victimbinder.registerCustomEditor(List.class, "victims", new CustomCollectionEditor(List.class){
         protected Object convertElement(Object element){

             Citizens victims = new Citizens();

             String ssNumber = "";

             if (element instanceof String){
                ssNumber = (String) element;

             }                      

             logger.debug("element is ;" +element);

             try {

                int socialSecurityNumber = Integer.parseInt(ssNumber);
                victims = citizenManager.getCitizen(socialSecurityNumber);

            } catch (NumberFormatException e) {                     
                logger.error(e.getMessage());
            } catch (Exception e) {
                logger.error(e.getMessage());
            }

             return victims;        
         }

    }); 

从控制器中的DAO填充的Jsp

这包含数据填充表单 DAO 类,当单击按钮时,它会从列表中获取数据并将其附加到绑定到 POJO 的另一个列表

<label>Victims List</label><buttonid="addVictimBtn">/button>
<form:select path="" id="dbvictims" title="Victims Of Crime" class="victimLst">
<form:options items="${dbvictims.dbvictimList}" itemValue="socialSecurityNumber" itemLabel="name"/>
</form:select>  

Jsp 选择绑定到 POJO 的项目

<label>Victims In Crime</label><button id="removeVictimBtn">-</button> 
<form:select path="victims" id="victims" title="Victims Of Crime"  multiple="multiple" class="victimLst">
<form:options items="${victimList}" itemValue="socialSecurityNumber" itemLabel="name"/>
</form:select><form:errors path="victims" class="errors" />                            

【问题讨论】:

  • 我不相信选择选项标签是在 HTTP 帖子中发送的,只有值。我不相信你可以直接得到所说的值。但是,您也许可以使用隐藏字段执行某些操作。
  • 您遇到错误了吗?如果不是,生成的 HTML 是什么样的?
  • 那么,让我看看我是否能理解发生了什么。您有一个 Spring MVC 控制器,其中定义了一个 (at)InitBinder,它创建了一个 CustomCollectionEditor 的实例。此 CustomCollectionEditor 用于填充“victimList”。不过,victimList 是如何在您的模型中设置的?
  • 你也可以粘贴控制器代码吗?
  • 看起来您只是想发送一个 SSN 并从数据库中获取该 SSN 的受害者列表,然后将该列表作为模型的一部分发送回页面,对吗?您要调用哪个控制器方法来执行此操作?

标签: java jquery spring spring-mvc


【解决方案1】:

此问题的解决方案非常简单,所有工作都已在 CustomCollectionEditor 中完成。这在绑定上述复杂数据类型时很重要。可能还有其他方法可以做到这一点,但我发现这是一种非常干净和简单的方法。

return 语句非常重要,因为它绑定到视图中元素的 item 属性。 CustomCollectionEditor 返回一个对象列表(victims) 使用DAO 从数据库中获取对象。这很重要,因为帖子只发送选择值而不是标签,因此我们重建列表并重新发送到视图。

我省略的部分是将列表对象从控制器传递回视图。

控制器

@RequestMapping(value="save.htm", method = RequestMethod.POST)
    public ModelAndView handleSave(@Valid @ModelAttribute Crime crime, 
    BindingResult result,
    ModelMap m,
    Model model) throws Exception {


    if(result.hasErrors()){
           model.addAttribute("victimList",crime.getVictims());

    return new ModelAndView("*Your View*");
...............

【讨论】:

  • 恭喜你,终于弄明白了
  • 不客气,先生,我还建议您阅读 Spring 网络参考。
猜你喜欢
  • 2016-05-26
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 2011-05-15
相关资源
最近更新 更多