我正在尝试在我的liferay应用程序中使用SearchContainer
。目前,我将使用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。我found one post关于同一问题,但那是使用Spring MVC
。而且我不知道在portlet中对于该问题的答案给出的下一行写在哪里:
SearchContainer<Book> searchContainer = new SearchContainer<Book>(renderRequest, renderResponse.createRenderURL(), null, "there are no books");
In无法在我的portlet操作中写入,因为我的操作中的参数是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
操作的同一页面上。
是的,我的portlet扩展了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()
方法。只是想问一下,这是适当的方式吗?当我们将render参数设置到同一个JSP页面时,两个方法之间有什么区别,其中doView
方法重定向?
My Current 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);
}
答案 0 :(得分:3)
将comments转换为回答:
searchContainer
,如您在问题中链接的answer中所述。