Spring Portlet MVC中的一系列重复形式


问题内容

我有一个相当简单的用例。演员是经理,负责向员工列表提供反馈。

该视图显示员工列表。经理(用户)可以单击每个员工,然后打开(内联)反馈表单以捕获反馈。

我有一个List<Employee>用来构造页面上的员工列表的。我无法理解如何组织和获取反馈。我打算有一个单独的bean,Feedback它对应于特定的反馈Employee

我从<form:form>循环构建开始,然后执行以下操作:

<c:forEach var="employee" items="${employees}" varStatus="stat">
    <form:form action="${saveURL}" method="post" modelAttribute="feedback-${stat.index + 1}">
        <input type="submit" value="Submit Feedback"/>
    </form:form>
</c:forEach>

我试图保持我的processAction方法的签名,如下所示:

@RequestMapping(params = "action=save")
public void saveFeedback(ActionRequest request, ActionResponse response, @ModelAttribute("feedback") Feedback feedback, Model model)

不幸的是,我无法继续进行此操作,因为我感觉这里缺少一些重要的设计作品。

我应该如何构建我<form:form>saveFeedback方法,以达到我所试图做的?


问题答案:

这就是我解决问题的方式。我没有一个用于保存每个迭代特定数据的反馈表单的列表,而是必须创建一个包含Feedback域对象列表的单个反馈表单。

FeedbackForm现在看起来像这样:

public class FeedbackForm {
    private List<Feedback> feedbacks;

    ...

    getters and setters
}

通常,Feedback该类如下所示:

public class Feedback {
    private String feedback;
    private int rating;

    ...

    getters and setters
}

现在我的JSP看起来像:

<portlet:actionURL var="saveURL">
    <portlet:param name="action" value="save" />
    <portlet:param name="index" value="${stat.index}" />
</portlet:actionURL>

<c:forEach var="employee" items="${employees}" varStatus="stat">
    <form:form action="${saveURL}" method="post" modelAttribute="feedbackForm">
        <form:input path="feedbacks[${stat.index}].feedback" />
        <form:input path="feedbacks[${stat.index}].rating" />
        <input type="submit" value="Submit Feedback"/>
    </form:form>
</c:forEach>

最后,我的控制器方法如下所示:

@RequestMapping(params = "action=save")
public void saveFeedback(ActionRequest request, ActionResponse response,
    @RequestParam("index") int index,
    @ModelAttribute("feedbackForm") FeedbackForm feedbackForm, Model model)
    throws PortletException {

    Feedback feedback = feedbackForm.getFeedbacks().get(index);

    logger.debug("Submitted feedback is {}", feedback);
}

这样的想法是不可能同时提交多个表单,尽管它们可能同时出现在页面上。基本上,每个表单只能单击一个提交按钮。

希望这对处于类似情况的人有所帮助。