`
zengbo0710
  • 浏览: 413998 次
社区版块
存档分类
最新评论

dwr简介--一个例子(续)

阅读更多
抱歉这篇才写。上班没有多少时间啊!
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.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打开的话,你就可以看到每一个远程调用。对开发很有用。
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页面了。我再写一篇吧 

分享到:
评论

相关推荐

    SpringBoot整合DWR3.0.2-RELEASE独立部署示例代码以及修改过的DWR3.0.2-RELEASE资源JAR包

    该示例资源主要解决如下两个问题,其一就是解决SpringBoot集成DWR3.0.2-RELEASE版本,无配置文件快速简洁完成集成工作,省去dwr.xml等DWR框架初始化需要的配置文件;其二就是解决了集成后的SpringBoot项目在开发环境...

    整理好的DWR-2.0.5-src

    这个不是我的原创,原文件出至这里:http://d.download.csdn.net/detail/jimyx123/1533286#comment 原资源包含了,源代码和API Doc,只是美中不足的是没有整理成可用的zip文档,我这特分离了一下,并重新打好包了,...

    DWR--学习参考文档

    这份"DWR--学习参考文档"显然是一个关于DWR技术的综合学习资源,包含了丰富的信息,帮助开发者深入理解和应用DWR。 DWR的核心概念主要有以下几个: 1. **Remoting**:远程调用是DWR的关键特性,它使得JavaScript...

    dwr入门 -- 03 -- 结合Spring

    6. **示例代码分析**:可能提供一个简单的例子,展示如何在Spring应用中创建一个DWR服务,以及在前端JavaScript如何调用这个服务。这可能涉及到`@RemoteProxy`注解的使用,以及Spring MVC的控制器方法。 7. **测试...

    DWR3.0.2-RELEASE修改版源码(解决资源加载问题导致的和SpringBoot整合后SpringBoot项目无法以独立JAR运行)

    DWR (Direct Web Remoting) 是一个开源的Java库,允许Web应用程序在浏览器和服务器之间进行实时通信。在本案例中,我们关注的是DWR 3.0.2-RELEASE的一个修改版,这个版本专门针对与Spring Boot 1.x集成时出现的问题...

    DWR-J2EE 简单例子

    总结,DWR-J2EE的简单例子为初学者提供了一个快速了解和实践AJAX通信的平台。通过学习这个例子,开发者可以深入理解DWR如何实现JavaScript与Java的无缝交互,以及如何在实际项目中利用DWR提高Web应用的用户体验。

    dwr-ajax例子还有老师的例子

    **DWR (Direct Web Remoting) 与 AJAX** DWR 是一个开源的 Java 库,...通过不断实践和研究"DWR-ajax例子还有老师的例子",你将能够熟练掌握 DWR 与 AJAX 的结合使用,为构建更加高效、动态的 web 应用奠定坚实基础。

    dwr,jar和dwr-noncla.jar

    Direct Web Remoting (DWR) 是一个开源Java库,它允许在Web应用程序中轻松地进行JavaScript和服务器端Java代码之间的交互。DWR使得AJAX(Asynchronous JavaScript and XML)开发更为简便,允许开发者在不刷新整个...

    dwr入门 -- 01 -- Hello Word

    本教程将带你走进DWR的世界,通过一个简单的"Hello World"示例来了解其基本使用。 ### 一、DWR简介 DWR的核心概念是"Remoting",即远程调用,它使得JavaScript可以像调用本地方法一样调用服务器上的Java方法。DWR...

    dwr-1.1.3-src.zip

    标题 "dwr-1.1.3-src.zip" 指示的是 Direct Web Remoting (DWR) 的源代码版本1.1.3的压缩包。DWR 是一个开源Java库,它允许JavaScript在Web浏览器中与服务器端的Java对象进行交互,实现Ajax功能。描述中的内容同样...

    dwr-2.0.6-src完整包

    DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站,其中包含jar包,javadoc,例子等

    dwr.jar/dwr-2.0.5-src.zip/dwr.zip

    这可能是一个重复的文件,或者包含了与dwr.jar和dwr-2.0.5-src.zip不同的内容,比如可能是DWR的配置文件、文档或者特定环境的构建版本。通常,这样的zip文件会包含部署所需的全部资源,包括Web应用的结构和配置文件...

    dwr 例子

    - DWR提供了一个内置的调试工具(`dwr-debug.js`),可以帮助开发者查看AJAX请求和响应的详细信息。 - 日志配置可以通过修改DWR的配置文件来调整,以便在开发和生产环境中获取合适的日志级别。 7. **版本控制**:...

    dwr-3.0.jar

    最新dwr3.0的包,有需要的朋友就下载吧

    struts2-dwr-plugin-2.2.3.jar

    struts2与dwr结合的工具之一,这个是新从官方网站下载的,与大家分享,希望对你们有效。

    spring-dwr-2.0.xsd

    spring-dwr-2.0.xsd spring 与 DWR进行配置

    dwr入门 -- 02 -- HelloWord解释&&使用javabean

    DWR (Direct Web Remoting) 是一个开源的Java库,它允许JavaScript在浏览器端与服务器端的Java对象进行交互,实现动态的Web应用。在"HelloWorld解释&&使用javabean"这个主题中,我们将深入理解DWR的基本概念、工作...

    dwr包.rar dwr.jar engine.js util.js dwr-noncla.jar readme.txt

    dwr包.rar dwr.jar engine.js util.js dwr-noncla.jar readme.txt JAR File: dwr.jar (1.08Mb) To DWR enable your web-app WAR File: dwr.war (4.62Mb) Demos/Examples of what DWR can do Sources: dwr-...

    dwr的server-side clock例子

    Direct Web Remoting (DWR) 是一个开源的Java库,允许Web应用程序在浏览器和服务器之间进行实时通信,绕过传统的Ajax限制。在这个“server-side clock”示例中,我们将深入探讨DWR如何实现动态更新页面内容,特别是...

Global site tag (gtag.js) - Google Analytics