Серия повторных форм в Spring Portlet MVC - PullRequest
2 голосов
/ 09 января 2012

У меня довольно простой вариант использования. Актер - менеджер, который обеспечивает обратную связь со списком сотрудников.

В представлении отображается список сотрудников. Менеджер (пользователь) может щелкнуть каждого сотрудника, для которого открывается форма обратной связи (встроенная), чтобы зафиксировать обратную связь.

У меня есть List<Employee>, который я использую для составления списка сотрудников на странице. Я не могу понять, как структурировать и зафиксировать обратную связь. Я намереваюсь иметь отдельный компонент 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, чтобы достичь того, что я пытаюсь сделать?

1 Ответ

1 голос
/ 20 февраля 2012

Вот так я решил проблему. Вместо того чтобы иметь список форм обратной связи для хранения данных, специфичных для каждой итерации, мне пришлось создать одну форму обратной связи со списком 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);
}

Идея состоит в том, что невозможно одновременно отправлять несколько форм, хотя они могут появляться на странице одновременно. По сути, на форму можно нажать только одну кнопку отправки.

Надеюсь, это поможет кому-то в подобной ситуации.

...