TableModelBean.java 這是核心業(yè)務類,既要被Action使用又要被dwr使用。
由于我注釋寫了一些,所以就不詳細介紹了
public?class?TableModelBean?{
????
????
//表格的第一列
????public?static?final?int?COLUMN_1?=?0;
????
????
//表格的第二列
????public?static?final?int?COLUMN_2?=?1;
????
????
//表格的第三列
????public?static?final?int?COLUMN_3?=?2;

????
//每一列的排序升序降序標記?true升序,false降序
????private?boolean[]?columnFlags?=?{?false,?false,?false?};
????
????
//表格分頁總頁面數
????private?int?totalPage?=?0;
????
????
//表格當前頁
????private?int?currentPage?=?0;
????
????
//表格總行數
????private?int?rowsCount?=?0;

????
//沒用
????private?String[]?pagers?=?{?""?};

????
//存放全體記錄的容器
????private?List?rows?=?new?ArrayList();

????
//存放當前記錄的容器
????private?List?currentPageRows?=?new?ArrayList();

????
//數據庫操作類
????private?static?ModelOneDAO?dao;

????
//每頁記錄數設為20
????private?static?final?int?PAGE_SIZE?=?20;

????
//初始排序行為第一行
????private?int?sortedColumn?=?1;

????
/**
?????*??構造函數
?????
*/

????
public?TableModelBean()?{
????????dao?
=?new?ModelOneDAO();
????????init();
????}


????
/**
?????*??初始化
?????
*/

????
private?void?init()?{
????????
try?{
????????????rows?
=?dao.getSortedRows(sortedColumn,?columnFlags[sortedColumn]);
????????????setRowsCount(rows.size());
????????????setTotalPage(getTotalPageByRow(rows.size(),?PAGE_SIZE));
????????????setCurrentPage(
1);
????????}
?catch?(SQLException?e)?{
????????????
//?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????}

????}


????
/**
?????*?返回當前頁的內容
?????*?@return?Returns?the?currentPage.
?????
*/

????
public?int?getCurrentPage()?{
????????
return?currentPage;
????}


????
/**
?????*?設置當前頁
?????*?@param?currentPage
?????*????????????The?currentPage?to?set.
?????
*/

????
public?void?setCurrentPage(int?currentPage)?{
????????
this.currentPage?=?currentPage;

????????currentPageRows.clear();
????????
int?firstIndex?=?PAGE_SIZE?*?(currentPage?-?1);
????????
int?lastIndex?=?(firstIndex?+?PAGE_SIZE)?<?rowsCount???firstIndex
????????????????
+?PAGE_SIZE?:?rowsCount;
????????
for?(int?i?=?firstIndex;?i?<?lastIndex;?i++)?{
????????????currentPageRows.add(rows.
get(i));
????????}

????}


????
/**
?????*?取得所有行
?????*?@return?Returns?the?rows.
?????
*/

????
public?List?getRows()?{
????????
return?rows;
????}



????
/**
?????*?取的分頁數
?????*?@return?Returns?the?totalPage.
?????
*/

????
public?int?getTotalPage()?{
????????init();
????????
return?totalPage;
????}


????
/**
?????*?設置分頁數
?????*?@param?totalPage
?????*????????????The?totalPage?to?set.
?????
*/

????
public?void?setTotalPage(int?totalPage)?{
????????
this.totalPage?=?totalPage;
????}


????
/**
?????*?取得紀錄數
?????*?@return?Returns?the?totalRows.
?????
*/

????
public?int?getRowsCount()?{
????????
return?rowsCount;
????}


????
/**
?????*????設置記錄數
?????*??@param?totalRows
?????*????????????The?totalRows?to?set.
?????
*/

????
public?void?setRowsCount(int?rowsCount)?{
????????
this.rowsCount?=?rowsCount;
????}


????
/**
?????*?取得當前頁中的記錄數
?????*?@return?Returns?the?currentPageRows.
?????
*/

????
public?List?getCurrentPageRows()?{
????????
return?currentPageRows;
????}


????
/**
?????*?取得page頁中的記錄,當page大于totalPage時返回最后頁
?????*?因為是上面的getCurrentPageRows函數的重載,所以在dwr中不能正常使用。
?????*?于是出現了getRowsByPageNo方法。
?????*?@param?page
?????*?@return?the?currentPageRows.
?????
*/

????
public?List?getCurrentPageRows(int?page)?{
????????currentPageRows.clear();
????????
int?firstIndex?=?PAGE_SIZE?*?(page?-?1);
????????
int?lastIndex?=?(firstIndex?+?PAGE_SIZE)?<?rowsCount???firstIndex
????????????????
+?PAGE_SIZE?:?rowsCount;
????????
for?(int?i?=?firstIndex;?i?<?lastIndex;?i++)?{
????????????currentPageRows.add(rows.
get(i));
????????}

????????
return?currentPageRows;
????}


????
/**
?????*?取得page頁中的記錄,當page大于totalPage時返回最后頁
?????*?@param?page
?????*?@return?包含當前頁記錄的List
?????
*/

????
public?List?getRowsByPageNo(int?page)?{
????????init();
????????page?
=?page?>?totalPage???totalPage?:?page;
????????List?result?
=?new?ArrayList();
????????
int?firstIndex?=?PAGE_SIZE?*?(page?-?1);
????????
int?lastIndex?=?(firstIndex?+?PAGE_SIZE)?<?rowsCount???firstIndex
????????????????
+?PAGE_SIZE?:?rowsCount;
????????
for?(int?i?=?firstIndex;?i?<?lastIndex;?i++)?{
????????????result.add(rows.
get(i));
????????}

????????
return?result;
????}


????
/**
?????*?按照某一列進行排序,再返回當前頁中的數據
?????*?@param?currentPage
?????*?@param?columnNo
?????*?@return?the?Rows?of?current?Page?that?sorted?by?columnNo
?????
*/

????
public?List?getCurrentPageSortedByColumnRows(int?currentPage,?int?columnNo)?{
????????init();
????????sortBy(columnNo);
????????currentPageRows.clear();
????????
int?firstIndex?=?20?*?(currentPage?-?1);
????????
int?lastIndex?=?(firstIndex?+?20)?<?rowsCount???firstIndex?+?20
????????????????:?rowsCount;
????????
for?(int?i?=?firstIndex;?i?<?lastIndex;?i++)?{
????????????currentPageRows.add(rows.
get(i));
????????}

????????
return?currentPageRows;
????}


????
/**
?????*?返回一個分頁數組。用處不太大,客戶端用Javascript也可以計算。
?????*?@return?Returns?the?pages.
?????
*/

????
public?String[]?getPagers()?{
????????pagers?
=?new?String[totalPage];
????????
for?(int?i?=?1;?i?<=?totalPage;?i++)?{
????????????pagers[i?
-?1]?=?i?+?"";
????????}

????????
return?pagers;
????}


????
/**
?????*?按照某一列進行排序
?????*?@param?columnNo
?????
*/

????
public?void?sortBy(int?columnNo)?{
????????
this.sortedColumn?=?columnNo;
????????columnFlags[columnNo]?
=?(!columnFlags[columnNo]);
????????
try?{
????????????rows?
=?dao.getSortedRows(columnNo,?columnFlags[columnNo]);
????????}
?catch?(SQLException?e)?{
????????????
//?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????}

????}


????
/**
?????*?刪除某一列,按照主鍵(第一列)
?????*?@param?key
?????*?@return
?????
*/

????
public?boolean?deleteRow(int?key)?{
????????
try?{
????????????dao.deleteRow(key);
????????}
?catch?(SQLException?e)?{
????????????e.printStackTrace();
????????????
return?false;
????????}

????????
return?true;
????}


????
/**
?????*?要新增加一個數據前先計算出Id.
?????*?這個例子只是用來演示用的,如果多人訪問會出現并發(fā)問題
?????*?@return
?????
*/

????
public?int?getNextId()?{
????????
try?{
????????????
return?dao.getNextId();
????????}
?catch?(SQLException?e)?{
????????????e.printStackTrace();
????????????
return?-1;
????????}

????}


????
/**
?????*?增加一行
?????*?@param?trb
?????*?@return
?????
*/

????
public?boolean?addRow(TableRowBean?trb)?{
????????
try?{
????????????dao.addRow(trb);
????????????
return?true;
????????}
?catch?(SQLException?e)?{
????????????e.printStackTrace();
????????????
return?false;
????????}

????}


????
/**
?????*?更改一行
?????*?@param?trb
?????*?@return
?????
*/

????
public?boolean?updateRow(TableRowBean?trb)?{
????????
try?{
????????????dao.updateRow(trb);
????????????
return?true;
????????}
?catch?(SQLException?e)?{
????????????e.printStackTrace();
????????????
return?false;
????????}

????}


????
/**
?????*?按照key取回單行信息
?????*?@param?key
?????*?@return
?????
*/

????
public?TableRowBean?getSingleRow(int?key)?{
????????TableRowBean?row;
????????
try?{
????????????row?
=?dao.getSingleRow(key);
????????}
?catch?(SQLException?e)?{
????????????row?
=?new?TableRowBean();
????????????e.printStackTrace();
????????}

????????
return?row;
????}


????
/**
?????*?輔助方法計算分頁數
?????*?@param?rowSize
?????*?@param?pageSize
?????*?@return
?????
*/

????
private?static?int?getTotalPageByRow(int?rowSize,?int?pageSize)?{
????????
int?result?=?0;
????????result?
=?rowSize?%?pageSize?==?0???rowSize?/?pageSize?:?rowSize
????????????????
/?pageSize?+?1;
????????
return?result;
????}

}
接下來就是寫配置文件了。主要的配置文件有三個web.xml struts-config.xml dwr.xml
web.xml
<?xml?version="1.0"?encoding="ISO-8859-1"?>
<!DOCTYPE?web-app?PUBLIC?"-//Sun?Microsystems,?Inc.//DTD?Web?Application?2.3//EN"
?????????????????????????"http://java.sun.com/dtd/web-app_2_3.dtd"
>
<web-app>
????
<filter>
????????
<filter-name>EncodingFilter</filter-name>
????????
<filter-class>org.mstar.strutsajax.EncodingFilter</filter-class>
????????
<init-param>
????????????????
<param-name>encoding</param-name>
????????????????
<param-value>gb2312</param-value>
????????
</init-param>
????
</filter>
????
<servlet>
????????
<servlet-name>action</servlet-name>
????????
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
????????
<init-param>
????????????
<param-name>config</param-name>
????????????
<param-value>/WEB-INF/struts-config.xml</param-value>
????????
</init-param>
????????
<load-on-startup>1</load-on-startup>
????
</servlet>
????
<servlet>
????????
<servlet-name>dwr-invoker</servlet-name>
????????
<display-name>DWR?Servlet</display-name>
????????
<description>Direct?Web?Remoter?Servlet</description>
????????
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
????????
<init-param>
????????????
<param-name>config</param-name>
????????????
<param-value>WEB-INF/dwr.xml</param-value>
????????
</init-param>
????????
<init-param>
????????????
<param-name>debug</param-name>
????????????
<param-value>true</param-value>
????????
</init-param>
????????
<load-on-startup>1</load-on-startup>
????
</servlet>
????
<servlet-mapping>
????????
<servlet-name>action</servlet-name>
????????
<url-pattern>*.do</url-pattern>
????
</servlet-mapping>
????
<servlet-mapping>
????????
<servlet-name>dwr-invoker</servlet-name>
????????
<url-pattern>/dwr/*</url-pattern>
????
</servlet-mapping>
????
<welcome-file-list>
????????
<welcome-file>index.jsp</welcome-file>
????????
<welcome-file>login.jsp</welcome-file>
????
</welcome-file-list>
????
<taglib>
????????
<taglib-uri>/WEB-INF/struts-bean</taglib-uri>
????????
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
????
</taglib>
????
<taglib>
????????
<taglib-uri>/WEB-INF/struts-logic</taglib-uri>
????????
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
????
</taglib>
????
<taglib>
????????
<taglib-uri>/WEB-INF/struts-html</taglib-uri>
????????
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
????
</taglib>
</web-app>
其中要注意這段Servlet的聲明
<servlet>
????????
<servlet-name>dwr-invoker</servlet-name>
????????
<display-name>DWR?Servlet</display-name>
????????
<description>Direct?Web?Remoter?Servlet</description>
????????
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
????????
<init-param>
????????????
<param-name>config</param-name>
????????????
<param-value>WEB-INF/dwr.xml</param-value>
????????
</init-param>
????????
<init-param>
????????????
<param-name>debug</param-name>
????????????
<param-value>true</param-value>
????????
</init-param>
????????
<load-on-startup>1</load-on-startup>
????
</servlet>
debug打開的話,你就可以看到每一個遠程調用。對開發(fā)很有用。
struts-config我就不寫了,大家對這個比較了解,要看的話,下載我的源碼,在最后面我會寫上。
重點是dwr.xml.這里是你要提供遠程接口信息
<?xml?version="1.0"?encoding="UTF-8"?>
<!DOCTYPE?dwr?PUBLIC?"-//GetAhead?Limited//DTD?Direct?Web?Remoting?1.0//EN"?"http://www.getahead.ltd.uk/dwr/dwr10.dtd">

<dwr>
????
<init>
????????
<converter?id="tablerowbean"?class="org.mstar.strutsajax.converter.TableRowConverter"/>
??????
</init>
????
<allow>
????????
<create?creator="new"?javascript="UserLogic">
????????????
<param?name="class"?value="org.mstar.strutsajax.ajax.UserLogic"/>
????????????
<include?method="validate"/>
????????
</create>
????????
<create?creator="new"?javascript="TableModel"?scope="session">
????????????
<param?name="class"?value="org.mstar.strutsajax.form.TableModelBean"/>
????????????
<include?method="sortBy"/>
????????????
<include?method="getRowsCount"/>
????????????
<include?method="getTotalPage"/>
????????????
<include?method="setCurrentPage"/>
????????????
<include?method="getCurrentPageRows"/>
????????????
<include?method="getCurrentPageSortedByColumnRows"/>
????????????
<include?method="getRowsByPageNo"/>
????????????
<include?method="deleteRow"/>
????????????
<include?method="getNextId"/>
????????????
<include?method="addRow"/>
????????????
<include?method="updateRow"/>
????????????
<include?method="getSingleRow"/>
????????
</create>
????????<convert?converter="tablerowbean"?match="org.mstar.strutsajax.form.TableRowBean"/>
????
</allow>
</dwr>
詳細配置你可以看dwr的文檔。
這里要說的就是,convert,對于你自己的類型如TableRowBean必須寫一個Converter來轉化它,我的TableRowConverter其實就是繼承與BeanConverter然后什么事情也沒做。但是我如果自己用BeanConverter就不行,不知道為什么。其他的都比較好理解。
當然我還有一個weblogic.xml,因為我是發(fā)布在weblogic上的。
<?xml?version="1.0"?encoding="UTF-8"?>
<!DOCTYPE?weblogic-web-app?PUBLIC?"-//BEA?Systems,?Inc.//DTD?Web?Application?8.1//EN"????"http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
????
<jsp-descriptor>
????????
<jsp-param>
????????????
<param-name>debug</param-name>
????????????
<param-value>true</param-value>
????????
</jsp-param>
????
</jsp-descriptor>
????
<context-root>struts-ajax</context-root>
</weblogic-web-app>
剩下了就是JSP頁面了。我再寫一篇吧。