0

これをきちんと説明できればと思います。Spring を使用して、Liferay のポートレットを開発しています。ピンボードシステムです。そのため、特定のピンボード エントリの詳細を示すビュー (Jsp) があり、その ID が指定されています。さらに、ユーザーが現在見ているピンボード エントリに新しいコメントを追加するための AddCommentController へのリンクがあります。AddCommentController は、Spring の SimpleFormController を拡張し、バリデーターもアタッチされています。

<bean id="addCommentController" class="com.lifepin.controllers.AddCommentController" parent="lifePinControllerTemplate">
    <property name="formView" value="addComment" />
    <property name="successView" value="viewEntryDetail" />
    <property name="validator" ref="commentValidator"/>
</bean>

バリデータは非常にシンプルで、次のようになります。

public class CommentValidator implements Validator {

    public boolean supports(Class clazz) {
        return clazz.equals(Comment.class);
    }

    public void validate(Object obj, Errors validationError) {
        ValidationUtils.rejectIfEmptyOrWhitespace(validationError, "content", "err.content.empty", "This value is required");
    }

}

ユーザーがコメントを入力できるビューには、保存とキャンセルの 2 つのボタンがあります。以下は、対応する URL の 2 つのジェネレーターです。

<portlet:actionURL var="actionUrl">
    <portlet:param name="action" value="addComment"/>
    <portlet:param name="pinboardEntryId" value="${param.pinboardEntryId}"/>
</portlet:actionURL>

<portlet:renderURL var="cancelUrl">
    <portlet:param name="action" value="viewPinboardEntry"/>
    <portlet:param name="pinboardEntryId" value="${param.pinboardEntryId}"/>
</portlet:renderURL>

AddCommentController の onSubmitAction で、パラメーターを読み取り (上記の最初の actionURL を参照)、ピンボード エントリの詳細ビューの ActionResponse st に渡します。エントリを再度読み込んで表示できます。

public class AddCommentController extends SimpleFormController{
   ...
   @Override
   protected void onSubmitAction(ActionRequest request, ActionResponse response, Object command, BindException bindException)
            throws Exception {

      long pinboardEntryId = PortletRequestUtils.getLongParameter(request, ParameterNameConstants.PINBOARDENTRY_ID, -1);
      ...
   }
   ...
}

検証エラーが発生した場合を除いて、これはすべて正常に機能します。その場合、URL から「pinboardEntryId」パラメーターを失い、PortletRequest または応答がないため、CommentValidator でそのパラメーターを読み取って再度応答に渡す方法がありません。

今のところ、ID をセッションに保存し、そこから取得することで、この問題を解決しました。ただし、セッションを使用せずに別の解決策を持っている人がいるかどうかを尋ねたかった. 1つあると確信しています。

ありがとう、
ジュリ

4

3 に答える 3

4

さらに簡単な解決策は、renderParametersプロパティを設定することです。renderParametersプロパティは、SimpleFormControllerが常に転送するパラメーター名の配列です。例えば:

    <bean id="addCommentController" class="...">
         ....
         <property name="renderParameters">
           <list>
             <value>pinboardEntryId</value>
           </list>
         </property>
    </bean>

これにより、追加のコードなしで毎回「pinboardEntryId」パラメーターが渡されます。

于 2009-10-13T13:32:08.470 に答える
0

検証時にエラーshowForm(..)が再度呼び出されます。このメソッドを上書きして、好きなように操作できRequestますResponse

于 2009-04-30T19:45:39.100 に答える
0

Oliver Gierke (フィードバックに感謝) によって提案された showForm(..) アプローチを最初に試しましたが、期待どおりに機能しませんでした。showForm(..) は、onSubmitAction(...) によって行われる必要があるため、気にしたくない新しい ModelAndView を返したいと考えています。

正しいアプローチは、

@Override
protected void processFormSubmission(ActionRequest request, ActionResponse response, Object command, BindException errors){
  ...
}

そこには、必要なすべての情報が用意されています。を使用して検証エラーが発生したかどうかを BindingException で確認できるようになりましたerrors.hasErrors()。その場合は、必要なパラメーターを読み取り、それらを応答に転送して、フォームに再び含めることができます。それ以外の場合は、を呼び出してonSubmitAction(..)、リクエスト、レスポンスなどの必要なパラメーターを渡します。これは、processFormSubmission で使用できます。

于 2009-05-02T09:21:48.960 に答える