首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在portlet中设置SearchContainer,以便使用EL和JSTL在JSP中使用

在portlet中设置SearchContainer,以便使用EL和JSTL在JSP中使用
EN

Stack Overflow用户
提问于 2013-07-29 11:41:23
回答 1查看 2K关注 0票数 6

我试图在我的救生筏应用程序中使用SearchContainer。目前,我不得不使用JSP在<liferay-ui:search-container-results>标记中设置结果。这是目前为止的片段:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
SearchContainer<Book> searchContainer = new SearchContainer<Book>(renderRequest, renderResponse.createRenderURL(), null, "there are no books");

在无法将其写入portlet操作中,因为我的操作中的参数是ActionRequestActionResponse,后者不定义方法createRenderURL()。我怎么才能拿到PortletURL

我应该在哪里写上面的陈述?目前,我从返回到这个页面的地方写同样的动作。我做得对吗?下面是我从同一个页面启动的操作,正如search-container所包含的那样:

代码语言:javascript
复制
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

更新

好吧,我想出了几个部分。

  • 第一次加载portlet时,我可以在portlet中重写doView方法,然后在SearchContainer中添加renderRequest,就像在doView中访问它一样。
  • 但是,当我继续进行editCourse()操作时,我正在执行一个response.setRenderParameter(),将其发送到另一个jsp页面。在那个JSP页面中,我启动了一个updateCourse()操作。
  • 现在,从updateCourse()操作中,我再次使用response.setRenderParameter()将其发送到原始的JSP页面,在那里我使用Search。但是现在,由于它没有经过doView()方法,所以我无法创建SearchContainer并将其添加到请求中。

所以,这附近有什么工作吗?如何确保在renderRequestdoView方法中设置的属性在updateCourse方法中可用?我知道这听起来不太实际,因为这完全是一个新的要求,但是还有其他的方法吗?

我可以想到的一个解决办法是在更大的范围内设置属性,比如sessioncontext,而不是renderRequest。但是,我在其他地方不需要那个属性。所以,我不认为那是合适的。

有投入吗?

更新2

刚才,我用:

代码语言:javascript
复制
actionResponse.setPortletMode(PortletMode.VIEW);

代替:

代码语言:javascript
复制
actionResponse.setRenderParameter("jspPage", jspPage);

它起了作用,因为它现在通过doView()方法。我只想问一问,这样做合适吗?当我们将呈现参数设置为相同的JSP页面( doView方法重定向的位置)时,这两种方法有什么区别呢?

我当前的doView方法如下所示:

代码语言:javascript
复制
@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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-30 10:33:33

评论转换为应答:

  1. 每当呈现portlet时,它都是通过doView方法呈现的,而不是作为portlet生命周期的一部分直接通过操作方法呈现的。
  2. 结果和总集为renderRequest.setAttribute("searchResults“课程)和renderRequest.setAttribute("searchTotal",总计)在doView中将作为${searchResults}和${searchTotal}在view.jsp中提供。
  3. 每次执行任何操作后,都会调用doView,searchResults和searchTotal将再次设置并显示。
  4. 或者,您可以将searchContainer设置在doView方法本身中,就像您在问题中链接的回答中所解释的那样。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17923082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档