当Controller未显示页面时,映射到Spring MVC中的列表对象

时间:2017-10-12 10:31:51

标签: spring spring-mvc

我正在尝试将值从前端映射到Back Bean,这是一个List。现在的问题是,Spring控制器不显示页面/视图,它是由CMS(内容管理系统)显示的jsp。所以我不能初始化List并向其添加元素并作为模式属性传递

这就是我的bean看起来的样子

public class LodgingAvailabilityRequest implements Serializable
{
private List<GuestCount> guestCounts = new ArrayList<GuestCount>();
public List<GuestCount> getGuestCounts() {
    return guestCounts;
}
public void setGuestCounts(List<GuestCount> guestCounts) {
    this.guestCounts = guestCounts;
}

并且GuestCount具有计数字段

public class GuestCount implements Serializable
{
private Double count;

这就是我的JSP的样子

<jsp:useBean id="lodgingAvailability" class="com.pegasus.gen.LodgingAvailabilityRequest" scope="request"/>
<jsp:useBean id="guestCount" class="com.pegasus.gen.GuestCount" scope="request"/>

<body>
          <form:form method="POST" action="/lodgingbyroom" modelAttribute="lodgingAvailability">
              <table>
                   <tr>
                            <td>Count: <form:input path=guestCounts[0].count /></td>
                        </tr>
                     <td><input type="submit" value="Submit lodgingAvailability request by ROOM type"/></td>
                </tr>
            </table>
        </form:form>

现在使用上面的代码给出了Array Out of Bounds异常,所以我尝试了其他一些帖子中提到的一些东西

  1. 更改为此<td>Count: <form:input path="${guestCounts[0].count}" /></td>我没有收到任何编译错误,但控制器中的vaue未映射。列表是空的。
  2. 添加了for循环,但由于列表为空且不会进入循环,因此无法正常工作。
  3. &#13;
    &#13;
        <c:forEach items="${lodgingAvailability.guestCounts}" varStatus="counter">
        	                 <tr>
        	                    <td>Count: <form:input path="guestCounts[${counter.index}].count" /></td>
        	                </tr>
        				</c:forEach>
    &#13;
    &#13;
    &#13;

    这是我的控制器的外观,表单提交的位置

        @RequestMapping(value = "/lodgingbyroom", method = RequestMethod.POST)
    public String lodgingAvailabilityByRoom(ModelMap model, LodgingAvailabilityRequest request,
            RedirectAttributes redirectAttributes) {
        final RestTemplate restTemplate = new RestTemplate();
        final Map<String, List<DXARoom>> groupByRoom = restTemplate
                .postForEntity(pegasusPath + "/lodgingbyroom", request, Map.class).getBody();
        redirectAttributes.addFlashAttribute("pegasusResponse", groupByRoom);
    

    }

1 个答案:

答案 0 :(得分:0)

我能解决上述问题。由于列表中没有任何元素,使其工作的唯一方法是添加一个虚拟元素列表。因此,您可以遍历列表,然后映射值

&lt;%lodgingAvailability.getGuestCounts()。add(guestCount);%&gt;

       <% lodgingAvailability.getGuestCounts().add(guestCount) ;%>  

  <c:forEach items="${lodgingAvailability.guestCounts}" varStatus="counter">
         <tr>
           <td>Count: <form:input path="guestCounts[${counter.index}].count" /></td>
          </tr>
    </c:forEach>  

要使这段代码工作,请确保声明bean

<jsp:useBean id="lodgingAvailability" class="com.pegasus.gen.LodgingAvailabilityRequest" scope="request"/>
<jsp:useBean id="guestCount" class="com.pegasus.gen.GuestCount" scope="request"/>