2013-07-29 23 views
6

我正在尝试在我的liferay应用程序中使用SearchContainer。目前,我必须使用JSP Scriplets来设置结果<liferay-ui:search-container-results>标记。这是目前为止的片段:将Portlet中的SearchContainer设置为在使用EL和JSTL的JSP中使用它

<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。 I found one post关于同一问题,但是这是使用Spring MVC。而且我不知道在哪里写下面的线作为这个问题的答案给出,门户:

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

在不能把它写在我的门户作用,为我的行为参数为ActionRequestActionResponse,它没有定义方法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


UPDATE

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

  • 首次加载portlet的时候,我可以重写doView方法在我的portlet,然后在renderRequest添加SearchContainer那里,因为我已经在doView访问它。
  • 但是,当我继续执行editCourse()动作时,我在做一个response.setRenderParameter(),将它发送到另一个jsp页面。在那个JSP页面中,我发起了一个updateCourse()操作。
  • 现在,从updateCourse()的操作中,我再次使用response.setRenderParameter()将其发送到原始JSP页面,在那里我使用的是搜索容器。但现在,由于它不通过doView()方法,我无法创建SearchContainer并将其添加到请求中。

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

我能想到的一种解决方法是在较大范围内设置属性,如sessioncontext而不是renderRequest。但是,我不会在其他地方需要这个属性。所以,我认为这不合适。

任何输入?


更新2

刚才,我用:

actionResponse.setPortletMode(PortletMode.VIEW); 

代替:

actionResponse.setRenderParameter("jspPage", jspPage); 

和它的工作,因为它现在经过doView()方法。只是想问,这是适当的方式吗?当我们将渲染参数设置为相同的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); 
} 
+0

你不能在request属性中设置'results'&'total'并将它发送给jsp吗?此外,每次操作方法作为portlet生命周期的一部分完成时,都会调用doView方法。 –

+0

我不需要将'searchContainer'属性设置为''liferay-ui:search-container'中的'searchContainer'属性值吗?或者我猜这个属性根本不需要。但是我看到它在某些地方被使用。 –

+0

所以,我不需要添加最后两个调用中的任何一个。 'setPortletMode'是一个隐含的,这是我应该做的吗? –

回答

3

转换comments回答:

  1. 每当你呈现Portlet它是通过doView方法通过动作呈现,而不是直接方法作为portlet生命周期的一部分。
  2. doView中的结果和总设置为renderRequest.setAttribute(“searchResults”,courses)和renderRequest.setAttribute(“searchTotal”,total)将在view.jsp中作为$ {searchResults}和$ {searchTotal} 。
  3. 每次执行任何操作后,doView都会被调用,searchResults和searchTotal将被重新设置并显示。
  4. 或者您可以在doView方法本身中设置searchContainer,如您在问题中链接的answer中所述。
+0

感谢@PrakashK的答案。现在清除它。 :) –