Настройка SearchContainer в портлете для использования его в JSP с использованием EL и JSTL
Я пытаюсь использовать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. янашел один пост относительно той же проблемы, но это используетSpring MVC
, И я не знаю, где написать строку ниже, как указано в ответе на этот вопрос в портлетах:
SearchContainer<Book> searchContainer = new SearchContainer<Book>(renderRequest, renderResponse.createRenderURL(), null, "there are no books");
Я не могу написать это в моем действии портлета, так как параметр в моем действииActionRequest
а такжеActionResponse
, который не определяет метод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");
}
}
Я хочу этого каждый раз, когдаCourse
добавлен, он отображается в моем поисковом контейнере, на той же странице, откуда я запускаюaddCourse
действие.
И да, мой портлет расширяетсяMVCPortlet
.
ОБНОВИТЬ:
Хорошо, я понял несколько частей.
Впервые при загрузке портлета я могу переопределитьdoView
метод в моем портлете, а затем добавьтеSearchContainer
вrenderRequest
там, как я имею доступ к нему вdoView
.Но опять же, когда я иду наeditCourse()
действие, где я делаюresponse.setRenderParameter()
, чтобы отправить его на другую страницу JSP. И на этой странице JSP я стреляюupdateCourse()
действие.Теперь изupdateCourse()
действие, я снова используюresponse.setRenderParameter()
чтобы отправить его на исходную страницу JSP, где я используюПоиск контейнера, Но сейчас, так как это не проходитdoView()
метод, я не могу создатьSearchContainer
и добавьте его в запрос.Итак, есть ли здесь какой-нибудь обходной путь? Как убедиться, что атрибут, который я установил вrenderRequest
вdoView
метод доступен вupdateCourse
метод? Я знаю, что это не звучит практично, так как это совершенно новый запрос, но есть ли другой способ?
Один из обходных путей, который я могу придумать, - установить атрибут в более широкой области, например:session
или жеcontext
вместоrenderRequest
, Но мне этот атрибут нигде не понадобится. Так что я не думаю, что это будет уместно.
Любые входы?
Обновление 2:
Только сейчас я использовал:
actionResponse.setPortletMode(PortletMode.VIEW);
на месте:
actionResponse.setRenderParameter("jspPage", jspPage);
И это сработало, как сейчас проходитdoView()
метод. Просто хотел спросить, это правильный путь? В чем разница между двумя методами, когда мы устанавливаем параметр рендеринга для одной и той же страницы JSP, гдеdoView
методы перенаправляют?
Мой нынешний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);
}