SearchContainer
liferay アプリケーションで使用しようとしています。現在、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");
ポートレット アクションに書き込めません。アクションのパラメータがActionRequest
andActionResponse
であり、メソッドが定義されていないため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
追加できます。SearchContainer
renderRequest
doView
- しかし、再び、私が実行して
editCourse()
いるアクションに進むとresponse.setRenderParameter()
、それを別の jsp ページに送信します。その JSP ページで、updateCourse()
アクションを実行しています。 - さて、アクションから、 Search Containerを使用している元の JSP ページに送信するために
updateCourse()
再び使用しています。しかし、現在、メソッドを経由していないため、 を作成してリクエストに追加することはできません。response.setRenderParameter()
doView()
SearchContainer
それで、ここに回避策はありますか?メソッドで設定した属性がメソッドで使用可能であることを確認するにはどうすればよいrenderRequest
ですdoView
かupdateCourse
? まったく新しいリクエストなので、現実的ではないように思えますが、他に方法はありますか?
私が考えることができる 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);
}