我试图SearchContainer在我的liferay应用程序中使用。当前,我必须使用JSP Scriplets 在标签中设置 结果<liferay-ui:search-container-results>。到目前为止,这是片段:
SearchContainer
<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。而且我不知道在portlet中在该问题的答案中所写的以下行应该写在哪里:
Spring MVC
SearchContainer<Book> searchContainer = new SearchContainer<Book>(renderRequest, renderResponse.createRenderURL(), null, "there are no books");
In不能在我的portlet动作中编写它,因为我的动作中的参数是ActionRequestand ActionResponse,它没有定义method createRenderURL()。我将如何获得PortletURL?
ActionRequest
ActionResponse
createRenderURL()
PortletURL
我应该在哪里写上述声明?目前,我正在从返回此页面的位置开始执行相同的操作。我做对了吗?这是我从同一页面触发的操作,如下所示search- container:
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添加a时,它就会在我触发addCourse操作的同一页面上的搜索容器中呈现。
Course
addCourse
是的,我的portlet扩展了MVCPortlet。
MVCPortlet
更新 :
好的,我弄清楚了一部分。
doView
renderRequest
editCourse()
response.setRenderParameter()
updateCourse()
doView()
那么,这里有什么解决方法吗?如何确保我renderRequest在doView方法中设置的属性在方法中可用updateCourse?我知道这听起来不切实际,因为这完全是一个新的要求,但是还有其他方法吗?
updateCourse
我可以想到的一种解决方法是在更大的范围内设置属性,例如session或context代替renderRequest。但是,在其他任何地方都不需要该属性。因此,我认为这不合适。
session
context
有输入吗?
更新2 :
刚才,我使用了:
actionResponse.setPortletMode(PortletMode.VIEW);
代替:
actionResponse.setRenderParameter("jspPage", jspPage);
而且它成功了,因为现在它通过了doView()方法。只是想问一下,这是否合适?当我们将render参数设置为相同的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); }
将评论转换为答案:
searchContainer