Blog信息 |
blog名称: 日志总数:1304 评论数量:2242 留言数量:5 访问次数:7585487 建立时间:2006年5月29日 |

| |
[DWR(Ajax)]dwr简介--一个例子(续) 软件技术, 电脑与网络
lhwork 发表于 2006/7/10 10:19:50 |
抱歉这篇才写。上班没有多少时间啊!TableModelBean.java 这是核心业务类,既要被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. * 这个例子只是用来演示用的,如果多人访问会出现并发问题 * @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.xmlweb.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打开的话,你就可以看到每一个远程调用。对开发很有用。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,因为我是发布在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页面了。我再写一篇吧。 |
|
回复:dwr简介--一个例子(续) 软件技术, 电脑与网络
段誉(游客)发表评论于2007/5/17 10:52:01 |
|
回复:dwr简介--一个例子(续) 软件技术, 电脑与网络
段誉(游客)发表评论于2007/5/17 10:43:30 |
能不能把这个例子源代码给一份啊,谢谢.duanwq0007@tom.com |
|
» 1 »
|