Definindo SearchContainer no portlet para usá-lo no JSP usando EL e JSTL
Estou tentando usarSearchContainer
na minha aplicação liferay. Atualmente eu tenho que usar Scrapplets JSP para definir oresultados em<liferay-ui:search-container-results>
Tag. Este é o trecho até agora:
<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>
Agora, eu gostaria de mudar esses scriplets para EL. Euencontrou um post sobre o mesmo problema, mas que está usandoSpring MVC
. E não tenho idéia de onde escrever a linha abaixo, conforme fornecido na resposta a essa pergunta, nos portlets:
SearchContainer<Book> searchContainer = new SearchContainer<Book>(renderRequest, renderResponse.createRenderURL(), null, "there are no books");
Em não posso escrevê-lo na minha ação de portlet, como o parâmetro na minha ação éActionRequest
eActionResponse
, que não define o métodocreateRenderURL()
. Como eu conseguiria oPortletURL
?
Onde devo escrever a declaração acima? Atualmente estou escrevendo na mesma ação de onde estou retornando para esta página. Eu estou fazendo a coisa certa? Aqui está a ação que estou disparando da mesma página, como osearch-container
é em:
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");
}
}
Eu quero isso, toda vez que umCourse
é adicionado, ele é renderizado no meu contêiner de pesquisa, na mesma página de onde estou disparandoaddCourse
açao.
E sim, meu portlet se estendeMVCPortlet
.
ATUALIZAR:
Ok, eu descobri uma parte.
Pela primeira vez quando o portlet é carregado, posso ignorardoView
método no meu portlet e, em seguida, adicione oSearchContainer
emrenderRequest
lá, como eu tenho acesso a ele emdoView
.Mas novamente, quando eu vou paraeditCourse()
ação, onde estou fazendo umresponse.setRenderParameter()
, para enviá-lo para outra página jsp. E nessa página JSP, eu estou disparando umupdateCourse()
açao.Agora, deupdateCourse()
ação, estou novamente usandoresponse.setRenderParameter()
para enviá-lo para a página JSP original, onde estou usandoContêiner de pesquisa. Mas agora, já que não está passandodoView()
método, eu não posso criar oSearchContainer
e adicione-o ao pedido.Então, há algum trabalho por aqui? Como se certificar de que o atributo definido emrenderRequest
emdoView
método está disponível emupdateCourse
método? Eu sei que isso não parece prático, já que é completamente um novo pedido, mas existe alguma outra maneira?
Uma solução que posso imaginar é definir o atributo em um escopo maior, comosession
oucontext
ao invés derenderRequest
. Mas não precisarei desse atributo em nenhum outro lugar. Então, não acho que seria apropriado.
Alguma entrada?
Atualização 2:
Apenas agora eu usei:
actionResponse.setPortletMode(PortletMode.VIEW);
no lugar de:
actionResponse.setRenderParameter("jspPage", jspPage);
E funcionou, como agora passadoView()
método. Só queria perguntar, este é o caminho apropriado? Qual é a diferença entre dois métodos quando estamos definindo o parâmetro de renderização para a mesma página JSP, ondedoView
métodos redireciona?
Minha correntedoView
método se parece com:
@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);
}