Spring MVC在页面中只提交一个render List元素

时间:2014-05-30 11:47:05

标签: java spring spring-mvc

我一直在这里和谷歌寻找这个答案没有任何成功。我将解释我在寻找什么,让我们看看是否有人可以帮助我。

使用Spring MCV我将A对象列表“aList”渲染到我的view.JSP。

    @RequestMapping(method = RequestMethod.GET)
    public final ModelAndView getAList(){
        ModelAndView mav = new ModelAndView("view");
        List<A> aList = new ArrayList<>();
        aList.add(new A("a1");
        aList.add(new A("a2");
        mav.addObject("aList", aList);
        return mav;
    }

A看起来像

  public class A{
      @Getter
      @Setter
      private String value; 
      public A(String value){
             this.value=value;
       }
    }           

对于列表的每次迭代,我都在创建一个表单。表格看起来像

  <c:forEach var="a" items="${aList}"
               varStatus="status">

      <form:form id="A${a.id}"
               method="post" action="save.do"
               modelAttribute="a">

               <input type="submit"  value="Save"/>
      </form:form>
  </c:forEach>

所以在完成渲染后,我有很多表单作为列表中的对象。 您可以想象的每个表单都有他的提交按钮。 现在我试图做的没有任何成功就是将这个表单中的一个发送到我的控制器,但不是我呈现的A的整个列表,但是A.所以我的控制器看起来像。

   RequestMapping(value = "/save", method = RequestMethod.POST)
         public final ModelAndView save(@ModelAttribute("a") A a) {

但是我收到了“IllegalStateException:BindingResult和bean名称的普通目标对象”,因为我的modelAndView“aList”的渲染名称与“a”不同。

我认为我理解的是,类似于Spring的MVC组件不允许提交在渲染中使用的不同类。即使是渲染类的嵌套类,也是太糟糕了。

我想避免再次发送aList。

有什么想法吗?

问候。

2 个答案:

答案 0 :(得分:0)

而不是试图回发所选元素的全部内容, 考虑回发所选元素的标识符。 例如:

<form:form method="post" action="save.do">
    <c:forEach items="${aList}"
               var="element"
               varStatus="status">

    <input type="submit"
           name="selectedElementId"
           value="${element.id}"/>
    </c:forEach>
</form:form>

答案 1 :(得分:0)

好的,它有效。问题是,<form:xxx>元素(例如<form:input>)是否存在路径问题,该路径以不在渲染部分模型中的元素开头。

所以我略微修改了给出的例子。这是表单部分:

<ul><c:forEach var="a" items="${aList}" varStatus="status">
  <li><form:form modelAttribute="a" action="save.do" method="POST" >
    <input type="hidden"  name ="index" value="${status.index}">
    <input type="text"  name ="value" value="${a.value}">
    <input type="submit"  value="Save"/>
  </form:form></li>
</c:forEach></ul>

<li>仅用于最小格式化,但重要的部分是使用直接<input>元素,以便Spring MVC不会在a上窒息而不属于该模型。所以渲染工作。

现在为保存部分:

RequestMapping(value = "/save", method = RequestMethod.POST)
public final String save(@ModelAttribute("a") A a, @RequestParam("index") int index){
    A aa = aService.getaList().get(index);
    aa.setValue(a.getvalue());
    return "redirect:/list";
}

没有问题,因为POST请求中不存在model属性的名称。 Springs只是创建一个新的A并设置其value属性。此解决方案可扩展用于复杂的A类。唯一的问题是,我不管理Spring返回的错误。它们必须在全球范围内进行管理。 (我假设列表部分的URL是/list