posts - 27,  comments - 14,  trackbacks - 0

          Liferay中,列表通常是使用SearchContainer來實現(xiàn)的,如BBS的欄目列表等。在Liferay的源代碼中,JSP夾雜了大量的本應(yīng)在Action中實現(xiàn)的代碼,因此導(dǎo)致很難看懂。我嘗試寫一個Portlet,結(jié)果就在JSP處耗費了很長時間。

          在此簡單總結(jié)一下SearchContainer的用法,內(nèi)容有些不恰當(dāng)。具體可參考message_boards/view.jsp中的代碼。

          1.1 概述

          作為一個條目的列表,應(yīng)該包括幾個方面的內(nèi)容:

          l         Table的標(biāo)題行

          l         Table的內(nèi)容

          l         每一個條目允許的操作

          l         分頁

          1.2 Table的標(biāo)題行(不同的liferay版本可能有所不同,但實質(zhì)是一樣的)

          標(biāo)題行相對比較簡單,核心代碼如下:

          List headerNames = new ArrayList();

          headerNames.add("news.column");

          headerNames.add("news.columndescript");

          headerNames.add("news.childcolumns");

          headerNames.add(StringPool.BLANK);

          其中注意兩點:

          1、  每個標(biāo)題,應(yīng)該是i18n的資源,需要在資源文件language.properties中添加內(nèi)容。

          2、  最后一行,是用來顯示可能的操作按鈕的,不需要標(biāo)題行。

          1.3 創(chuàng)建SearchContainer

          根據(jù)這個headerNames來創(chuàng)建SearchContainer

          首先需要生成一個PortletURL對象,并包括必要的參數(shù)

          PortletURL portletURL = res.createRenderURL();

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

          portletURL.setParameter("columnId", columnId);

          如果頁面是分為多個Tab的,還需要將Tab也添加進去。

          然后就可以創(chuàng)建SearchContainer

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

          SearchContainer.DEFAULT_DELTA, portletURL,headerNames, null);

          檢查源代碼,SearchContainer函數(shù)的定義為

          SearchContainer(
          RenderRequest req,         //javax.portlet.RenderRequest
          DisplayTerms displayTerms,
             //具體意義還不是很清楚,一般設(shè)置為null
          DisplayTerms searchTerms,     //具體意義還不是很清楚,一般設(shè)置為null
          String curParam,    //當(dāng)前操作的列表,如果某個JSP頁面中有兩個列表需要分頁,則此參數(shù)可以分別設(shè)置為“cur1”和“cur2”,暫時沒發(fā)現(xiàn)有什么影響
          int delta,
                //設(shè)置每頁顯示的記錄數(shù),默認(rèn)的是20,可以修改此設(shè)置
          PortletURL iteratorURL,    //設(shè)置被循環(huán)的每條記錄的操作URL
          List headerNames,
             //設(shè)置表頭信息
          String emptyResultsMessage   //當(dāng)查詢結(jié)果為空時,即數(shù)據(jù)庫中無數(shù)據(jù)供列表顯示時所顯示的內(nèi)容,如果設(shè)置為null,則列表表頭也不顯示出來,也可以設(shè)置為“暫無數(shù)據(jù)”等
          )

          這一步同創(chuàng)建headerNames應(yīng)該是可以互換的,用searchContainer.setHeaderNames()即可。

          1.4 Table的內(nèi)容

          主要由幾個小步驟完成

          1.4.1 設(shè)置總條數(shù)
          searchContainer.setTotal(total);

          1.4.2 直接設(shè)置查詢結(jié)果
          searchContainer.setResults(results)

          變量是一個List,其中的每一個對象將會被用到下一個設(shè)置可執(zhí)行操作的JSP中。

          1.4.3 設(shè)置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);

                 // 設(shè)置URL

                 PortletURL rowURL = res.createRenderURL();

                 rowURL.setWindowState(WindowState.MAXIMIZED);

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

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

                 // 設(shè)置每一列的顯示內(nèi)容

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

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

                 row.addText(childCount), rowURL);

                 // 設(shè)置每一個條目的可用操作

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

          resultRows.add(row);

          }

          1.5 每一個條目允許的操作

          通過row.addJSP("right", SearchEntry.DEFAULT_VALIGN, "column_action.jsp")來調(diào)用JSP顯示相應(yīng)的操作。

          JSP中,通過下面的語句能夠獲取當(dāng)前條目的 model 對象

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

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

          拿到model之后,通過<c:if test="<%= MBCategoryPermission.contains 方式判斷權(quán)限,如果允許操作,則首先生成相應(yīng)的portletURL,然后顯示icon圖標(biāo)。

          <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的權(quán)限機制。

          1.6 顯示table和分頁

          顯示table很簡單,在JSP

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

          SearchContainer自身支持分頁。以下幾步

          l         創(chuàng)建SearchContainer時設(shè)置每頁顯示的條數(shù)

          構(gòu)造函數(shù)SearchContainer的第四個參數(shù)int delta就是每頁顯示的條數(shù),缺省使用SearchContainer.DEFAULT_DELTA,表示每頁顯示20條。我們可以用其他任何我們喜歡的數(shù)值。

          l         從邏輯層取數(shù)據(jù)時提供beginend參數(shù)

          searchContainer.getStart() searchContainer.getEnd()

          l         顯示分頁信息

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

          注意:如果因為URL缺其他參數(shù)設(shè)置而導(dǎo)致分頁后的頁面不能正常顯示,則可以在    
          <liferay-ui:search-iterator searchContainer="<%= searchContainer %>" />
          <liferay-ui:search-paginator searchContainer="<%= searchContainer %>" />標(biāo)簽之間定義URL,并將需要的參數(shù)設(shè)置進去;
          例如:
              <liferay-ui:search-iterator searchContainer="<%= searchContainer %>" />
              <%
                  //解決分頁時點擊下一頁或是最后一頁時顯示的問題
               PortletURL pUrl=renderResponse.createRenderURL();
                pUrl=searchContainer.getIteratorURL();
                pUrl.setParameter("curAction","viewMagazineEntry"); 
                pUrl.setParameter("magazineTitleId",String.valueOf(magazineTitle.getMagazineTitleId()));
               searchContainer.setIteratorURL(pUrl);
              %>
              <liferay-ui:search-paginator searchContainer="<%= searchContainer %>" />

          說明:分頁的那些標(biāo)簽(如:上一頁,下一頁,最后等等)只有當(dāng)列表記錄數(shù)達(dá)到或超過前面設(shè)置的每頁顯示最大記錄條數(shù)時才被顯示出來,否則隱藏。
          posted on 2007-07-11 16:39 Scott.Pan 閱讀(2797) 評論(1)  編輯  收藏 所屬分類: Liferay

          FeedBack:
          # re: SearchContainer的用法說明
          2010-04-21 14:26 | muzhi
          好!  回復(fù)  更多評論
            
          <2007年7月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 易门县| 海晏县| 凉城县| 景谷| 平顺县| 南宁市| 九龙坡区| 平阴县| 阳新县| 九台市| 宁化县| 阿图什市| 同心县| 祁东县| 江西省| 新和县| 苏州市| 岳池县| 南安市| 故城县| 桦南县| 英德市| 塔城市| 克什克腾旗| 潞西市| 崇礼县| 莱阳市| 烟台市| 凤凰县| 潮州市| 布拖县| 夹江县| 毕节市| 普兰县| 饶平县| 安庆市| 河间市| 岳普湖县| 东安县| 平潭县| 连山|