2012-01-09 43 views
2

我有一個相當簡單的用例。演員是一名經理,負責向員工列表提供反饋。Spring Portlet MVC中的重複表單系列

該視圖顯示員工列表。經理(用戶)可以點擊反饋表單打開的每個員工(內聯)以獲取反饋。

我有一個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

這就是我解決問題的方法。我必須創建一個包含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); 
} 

這個想法是不可能同時提交多個表單,儘管它們可能同時出現在頁面上。基本上,每個表單只能單擊一個提交按鈕。

希望這可以幫助有類似情況的人。