<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 27,  comments - 14,  trackbacks - 0

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

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

    1.1 概述

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

    l         Table的標(biāo)題行

    l         Table的內(nèi)容

    l         每一個(gè)條目允許的操作

    l         分頁(yè)

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

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

    List headerNames = new ArrayList();

    headerNames.add("news.column");

    headerNames.add("news.columndescript");

    headerNames.add("news.childcolumns");

    headerNames.add(StringPool.BLANK);

    其中注意兩點(diǎn):

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

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

    1.3 創(chuàng)建SearchContainer

    根據(jù)這個(gè)headerNames來(lái)創(chuàng)建SearchContainer

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

    PortletURL portletURL = res.createRenderURL();

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

    portletURL.setParameter("columnId", columnId);

    如果頁(yè)面是分為多個(gè)Tab的,還需要將Tab也添加進(jìn)去。

    然后就可以創(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)前操作的列表,如果某個(gè)JSP頁(yè)面中有兩個(gè)列表需要分頁(yè),則此參數(shù)可以分別設(shè)置為“cur1”和“cur2”,暫時(shí)沒發(fā)現(xiàn)有什么影響
    int delta,
          //設(shè)置每頁(yè)顯示的記錄數(shù),默認(rèn)的是20,可以修改此設(shè)置
    PortletURL iteratorURL,    //設(shè)置被循環(huán)的每條記錄的操作URL
    List headerNames,
       //設(shè)置表頭信息
    String emptyResultsMessage   //當(dāng)查詢結(jié)果為空時(shí),即數(shù)據(jù)庫(kù)中無(wú)數(shù)據(jù)供列表顯示時(shí)所顯示的內(nèi)容,如果設(shè)置為null,則列表表頭也不顯示出來(lái),也可以設(shè)置為“暫無(wú)數(shù)據(jù)”等
    )

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

    1.4 Table的內(nèi)容

    主要由幾個(gè)小步驟完成

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

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

    變量是一個(gè)List,其中的每一個(gè)對(duì)象將會(huì)被用到下一個(gè)設(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);

           // 生成新的一個(gè)顯示行

    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è)置每一個(gè)條目的可用操作

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

    resultRows.add(row);

    }

    1.5 每一個(gè)條目允許的操作

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

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

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

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

    拿到model之后,通過(guò)<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)限機(jī)制。

    1.6 顯示table和分頁(yè)

    顯示table很簡(jiǎn)單,在JSP

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

    SearchContainer自身支持分頁(yè)。以下幾步

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

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

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

    searchContainer.getStart() searchContainer.getEnd()

    l         顯示分頁(yè)信息

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

    注意:如果因?yàn)閁RL缺其他參數(shù)設(shè)置而導(dǎo)致分頁(yè)后的頁(yè)面不能正常顯示,則可以在    
    <liferay-ui:search-iterator searchContainer="<%= searchContainer %>" />
    <liferay-ui:search-paginator searchContainer="<%= searchContainer %>" />標(biāo)簽之間定義URL,并將需要的參數(shù)設(shè)置進(jìn)去;
    例如:
        <liferay-ui:search-iterator searchContainer="<%= searchContainer %>" />
        <%
            //解決分頁(yè)時(shí)點(diǎn)擊下一頁(yè)或是最后一頁(yè)時(shí)顯示的問(wèn)題
         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 %>" />

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

    FeedBack:
    # re: SearchContainer的用法說(shuō)明
    2010-04-21 14:26 | muzhi
    <2007年7月>
    24252627282930
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 老司机午夜在线视频免费观| baoyu777永久免费视频| 亚洲一区精品伊人久久伊人| 麻豆精品不卡国产免费看| 亚洲一本之道高清乱码| 亚洲av午夜成人片精品电影| 久久久久成人片免费观看蜜芽| 亚洲av无码久久忘忧草| 亚洲精品偷拍视频免费观看| 最近中文字幕大全中文字幕免费| 亚洲乱码日产精品一二三| 国产V亚洲V天堂无码久久久 | 亚洲神级电影国语版| 国产免费拔擦拔擦8x| 中文字幕在线观看亚洲日韩| 午夜亚洲福利在线老司机| 99视频全部免费精品全部四虎| 老司机福利在线免费观看| 亚洲第一第二第三第四第五第六| 亚洲第一区视频在线观看| 亚洲成色在线综合网站| 国产偷v国产偷v亚洲高清| 久久久亚洲精品蜜桃臀| 四虎影视在线永久免费观看| 午夜电影免费观看| 四虎影院免费在线播放| 99久久免费精品国产72精品九九 | 久久久久亚洲精品男人的天堂| 国产成人免费一区二区三区| 国产在线19禁免费观看国产| 国产高清在线精品免费软件| 国产高清免费观看| 免费欧洲美女牲交视频| 日批日出水久久亚洲精品tv| 一本久久综合亚洲鲁鲁五月天| 免费日本黄色网址| 亚洲精品无码久久不卡| 国产乱辈通伦影片在线播放亚洲 | 亚洲精品国产日韩| 亚洲日产乱码一二三区别| 亚洲AV日韩AV永久无码色欲|