2012-01-09 7 views
2

私はかなり単純な使用例があります。俳優は従業員のリストにフィードバックを提供するマネージャーです。Springポートレット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メソッドをどのように構成する必要がありますか?

答えて

1

これは私がどのように問題を解決したかです。各繰り返しに固有のデータを保持するためのフィードバックフォームのリストを用意する代わりに、Feedbackドメインオブジェクトのリストを持つ単一のフィードバックフォームを作成する必要がありました。

マイFeedbackFormは次のようになります。

public class FeedbackForm { 
    private List<Feedback> feedbacks; 

    ... 

    getters and setters 
} 

そして一般的に、Feedbackクラスは次のようになります。

<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> 

そして最後に:

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

    ... 

    getters and setters 
} 

今私のJSPのように見えます、私のコントローラメソッドは次のようになります:

@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); 
} 

複数のフォームを同時に送信することはできませんが、ページに同時に表示される可能性があります。基本的には、フォームごとに1つの送信ボタンしかクリックできません。

似たような状況にある人に役立ちます。

関連する問題