ECSIDE標籤

ECSIDE標籤之<ec:table>標籤的屬性說明與使用  html

                       

EC side是基於jsp tag的開源列表組件,能夠幫助咱們快速實現牆大的列表的jsp標籤。EC side能夠展示列表(分頁)、排序、過濾。java

工做原理很簡單:
先將要展示的列表的數據集合(Collection),放入request或者pagecontext或者session內(使用setAttribute方法.這個工做能夠在action/servlet裏完成,也能夠在jsp頁面內完成),而後頁面跳轉到使用ECSide標籤的jsp頁面,此時ECSide就能夠幫助您展示出所須要的列表。
一個簡單的流程一般是這樣的:
一、客戶端請求action/servlet。
二、action接受到請求後,調用相應的BO/dao,執行取列表數據的方法 。
三、取得數據後(一般是一個vo/map的list),將數據放入request內(使用requset.setAttribute(name,value)方法。
四、將請求forward到使用ECSide標籤的jsp頁面。
五、ECSide將展示出列表。

 

<ec:table></ec:table>中的屬性說明ajax

◆ 屬性: tableId  描述:  
設置列表的惟一標識,默認爲"ec",當一個頁面內有多個ECSIDE列表時,必須爲每一個列表指定不一樣的tableId. sql

◆ 屬性: items  描述:   設置要展示的數據對應的集合在內存中存放時使用的名字,也就是request.setAttribute("recordList", list);數據庫

◆ 屬性: var  描述:  
設置指向數據迭代中的當前記錄所對應的bean(是JavaBean)的變量的名稱session

◆ 屬性: action  描述:  
列表執行翻頁 過濾 排序等操做時所要提交的action app

◆ 屬性: insertAction  描述:  
可編輯列表時,插入數據所要提交的actionjsp

◆ 屬性: updateAction  描述:  
可編輯列表時,更新數據所要提交的actionide

◆ 屬性: deleteAction  描述:  
可編輯列表時,刪除數據所要提交的action工具

◆ 屬性: shadowRowAction  描述:  
顯示shadowRow時所要提交的action

◆ 屬性: theme  描述:  
設置列表的風格所使用的主題. 默認爲ecside.  

◆ 屬性: generateScript  描述:  
是否自動生成ECSide所需的js腳本. 可選 true/false ( 默認:true )  

◆ 屬性: useAjax  描述:  
是否使用ajax技術進行翻頁、過濾、排序等操做. 可選 true/false ( 默認:true )  

◆ 屬性: doPreload  描述:  
是否使用預讀取技術. 可選 true/false ( 默認:true )  

◆ 屬性: classic  描述:  
是否使用傳統的簡單列表. 可選 true/false ( 默認:false )  

◆ 屬性: autoIncludeParameters  描述:  
是否開啓"自動保留"特性.翻頁 過濾 排序時當前頁的表單域將以hidden input的形式被保留(傳遞到新頁面). 可選 true/false ( 默認:true )  關於此項的更多說明可參見原版ec手冊 

◆ 屬性: includeParameters  描述:  
在關閉"自動保留"時,但願被自動保留的表單域的標示,支持多個,用","分割 

◆ 屬性: excludeParameters  描述:  
在開啓"自動保留"時,但願不被自動保留的表單域的標示,支持多個,用","分割  補充:  若是理解了 autoIncludeParameters 的用處 就不難理解以上兩個屬性的用處了  注意: excludeParameters 比 includeParameters 有更高的優先級  即 excludeParameters="a" includeParameters ="a" 時 a仍然將被排除,建議儘可能使用 excludeParameters 不要使用 includeParameters ,除非你很是明確本身要包含的東西。  includeParameters 使用不當會使你忘記包含一些必須包含的東西.  excludeParameters="表單屬性名稱1,表單屬性名稱2" (表單屬性名稱不能含有半角的逗號)  includeParameters="表單屬性名稱3,表單屬性名稱4"  

◆ 屬性: toolbarContent  描述:  
設置工具條要顯示的內容,以及各個元素的先後位置.  默認狀態是 toolbarContent="navigation|pagejump |pagesize|refresh save add del|export|extend|status"  
例子 toolbarContent="pagejump|navigation|export|extend|status"  此時 工具條將不顯示"頁面行數調整"框和"刷新 保存 增刪按鈕" 同時順序也會和默認的發生變化navigation 導航條  pagejump 頁面跳轉  pagesize 頁面行數設置  refresh 刷新當前頁  save 保存列表記錄  add 添加記錄  del 刪除記錄  export 導出按鈕區  extend 自定義擴展區  status 數據信息區  

◆ 屬性: toolbarLocation  描述:  
設置工具條要顯示的位置(列表的上面仍是下面). 可選top/bottom/none, 默認top.  

◆ 屬性: paginationLocation  描述:  
同toolbarLocation.  
◆ 屬性: rowsDisplayed  描述:  
設置每頁顯示的默認記錄條數.  

◆ 屬性: pageSizeList  描述:  
設置調整"每頁記錄數"的下拉框內的候選值.  例如: pageSizeList="10,20,50,100,1000,2000,all"  其中的all爲增長所有顯示功能。  例子 pageSizeList="10,20,50"  
此時列表裏將只顯示 10 20 50供選擇  max:數字 特性 :  pageSizeList="max:200,10,15,30,50,100,all"  若是 10--100以及all中,某一項大過了max的200則 不在列表中顯示。  
也能夠只使用pageSizeList="max:200" 此時將 使用默認設置,並用max限制。  

◆ 屬性: nearPageNum  描述:  
設置"鄰近頁導航"的先後區間範圍  

◆ 屬性: maxRowsExported  描述:  
設置導出和打印操做所容許的最大記錄條數  

◆ 屬性: resizeColWidth  描述:  
是否容許調整列寬. 可選 true/false ( 默認:true )  

◆ 屬性: minColWidth  描述:  
設置調整列寬時,任意一列所容許的最小寬度  

◆ 屬性: height  描述:  
設置列表的高度.  

◆ 屬性: minHeight  描述: 

設置列表的最小高度  

◆ 屬性: xlsFileName  描述:  
設置導出xls的文件的文件名. 不指定時爲不容許導出xls文件  

◆ 屬性: pdfFileName  描述:  
設置導出pdf的文件的文件名. 不指定時爲不容許導出pdf文件  

◆ 屬性: csvFileName  描述:  
設置導出csv的文件的文件名. 不指定時爲不容許導出csv文件  

◆ 屬性: showPrint  描述:  
是否顯示打印按鈕. true/false.

◆ 屬性: editable  描述:  
是否開啓可編輯列表功能.  

◆ 屬性: sortable  描述:  
是否容許對列表進行按列排序  

◆ 屬性: filterable  描述:  
是否開啓過濾功能.  

◆ 屬性: title  描述:  
設置列表的標題,該標題將顯示在列表的上方.  

◆ 屬性: showTitle  描述:  
是否顯示列表的title.  

◆ 屬性: style  描述:  
設置列表的table的style,至關於html裏的style.

◆ 屬性: styleClass  描述:  
設置列表的table的style class,至關於html裏的class.  

◆ 屬性: locale  描述:  
設置列表的本地化信息. 例如 fr_FR 將使列表使用法文方式顯示(前提是已經正確提供相關資源文件).  
◆ 屬性: interceptor  描述:  
自定義列表攔截器.值爲對應的攔截器的實現.  該攔截器可用來添加或修改列表的屬性  

◆ 屬性: retrieveRowsCallback  描述:  

指定列表所使用的分頁機制.值能夠是自定義的完整的callback類名,也能夠是在properties文件內指定的簡稱  
◆ 屬性: filterRowsCallback  描述:  
指定列表所使用的過濾機制.值能夠是自定義的完整的callback類名,也能夠是在properties文件內指定的簡稱  
◆ 屬性: sortRowsCallback  描述:  
指定列表所使用的排序機制.值能夠是自定義的完整的callback類名,也能夠是在properties文件內指定的簡稱  關於以上三個屬性的使用請見"ECSide列表的RowsCallback機制"文檔.  

◆ 屬性: width  描述:  
指定列表的寬度.至關於<table>的width屬性  

◆ 屬性: listWidth  描述:  
Specify the location of pagination bar . Acceptable values are up or down. 

◆ 屬性: listHeight  描述:  
Specify the location of pagination bar . Acceptable values are up or down.  

◆ 屬性: height  描述:  
指定列表的高度.至關於<table>的height屬性.當值爲"auto"時,列表高度將隨着列表內容自動調整.  只有在非classic模式下才有效.  

◆ 屬性: excludeTool  描述:  
Specify whether or not to show the rows displayed bar . Acceptable values are "true" or "false".  


◆ 屬性: showHeader  描述:  
是否顯示列表表頭

 


<ec:row></ec:row>中的屬性說明

◆ 屬性: rowId  描述:  
列表的行的id,對應<tr>的id屬性.  

◆ 屬性: recordKey  描述:  
行所對應的記錄的惟一主鍵值,主要用於gird列表的刪改  

◆ 屬性: highlightRow  描述:  
鼠標通過某行時,該行是否變色.  

◆ 屬性: selectlightRow  描述:  
鼠標點擊某行時,該行是否變色.  

◆ 屬性: interceptor  描述:  
自定義行攔截器.值爲對應的攔截器的實現.  該攔截器可用來添加或修改行的屬性  

◆ 屬性: ondblclick  描述:  
定義鼠標雙擊事件.至關於<tr>的ondblclick事件  

◆ 屬性: onclick  描述:  
定義鼠標的單擊事件.至關於<tr>的onclick事件  

◆ 屬性: onmouseout  描述:  
定義鼠標的onmouseout事件.至關於<tr>的onmouseout事件  

◆ 屬性: onmouseover  描述:  
定義鼠標的onmouseover事件.至關於<tr>的onmouseover事件  

◆ 屬性: style  描述:  
至關於<tr>的style.  

◆ 屬性: styleClass  描述:  
至關於<tr>的class.  <ec:extend>標籤 具體的內容能夠是任何合法的HTML代碼  

◆ 屬性: location  描述:  
在什麼位置添加擴展內容.  top: 列表上方(在列表外部)  bottom: 列表下方(在列表外部)  留空: 工具條的 extend擴展區<ec:extendrow>標籤  擴展一行.具體的內容能夠是任何合法的<tr>相關的HTML代碼  

◆ 屬性: location  描述:  
在什麼位置添加擴展內容.  bottom: 列表內部的下方,和列表內容主體在一個<table>內  留空: 同上

 

<ec: column></ec: column >中的屬性  
◆ 屬性: columnId  描述:  
單元格的id,至關於<td>的id屬性  

◆ 屬性: title  描述:  
列在列表表頭裏顯示的名稱.  

◆ 屬性: property  描述:  
指定該列所對應的列表bean<是JavaBean>(map)的屬性(key).  

◆ 屬性: alias  描述:  

列的別名.  

◆ 屬性: value  描述:  
列的數值.默認爲當前行當前列對應的列表bean<仍是JavaBean>(map)的屬性的值.  

◆ 屬性: viewsAllowed  描述:  
指定當前列將在那些視圖中被顯示,可選項爲:html xls csv pdf print  分別對應於頁面展示,導出,打印 

 ◆ 屬性: viewsDenied  描述:  
指定當前列將在那些視圖中被隱藏,可選項爲:html xls csv pdf print  分別對應於頁面展示,導出,打印  

◆ 屬性: tipTitle  描述:  
單元格的提示信息,,至關於<td>的title屬性  

◆ 屬性: group  描述:  
是否對當前列進行編組. true/false.  

◆ 屬性: resizeColWidth  描述:  
是否容許調整該列的列寬  table爲classic時無效  

◆ 屬性: minWidth  描述:  
容許調整列寬時,該列所容許的最小寬度,單位像素.  

◆ 屬性: sortable  描述:  
是否容許對該列進行排序.  

◆ 屬性: filterable  描述:  
是否容許對該列進行過濾操做.

 ◆ 屬性: editable  描述:  
單元格是否容許編輯.  

◆ 屬性: cellValue  描述:  
單元格對應的值,詳見"ECSide可編輯列表的使用指南"  

◆ 屬性: editTemplate  描述:  
編輯時,所使用的模板名稱,詳見"ECSide可編輯列表的使用指南"  

◆ 屬性: editEvent  描述:  
進入編輯轉檯所使用的頁面事件,默認爲雙擊,詳見"ECSide可編輯列表的使用指南"  

◆ 屬性: mappingItem  描述:  
實現單元格的值,與顯示的內容的映射.mappingItem的值爲進行映射所使用的map在內存中存放的名稱  

◆ 屬性: calc  描述:  
指定列所使用的統計方式.值能夠是自定義的完整的calc類名,也能夠是在properties文件內指定的簡稱,多個之間用","分割.  自帶的統計有兩種total(求和)與average(求平均值).  

◆ 屬性: calcTitle  描述:  
指定列所使用的統計方式所對應的統計名稱,例如合計,平均等等.多個之間用","分割.  

◆ 屬性: calcSpan  描述:  
統計行的統計名稱單元格所佔用的列數.至關於<td>的colspan屬性  

◆ 屬性: cell  描述:  
指定列表內該列所使用的cell的實現類.值能夠是自定義的完整的cell類名,也能夠是在properties文件內指定的簡稱  

◆ 屬性: interceptor  描述:  
自定義列攔截器.值爲對應的攔截器的實現.  該攔截器可用來添加或修改列的屬性  

◆ 屬性: escapeAutoFormat  描述:  
是否不進行自動格式的轉換. 

◆ 屬性: format  描述:  
The format to use for the cell. For instance if used with a date cell then the format can be MM/dd/yyyy.  

◆ 屬性: parse  描述:  
Used if the format needs to be interpreted. For instance, a date needs to be parsed in the specific format, such as MM-dd-yyyy.  

◆ 屬性: ondblclick  描述:  
定義鼠標雙擊事件.至關於<td>的ondblclick事件  

◆ 屬性: onclick  描述:  
定義鼠標的單擊事件.至關於<td>的onclick事件  

◆ 屬性: onmouseout  描述:  
定義鼠標的onmouseout事件.至關於<td>的onmouseout事件  

◆ 屬性: onmouseover  描述:  
定義鼠標的onmouseover事件.至關於<td>的onmouseover事件  

◆ 屬性: style  描述:  
至關於<td>的style.  

◆ 屬性: styleClass  描述:  
至關於<td>的class.  

◆ 屬性: width  描述:  
設置列的寬度.至關於<td>的width屬性  

◆ 屬性: nowrap  描述:  
設置列的寬度.至關於<td>的nowrap屬性

 

 

 

 

 
首先ecside展示列表、排序、過濾(該三種操做如下簡稱爲 RSF )的實現原理徹底和原版EC同樣, 
若是您對原版EC的retrieveRowsCallback、sortRowsCallback、filterRowsCallback 很是熟悉,那麼能夠忽略此文. 

先來簡單介紹一下RSF操做方式. 
ecside對數據的展示操做有三種:分頁展示,按列排序(目前只支持單列),按列過濾(支持多列聯合過濾) 
(該三種操做如下簡稱爲 RSF ) 

ecside提供了兩種方式來實現RSF操做 : 基於java collection層 和 基於數據庫層,下面先簡單介紹一下原理: 

========================================================= 
一:基於java collection層: 
這是ec的默認實現方式, 最簡單易用. 

您要作的就是將整個列表所要展示的所有數據放入collection 內,並交給EC來處理. 
其中RSF操做,所有由EC在內存中完成,因爲您已經將所有數據放入了collection中, 
因此排序 過濾都是基於所有數據的. 

您要在DAO中作的就是一個 查詢操做,SQL語句中不須要加入 關於排序 分頁 過濾的代碼. 

這種方式的優勢很是明顯:實現簡單. 

缺點一樣明顯,並且在很大程度上是致命的: 數據量大的時候速度慢,並且極可能outofmemery. 

這時候咱們就須要第二種方式了: 

方式一您所要作的工做: 
1 經過DAO,查詢出全部的數據,放入collection內 
2 將collection傳給列表頁面 



二:基於數據庫層: 

在這種方式下,EC的角色發生了一點點變化. 
此時,EC負責把 collection 裏的內容展示出來, 同時會向您提供RSF相關的參數. 
而這些參數須要您本身手動取得 並傳入到DAO中(固然EC提供了不少方便的方法來幫助您取得這些參數), 
具體功能的實現須要您本身在DAO中組織相應的SQL語句. 

方式二您所要作的工做: 
1 查詢出全部的數據的總數 
2 取得一個ECSide提供的Limit對象 
3 在該對象的幫助下取得RSF操做的相關信息(如 數據的起止行數,排序的列和順序,過濾的列和內容) 
4 將RSF操做的相關信息傳入DAO內,來進行SQL語句的拼裝(或者其餘的操做,如使用ORM工具時)
5 經過DAO,查詢出當前頁所要顯示的數據,放入collection內 
6 將collection傳給列表頁面 


這種方式的優缺點正好和方式一相反. 

關於兩種方式的配置能夠看一下 ecside.properties 文件中的下列內容 


Java代碼   收藏代碼
  1. table.filterRowsCallback.process=org.extremecomponents.table.callback.ProcessRowsCallback     
  2. table.filterRowsCallback.limit=org.extremecomponents.table.callback.LimitCallback     
  3.     
  4. table.sortRowsCallback.process=org.extremecomponents.table.callback.ProcessRowsCallback     
  5. table.sortRowsCallback.limit=org.extremecomponents.table.callback.LimitCallback     
  6.     
  7. table.retrieveRowsCallback.process=org.extremecomponents.table.callback.ProcessRowsCallback     
  8. table.retrieveRowsCallback.limit=org.extremecomponents.table.callback.LimitCallback     


其中 ProcessRowsCallback 採用了方式一 ,LimitCallback採用了方式二 
而table.retrieveRowsCallback.default會告訴EC您默認使用的是哪一個. 
一樣您也能夠在 ec:table 標籤裏 指定 

Java代碼   收藏代碼
  1. <ec:table filterRowsCallback="process/limit"  sortRowsCallback="process/limit"  retrieveRowsCallback="process/limit" ... >     


你們可能還看到了 org.ecside.table.callback.CommonLimitCallback 這個是我本身隨意組合出來的一個rowcallback 
他在執行分頁的時候,使用了方式二,而排序 過濾的時候使用了方式一 
因此,你們可能會發現,DEMO中的排序 過濾方法只對當前頁有效. 
我這麼作實際上是一種偷懶的方式,但多數狀況下,正如網友所說"只排當頁數據毫無心義",您們說的沒錯,的確如此:) 


========================================== 
下面看一個簡單的例子: (以 struts + dao 的方式演示,例子中採用的是ECSide 2.0 RC1版本) 

jsp代碼 
Java代碼   收藏代碼
  1. <ec:table   
  2. retrieveRowsCallback="limit"   
  3. sortRowsCallback="limit"   
  4. filterRowsCallback="limit"   
  5. ...... >  
  6. ......  
  7. </ec:table>  


在上面的JSP代碼中,指定了全部的RSF操做都使用基於數據庫層的. 

action的代碼 
Java代碼   收藏代碼
//默認每頁顯示的記錄條數  
    protected static int DEFAULT_PAGE_SIZE = 20;  
  
      
// 數據庫端分頁,適合數據量較大的狀況  
    public ActionForward doQuery(ActionMapping mapping, ActionForm form,  
    HttpServletRequest request, HttpServletResponse response)  
    throws Exception {  
        UserInfoDAO userInfoDAO=(UserInfoDAO)getBean("userInfoDAO");  
      
// 當列表的分頁 過濾 排序等操做是基於數據庫時,必需要用到Limit對象.  
// 注意,當頁面有多個ec的時候,須要使用帶 tableId參數的同名方法.  
    //Limit limit=RequestUtils.getLimit(request,"ecGird的Id");  
                  
        Limit limit=RequestUtils.getLimit(request);  
// 基於數據庫的排序.  
// ECSide會幫助開發人員取得排序的相關信息:當前是按哪一個(目前只支持單列排序)column排序的,以及排序的方式desc或asc,  
// 這個信息以key-value方式存放在map裏.  
// 可是至於若是處理這些信息(如組裝成sql語句),則是由開發人員本身在DAO裏完成的.  
        Sort sort=limit.getSort();  
        Map sortValueMap = sort.getSortValueMap();  
                  
// 基於數據庫過濾.  
// ECSide會幫助開發人員取得過濾的相關信息:當前是對哪些column進行過濾,以及過濾的內容是什麼,這個信息以key-value方式存放在map裏.  
// 可是至於若是處理這些信息(如組裝成sql語句),則是由開發人員本身在DAO裏完成的.  
        FilterSet filterSet =limit.getFilterSet();  
        Map filterPropertyMap=filterSet.getPropertyValueMap();  
                  
// 在本例中, sort 和 filter 相關信息將被傳入 DAO,用於拼裝sql語句.  
// 其實,此時的排序 過濾就和咱們之前的傳統的查詢很是相似:從查詢頁面取得查詢條件,傳入DAO.                 
                  
  
// RequestUtils.getTotalRowsFromRequest(request);是一個工具類,用來從ECSIDE的列表中取得上次計算出的總行數  
// 若是您不但願每次翻頁都從新計算總行數,那麼建議參考下面幾行代碼的作法.    
  
        int totalRows = RequestUtils.getTotalRowsFromRequest(request);  
        if (totalRows < 0) {  
// TODO :  userInfoDAO.getUserInfoNumber()爲可以取得總行數的方法,請替換爲實際的實現。  
// 取得記錄總條數時,不要忘了把filter做爲參數傳入,由於要取得的總行數也是要接受條件限制的.  
            totalRows = userInfoDAO.getUserInfoNumber(filterPropertyMap);  
        }  
          
          
          
// DEFAULT_PAGE_SIZE ==0 時, 每頁記錄數會使用 properties文件內的默認設置  
// DEFAULT_PAGE_SIZE <0 時, 每頁記錄數會等於所有記錄數   
        limit.setRowAttributes(totalRows, DEFAULT_PAGE_SIZE);  
  
          
          
//取得當前要查詢的頁面的記錄起止行號  
// offset表示數據編號的起始號. ORACLE數據庫通常是從1開始的,HSQLDB是從0開始,默認是從0開始計數,在這裏咱們使用從0開始.  
        int offset=0;  
        int[] rowStartEnd =new int[] { limit.getRowStart() + offset, limit.getRowEnd() + offset };  
          
  
  
// TODO :  userInfoDAO.getSomeUserInfo(rowStartEnd[0], rowStartEnd[1])  
// 爲查詢記錄的方法,請替換爲實際的實現。rowStartEnd[0], rowStartEnd[1]爲起止行  
// rowStartEnd[0], rowStartEnd[1] 左閉 右開  
        List rslist = userInfoDAO.getSomeUserInfo(rowStartEnd[0], rowStartEnd[1],sortValueMap,filterPropertyMap);  
  
        request.setAttribute("recordList", rslist);  
      
// 字典數據. 一個Map,存放的是  "編號" 到 "顯示的文字" 的映射   
        request.setAttribute("GENDER_MAP", CommonDictionary.GENDER);  
        request.setAttribute("USERROLE_MAP", CommonDictionary.USERROLE);  
          
        return mapping.findForward("listPage");  
    }  
其實上面的代碼和代碼裏的註釋已經說的比較明白了. 


DAO裏的代碼 
Java代碼   收藏代碼
public List getSomeUserInfo(int startRow,int endRow,Map sortValueMap,Map filterPropertyMap){  
    StringBuffer bufSql = new StringBuffer();  
    int size=endRow-startRow;  
      
// 使用傳統JDBC時,根據不一樣條件拼裝不一樣的SQL一貫是很是惱人的事情.  
// ECSide固然不可以幫助您解決這個問題.  
// 再次重申一遍,當翻頁 過濾 排序 均基於數據庫時,ECSide只是可以幫助開發者在後臺更方便的取得操做相關的數據.  
// 而如何使用他們,仍然須要開發人員本身來決定.  
      
    bufSql.append("SELECT * FROM ");  
      
    StringBuffer whereSql = new StringBuffer(" WHERE 1=1 ");  
      
    if (filterPropertyMap!=null && !filterPropertyMap.isEmpty()){  
// 根據過濾條件進行sql語句的拼裝.  
      
// 在本例中,只有 USERROLE USERNAME GENDER 是能夠進行過濾的.  
// 在這裏偷下懶,就不用 PreparedStatement 的方式了,而是直接把過濾項拼裝進sql語句內.  
        String filterProperty;  
        String filterValue;  
          
        filterProperty="USERROLE";  
        filterValue=(String)filterPropertyMap.get(filterProperty);  
        if (filterValue!=null){  
            whereSql.append(" AND ").append(filterProperty).append(" = '").append(StringEscapeUtils.escapeSql(filterValue)).append("' ");  
        }  
  
        filterProperty="USERNAME";  
        filterValue=(String)filterPropertyMap.get(filterProperty);  
        if (filterValue!=null){  
            whereSql.append(" AND ").append(filterProperty).append(" like '").append(StringEscapeUtils.escapeSql(filterValue)).append("' ");  
        }  
          
        filterProperty="GENDER";  
        filterValue=(String)filterPropertyMap.get(filterProperty);  
        if (filterValue!=null){  
            whereSql.append(" AND ").append(filterProperty).append(" = '").append(StringEscapeUtils.escapeSql(filterValue)).append("' ");  
        }  
    }  
      
    if (sortValueMap!=null && !sortValueMap.isEmpty()){  
        bufSql.append("( SELECT * FROM USER_INFO  ");  
        bufSql.append(whereSql);  
        bufSql.append(ECSideUtils.getDefaultSortSQL(sortValueMap));  
        bufSql.append(" ) ");   
    }else{  
        bufSql.append(" USER_INFO ");  
        bufSql.append(whereSql);  
    }  
      
    bufSql.append(" LIMIT ? OFFSET ?");  
      
      
    Connection conn=null;  
    PreparedStatement pstmt = null;  
    ResultSet rest = null;  
    List userList=null;  
      
    try {  
        conn = getConnection();  
        pstmt = ConnectionUtils.prepareStatement(conn,bufSql.toString());  
        int prarameterIndex=0;  
          
        pstmt.setInt(++prarameterIndex, size);  
        pstmt.setInt(++prarameterIndex, startRow);  
          
        rest = pstmt.executeQuery();  
        String[] columnName=getColumnName(rest);  
        userList=new ArrayList();  
        Map userInfo=null;  
        while (rest.next()) {  
            userInfo=new HashMap();  
            buildRecord(rest,columnName,userInfo);  
            userList.add(userInfo);  
        }  
    } catch (Exception e) {  
        LogHandler.errorLog(logger, e);  
        userList=null;  
    }finally{  
        close(rest, pstmt, conn);  
    }  
      
    return userList;  
}  
這個DAO一樣沒什麼好說的了 很是好理解.  以上就是一個簡單的實現,最有參考價值的就是ACTION的寫法.
相關文章
相關標籤/搜索