Liferay中SearchContainer的用法

本文介绍Liferay中使用SearchContainer实现列表的方法,包括表头、内容、操作及分页等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Liferay中SearchContainer的用法

Liferay中,列表通常是使用SearchContainer来实现的,如BBS的栏目列表等。在Liferay的源代码中,JSP夹杂了大量的本应在Action中实现的代码,因此导致很难看懂。我尝试写一个Portlet,结果就在JSP处耗费了很长时间。

在此简单总结一下SearchContainer的用法,边写代码先写文档,内容有些不恰当。具体可参考message_boards/view.jsp中的代码。

1.1 概述

作为一个条目的列表,应该包括几个方面的内容:

l         Table的标题行

l         Table的内容

l         每一个条目允许的操作

l         分页

1.2 Table的标题行

标题行相对比较简单,核心代码如下:

List headerNames = new ArrayList();

headerNames.add("news.column");

headerNames.add("news.columndescript");

headerNames.add("news.childcolumns");

headerNames.add(StringPool.BLANK);

其中注意两点:

1、  每个标题,应该是i18n的资源,需要在资源文件中添加内容。

2、  最后一行,是用来显示可能的操作按钮的,不需要标题行。

1.3 创建SearchContainer

根据这个headerNames来创建SearchContainer

首先需要生成一个PortletURL对象,并包括必要的参数

PortletURL portletURL = res.createRenderURL();

portletURL.setParameter("struts_action", "/ext/news/columnadmin/view");

portletURL.setParameter("columnId", columnId);

如果页面是分为多个Tab的,还需要将Tab也添加进去。

然后就可以创建SearchContainer

SearchContainer searchContainer = new SearchContainer(req, null, null,"column",

SearchContainer.DEFAULT_DELTA, portletURL,headerNames, null);

检查源代码,SearchContainer函数的定义为

SearchContainer(RenderRequest req, DisplayTerms displayTerms,

DisplayTerms searchTerms, String curParam, int delta,

       PortletURL iteratorURL, List headerNames,

       String emptyResultsMessage)

这一步同创建headerNames应该是可以互换的,用searchContainer.setHeaderNames()即可。

1.4 Table的内容

主要由几个小步骤完成

1.4.1 设置总条数

searchContainer.setTotal(total);

1.4.2 直接设置查询结果

searchContainer.setResults(results)

变量是一个List,其中的每一个对象将会被用到下一个设置可执行操作的JSP中。

1.4.3 设置Table的显示条目

List resultRows = searchContainer.getResultRows();

for (int i = 0; i < results.size(); i++) {

       NewsColumn cutColumn = (NewsColumn) results.get(i);

       // 生成新的一个显示行

ResultRow row = new ResultRow(cutColumn, cutColumn.getPrimaryKey()

                                   .toString(), i);

       // 设置URL

       PortletURL rowURL = res.createRenderURL();

       rowURL.setWindowState(WindowState.MAXIMIZED);

       rowURL.setParameter("struts_action", "/ext/news/columnadmin/view");

       rowURL.setParameter("columnId", cutColumn.getColumnId());

       // 设置每一列的显示内容

       row.addText(cutColumn.getName(), rowURL);

       row.addText(cutColumn.getDescription(), rowURL);

       row.addText(childCount), rowURL);

       // 设置每一个条目的可用操作

       row.addJSP("right", SearchEntry.DEFAULT_VALIGN, "*.jsp");

      

resultRows.add(row);

}

1.5 每一个条目允许的操作

通过row.addJSP("right", SearchEntry.DEFAULT_VALIGN, "column_action.jsp")来调用JSP显示相应的操作。

JSP中,通过下面的语句能够获取当前条目的 model 对象

ResultRow row =

(ResultRow)request.getAttribute(WebKeys.SEARCH_CONTAINER_RESULT_ROW);

MBCategory category = (MBCategory)row.getObject();

拿到model之后,通过<c:if test="<%= MBCategoryPermission.contains 方式判断权限,如果允许操作,则首先生成相应的portletURL,然后显示icon图标。

<c:if test="<%= MBCategoryPermission.contains(permissionChecker, category, ActionKeys.UPDATE) %>">

       <portlet:renderURL windowState="<%= WindowState.MAXIMIZED.toString() %>" var="portletURL">

              <portlet:param name="struts_action" value="/message_boards/edit_category" />

              <portlet:param name="redirect" value="<%= currentURL %>" />

              <portlet:param name="categoryId" value="<%= category.getCategoryId() %>" />

       </portlet:renderURL>

 

       <liferay-ui:icon image="edit" url="<%= portletURL %>" />

</c:if>

这部分代码涉及到Liferay的权限机制。

1.6 显示table和分页

显示table很简单,在JSP

<liferay-ui:search-iterator searchContainer="<%= searchContainer %>" />

 

SearchContainer自身支持分页。以下几步

l         创建SearchContainer时设置每页显示的条数

构造函数SearchContainer的第四个参数int delta就是每页显示的条数,缺省使用SearchContainer.DEFAULT_DELTA,表示每页显示20条。我们可以用其他任何我们喜欢的数值。

l         从逻辑层取数据时提供beginend参数

searchContainer.getStart() searchContainer.getEnd()

l         显示分页信息

<liferay-ui:search-paginator searchContainer="<%= searchContainer %>" /> 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值