6

SearchContainerliferay アプリケーションで使用しようとしています。現在、JSP Scriplets を使用して結果<liferay-ui:search-container-results>タグに設定する必要があります。これまでのスニペットは次のとおりです。

<liferay-ui:search-container emptyResultsMessage="there-are-no-courses" delta="5">
    <liferay-ui:search-container-results>
        <%
            List<Course> tempResults = ActionUtil.getCourses(renderRequest);

            results = ListUtil.subList(tempResults, 
                                   searchContainer.getStart(), 
                                   searchContainer.getEnd());

            total = tempResults.size();
            pageContext.setAttribute("results", results);
            pageContext.setAttribute("total", total);
        %>
    </liferay-ui:search-container-results>

    <liferay-ui:search-container-row ...></liferay-ui:search-container-row>

    <liferay-ui:search-iterator />

</liferay-ui:search-container>

ここで、これらのスクリプトレットを EL に変更したいと思います。同じ問題に関する投稿を 1 つ見つけましたが、それはSpring MVC. そして、ポートレットで、その質問への回答に示されているように、以下の行をどこに書くべきかわかりません:

SearchContainer<Book> searchContainer = new SearchContainer<Book>(renderRequest, renderResponse.createRenderURL(), null, "there are no books");

ポートレット アクションに書き込めません。アクションのパラメータがActionRequestandActionResponseであり、メソッドが定義されていないためcreateRenderURL()です。どうすれば入手できPortletURLますか?

上の文はどこに書けばいいですか?現在、このページに戻ってきたところから同じアクションで書いています。私はそれを正しくやっていますか?これは、同じページから起動しているアクションですsearch-container

public void addCourse(ActionRequest request, ActionResponse response) 
        throws Exception {

    ThemeDisplay themeDisplay = 
            (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);

    Course course = ActionUtil.courseFromRequest(request);

    List<String> errors = new ArrayList<String>();

    if (CourseRegValidator.validateCourse(course, errors)) {
        CourseLocalServiceUtil.addCourse(course, themeDisplay.getUserId());
        SessionMessages.add(request, "course-added-successfully");

        // I thought I might put it here.
        // But I don't know what to pass as `PortletURL` in constructor of SearchContainer
    } else {
        SessionErrors.add(request, "fields-required");
    }
}

aCourseが追加されるたびに、アクションを実行している場所と同じページの検索コンテナーにレンダリングされるようにしますaddCourse

はい、私のポートレットは拡張しMVCPortletます。


更新

わかりました、私はいくつかの部分を考え出しました。

  • 初めてポートレットがロードされたときに、ポートレットでメソッドをオーバーライドし、そこに をdoView追加できます。SearchContainerrenderRequestdoView
  • しかし、再び、私が実行してeditCourse()いるアクションに進むとresponse.setRenderParameter()、それを別の jsp ページに送信します。その JSP ページで、updateCourse()アクションを実行しています。
  • さて、アクションから、 Search Containerを使用している元の JSP ページに送信するためにupdateCourse()再び使用しています。しかし、現在、メソッドを経由していないため、 を作成してリクエストに追加することはできません。response.setRenderParameter()doView()SearchContainer

それで、ここに回避策はありますか?メソッドで設定した属性がメソッドで使用可能であることを確認するにはどうすればよいrenderRequestですdoViewupdateCourse? まったく新しいリクエストなので、現実的ではないように思えますが、他に方法はありますか?

私が考えることができる 1 つの回避策は、sessionまたはcontextの代わりに、より大きなスコープで属性を設定することですrenderRequest。しかし、その属性は他のどこにも必要ありません。ですから、それは適切ではないと思います。

入力はありますか?


更新 2 :

ちょうど今、私は使用しました:

actionResponse.setPortletMode(PortletMode.VIEW);

代わりに:

actionResponse.setRenderParameter("jspPage", jspPage);

そして、メソッドを通過するようになったので、うまくいきましたdoView()。聞きたかったのですが、これは適切な方法ですか?doViewメソッドがリダイレクトする同じ JSP ページにレンダリング パラメータを設定する場合、2 つのメソッドの違いは何ですか?


私の現在のdoView方法は次のようになります。

@Override
public void doView(RenderRequest renderRequest, RenderResponse renderResponse) 
        throws IOException, PortletException {

    SearchContainer<Course> searchContainer = 
            new SearchContainer<Course>(renderRequest, renderResponse.createRenderURL(), null, "there-are-no-courses");

    searchContainer.setDelta(5);
    List<Course> tempResults = ActionUtil.getCourses(renderRequest);

    List<Course> results = ListUtil.subList(tempResults, 
                                    searchContainer.getStart(), 
                                    searchContainer.getEnd());

    searchContainer.setTotal(tempResults.size());
    searchContainer.setResults(results);

    renderRequest.setAttribute("searchContainer", searchContainer);
    super.doView(renderRequest, renderResponse);
}
4

1 に答える 1

3

コメントを回答に変換する:

  1. ポートレットをレンダリングするときは常に、ポートレットのライフサイクルの一部としてアクション メソッドを介して直接ではなく、doView メソッドを介してレンダリングされます。
  2. doView で renderRequest.setAttribute("searchResults", courses) および renderRequest.setAttribute("searchTotal", total) として設定された結果と合計は、view.jsp で ${searchResults} および ${searchTotal} として使用できます。
  3. アクションを実行するたびに、その後 doView が呼び出され、searchResults と searchTotal が再度設定されて表示されます。
  4. または、質問でリンクした回答searchContainerで説明されているように、 doView メソッド自体に を設定することもできます。
于 2013-07-30T10:33:33.037 に答える