小编典典

在portlet中设置SearchContainer以使用EL和JSTL在JSP中使用它

jsp

我试图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。而且我不知道在portlet中在该问题的答案中所写的以下行应该写在哪里:

SearchContainer<Book> searchContainer = new SearchContainer<Book>(renderRequest, renderResponse.createRenderURL(), null, "there are no books");

In不能在我的portlet动作中编写它,因为我的动作中的参数是ActionRequestand
ActionResponse,它没有定义method 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添加a时,它就会在我触发addCourse操作的同一页面上的搜索容器中呈现。

是的,我的portlet扩展了MVCPortlet


更新

好的,我弄清楚了一部分。

  • 第一次加载portlet时,我可以doView在portlet中覆盖该方法,然后SearchContainerrenderRequest其中添加,因为我可以在中访问它doView
  • 但是同样,当我继续editCourse()操作时,我正在执行response.setRenderParameter(),以将其发送到另一个jsp页面。在该JSP页面中,我正在执行updateCourse()操作。
  • 现在,从updateCourse()动作开始,我再次response.setRenderParameter()用于将其发送到原始的JSP页面,在这里使用 Search Container 。但是现在,由于它没有通过doView()方法,因此无法创建SearchContainer并将其添加到请求中。

那么,这里有什么解决方法吗?如何确保我renderRequestdoView方法中设置的属性在方法中可用updateCourse?我知道这听起来不切实际,因为这完全是一个新的要求,但是还有其他方法吗?

我可以想到的一种解决方法是在更大的范围内设置属性,例如sessioncontext代替renderRequest。但是,在其他任何地方都不需要该属性。因此,我认为这不合适。

有输入吗?


更新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);
}

阅读 238

收藏
2020-06-08

共1个答案

小编典典

将评论转换为答案:

  1. 每当您呈现portlet时,它都是通过doView方法呈现的,而不是直接通过action方法呈现的,这是portlet生命周期的一部分。
  2. doView中的结果和总计设置为renderRequest.setAttribute(“ searchResults”,course)和renderRequest.setAttribute(“ searchTotal”,total)将在view.jsp中以$ {searchResults}和$ {searchTotal}的形式提供。
  3. 每次您执行任何操作时,之后都会调用doView,并且将再次设置searchResults和searchTotal并将其显示出来。
  4. 或者,您也可以searchContainer按照问题中链接的答案中的说明,仅在doView方法本身中进行设置。
2020-06-08