`

AJAX表格分页模板(续):服务器端实现

阅读更多
AJAX表格分页模板:探讨基于Prototype框架的javascript面向对象设计(上)
AJAX表格分页模板:探讨基于Prototype框架的javascript面向对象设计(中)
AJAX表格分页模板:探讨基于Prototype框架的javascript面向对象设计(下)
        在前面的三篇文章中,我们循序渐进的完成了三种数据获取方式的表格分页模板,接下来让我们看一下服务器端代码设计。这里出于快速演示的目的,实用 groovy脚本简单实现,日后完全可以替换为别的实现,groovy的快速开发能力,非常适合用来快速展示脑海里的实现,呵呵。
        首先,在mysql中建立一个名为“template”的数据库,再库中创建一个数据表trs,结构图如下(注意如果你设置了不同的用户名和密码,记得在下面的groovy代码里面做相应修改)。在这里我输入了19行测试数据:
id
int(10)
title1
VARCHAR(45)
title2 VARCHAR(45)
title3 VARCHAR(45)
title4 VARCHAR(45)
title5 VARCHAR(45)
title6
VARCHAR(45)

        接下来,针对静态分页模板,也就是一次获取所有分页数据的模板,我们编写一个StaticTemplate.groovy脚本文件,这里使用了groovy servlet:
xml 代码
 
  1. import groovy.sql.Sql  
  2. response.setContentType 'text/html'  
  3. response.setCharacterEncoding 'utf-8'  
  4. db = Sql.newInstance(  
  5.     'jdbc:mysql://localhost/template',  
  6.     'root',  
  7.     'admin',  
  8.     'com.mysql.jdbc.Driver'  
  9. )  
  10. def trs = []  
  11. db.eachRow("select * from trs"){tr->  
  12.     def writer = new StringWriter()  
  13.     def builder = new groovy.xml.MarkupBuilder(writer)  
  14.     builder.tr{  
  15.         td tr.title1  
  16.         td tr.title2  
  17.         td tr.title3  
  18.         td tr.title4  
  19.         td tr.title5  
  20.         td tr.title6  
  21.     }  
  22.     trs += writer.toString()  
  23. }  
  24. db?.close();  
  25. mode = request.getParameter("mode")  
  26. items = Integer.parseInt(request.getParameter("items"))  
  27. out.println "<table id='pages'>"  
  28. out.println """  
  29.     <caption>静态分页模板</caption>  
  30.     <thead>  
  31.         <tr>  
  32.             <th>标题一</th>  
  33.             <th>标题二</th>  
  34.             <th>标题三</th>  
  35.             <th>标题四</th>  
  36.             <th>标题五</th>  
  37.             <th>标题六</th>  
  38.         </tr>  
  39.     </thead>  
  40. """  
  41. for(String tr in trs){  
  42.     def index = trs.indexOf(tr)  
  43.     if(index%items==0){  
  44.         out.println "<tbody class='hidden'>"  
  45.     }  
  46.     out.println tr  
  47.     if(index%items==items-1||index==trs.size()-1){  
  48.         out.println "</tbody>"  
  49.     }  
  50. }  
  51. out.println "</table>"  


        另外,针对动态获取每页数据的分页模板,对应为AsyncTemplate.groovy脚本:
xml 代码
 
  1. import groovy.sql.Sql  
  2. response.setCharacterEncoding 'utf-8'  
  3. mode = request.getParameter("mode")  
  4. items = Integer.parseInt(request.getParameter("items"))  
  5. def db = Sql.newInstance(  
  6.     'jdbc:mysql://localhost/template',  
  7.     'root',  
  8.     'admin',  
  9.     'com.mysql.jdbc.Driver'  
  10. )  
  11. def start = 1  
  12. if(mode=="page"){  
  13.     page = Integer.parseInt(request.getParameter("page"))  
  14.     if(page > 1){  
  15.         start = (page-1)*items + 1  
  16.     }  
  17. }  
  18. def end = start + items - 1  
  19. def pageContent = []  
  20. db.eachRow("select * from trs where id between ${start} and ${end}"){tr->  
  21.     def writer = new StringWriter()  
  22.     def builder = new groovy.xml.MarkupBuilder(writer)  
  23.     builder.tr{  
  24.         td tr.title1  
  25.         td tr.title2  
  26.         td tr.title3  
  27.         td tr.title4  
  28.         td tr.title5  
  29.         td tr.title6  
  30.     }  
  31.     pageContent += writer.toString()  
  32. }  
  33. if(mode=="async"){  
  34.     def trTotal = db.firstRow("select count(*) as total from trs").total  
  35.     if(trTotal<items){  
  36.         items = trTotal  
  37.     }  
  38.     pageTotal = trTotal%items!=0?trTotal.intdiv(items)+1:trTotal.intdiv(items)  
  39.     response.setContentType 'text/html'  
  40.     out.println "<table id='pages'>"  
  41.     out.println """  
  42.         <caption>异步分页模板</caption>  
  43.         <thead>  
  44.             <tr>  
  45.                 <th>标题一</th>  
  46.                 <th>标题二</th>  
  47.                 <th>标题三</th>  
  48.                 <th>标题四</th>  
  49.                 <th>标题五</th>  
  50.                 <th>标题六</th>  
  51.             </tr>  
  52.         </thead>  
  53.     """  
  54.     out.println "<tbody id='default'>"  
  55.     out.println pageContent.join("")  
  56.     out.println """  
  57.         </tbody>  
  58.         <tbody id="swap" class="hidden">      
  59.         </tbody>          
  60.         </table>  
  61.         <script type="text/javascript">  
  62.             template.pageTotal = $pageTotal;  
  63.         </script>  
  64.     """   
  65. }  
  66. else{  
  67.     response.setContentType 'text/xml'  
  68.     int page = Integer.parseInt(request.getParameter("page"))  
  69.     out.println """<tbody>"""  
  70.     out.println pageContent.join("")  
  71.     out.println """</tbody>"""  
  72. }  
  73. db?.close();  


一些解释和技巧:
        由于groovy语法简洁易懂,这里就不全盘解释了,就一些技巧说明一下,如果有兴趣,可以到groovy的官方网站查看相应的教程:http://groovy.codehaus.org/
        1、groovy servlet相比servlet,简化了不少,你可以直接使用绑定对象,比如request、response等,而且,分号和变量声明前的“def”关键字是可选的;
        2、
引入groovy.sql.Sql类后,可以用Sql.newInstance静态方法返回数据库连接对象(可以指定相应的配置参数,如地址、用户名密码等),之后可以利用groovy提供的一系列方便实用的数据获取方法以及闭包,进行日常数据库操作:
java 代码
  1. import groovy.sql.Sql  
  2.   
  3. def db = Sql.newInstance(  
  4.     'jdbc:mysql://localhost/template',  
  5.     'root',  
  6.     'admin',  
  7.     'com.mysql.jdbc.Driver'  
  8. )  
另外,有个技巧可以让我们免于用if语句判断调用方法的对象是否为空,即使db为空,也不会抛出异常,呵呵:
java 代码
  1. db?.close()  

        3、三引号内部的字符串,会按原始格式输出,不需要对特殊字符做转义。而且,和双引号字符串一样,可以使用Gstring变量来动态占位,输出的时候将会把这些占位符替换为实际的变量值,与表达式语言类似:
java 代码
  1. "select * from trs where id between ${start} and ${end}"    // ${变量名}即为占位替换符号  

        4、利用groovy提供的MarkupBuilder,可以很方便的动态构建xml树结构。下面的代码迭代查询结果集的每一行,构建了一个分页数据内容(即tbody元素的tr子节点集):
java 代码
  1. db.eachRow("select * from trs where id between ${start} and ${end}"){tr->  
  2.     def writer = new StringWriter()  
  3.     def builder = new groovy.xml.MarkupBuilder(writer)  
  4.     builder.tr{  
  5.         td tr.title1  
  6.         td tr.title2  
  7.         td tr.title3  
  8.         td tr.title4  
  9.         td tr.title5  
  10.         td tr.title6  
  11.     }  
  12.     pageContent += writer.toString()  
  13. }  

        最后,说一下前面我们设计的js对象的调用方式。在页面中,要显示一个分页表格,只需要指定一个容器div就可以了,比如,页面上有一个id为“
TMPwrap”的div,我们可以这样来实例化分页模板对象,并显示它:
js 代码
  1. var template = new Tbi.StaticTemplate("TMPwrap",4,"StaticTemplate.groovy");  
  2. template.show();  
这样就生成并显示了一个静态分页模板实例,这里的template变量起这个名字,是由于动态分页模板的服务器返回javascript片段中用了这个名字,耦合得比较严重。可以这么改进,将服务器返回的片段代码改为一个函数,客户端eval之后,返回总页数即可:
js 代码
 
  1. function getTotal(){  
  2.         var total = $pageTotal;  
  3.         return total;  
  4. }  

        ok,到这里,ajax表格分页模板示例就告一段落了,最后附上源码供大家参考,见附件。我的环境是:jdk5,tomcat5.5,mysql5.0。 将附件中的Template.war放入tomcat安装目录下的webapps文件夹里,即可通过http: //127.0.0.1/Template/template.htm访问到。

        忘记说一个ie的bug:在生成提示信息的时候,我们通过动态生成一个跨列的单元格来实现,这里有个地方要注意,对于firefox,设置td.colspan = 100就可以了(一般不会有超过100列的表格,所以这个数目足够了),但是对于IE,貌似是区分大小写的,非得这样写才能达到相同的效果,奇怪:td.colSpan = 100。

        预告一下,接下来,会有一篇文章讲解一种用很取巧但不是非常实用的方法,来达到静态的分页效果,特别之处在于,它不需要任何的javascript代码,呵呵,算是奇巧淫技了(ps:不要误会这个词语,不信你可以去翻翻辞典,呵呵)。
  • Template.rar (2.5 MB)
  • 描述: 示例代码
  • 下载次数: 1468
分享到:
评论
5 楼 chq32 2007-06-07  
里面有文档吗,
没有的话,也打包上传吧,
4 楼 笨笨狗 2007-05-31  
zjwlzwq 写道
这个下载下来,按照你的方法进行安装,等显示页面后,点击显示没有反映


首先,确保你的数据库表建立成功,而且已经有了测试数据在里面。你可以装个firefox,用firebug插件看看服务器返回的响应数据是否正确。

没有class是正常的,为了快速演示,我直接使用groovy servlet脚本编写,是不需要编译成.class的。

我想可能就是数据库的问题,检查一下表是否成功创建,还有数据库的用户名密码等,这个可以在groovy脚本里面直接修改保存即可。
3 楼 zjwlzwq 2007-05-31  
Template.rar这个包里怎么没有.class文件?
2 楼 zjwlzwq 2007-05-31  
请楼主指教
1 楼 zjwlzwq 2007-05-31  
这个下载下来,按照你的方法进行安装,等显示页面后,点击显示没有反映

相关推荐

    jquery插件--表格分页

    jQuery作为一个广泛使用的JavaScript库,提供了丰富的插件来帮助开发者实现各种功能,包括表格分页。本篇文章将深入探讨jQuery插件在实现表格分页中的应用及其相关知识点。 一、jQuery和表格分页基础 1. jQuery...

    AJAX表格分页模板:探讨基于Prototype框架的javascript面向对象设计

    火龙果软件工程技术中心 数据分页显示,是很普遍的需求,传统的实现大多是基于服务器端导航的,这种设计采用同步方式进行数据传输,用户体验很差。下面是我在学习ajax的过程中,实现的一个解决方案,不知道设计得...

    简单ASP的AJAX无刷新分页

    2. **服务器端处理**:在ASP文件中,接收来自AJAX请求的参数(如当前页码、每页记录数等),然后查询数据库并计算出对应页的数据。这部分需要编写SQL查询语句,如`SELECT * FROM table LIMIT start, limit`,其中...

    bootstrap动态表格模板

    这种功能通过JavaScript或jQuery实现,可能涉及事件监听、DOM操作以及Ajax异步请求,以获取和更新服务器端的数据。 接下来,我们讨论分页功能。在处理大量数据时,分页是必不可少的,它能防止页面过长,提高加载...

    php+mysql+ajax分页+表格table+loading效果+css(已测试成功)

    下面将详细解释这些技术及其在分页和表格展示中的应用,以及如何实现loading效果。 1. PHP:PHP(Hypertext Preprocessor)是一种广泛使用的开源脚本语言,主要用于服务器端编程。它可以让开发者轻松地处理HTTP请求...

    js分页表格

    在JavaScript中,可以使用数组切片或者服务器端的分页API来实现。 在实际应用中,"jstable"可能是这个分页表格组件的名称,它可能包含了以下部分: 1. HTML模板:定义表格结构和分页元素。 2. CSS样式:定义表格和...

    AJAX的EXCEL表格功能

    7. **服务器端操作**:AJAX可以轻松地与服务器端脚本(如PHP、Python、Node.js等)集成,执行复杂的计算或验证,然后将结果返回给前端表格。 8. **性能优化**:为了优化性能,通常会使用JSON格式来传输数据,因为它...

    JSP数据库数据AJAX无刷新分页

    "JSP数据库数据AJAX无刷新分页"是一个常见的技术实现,它结合了JavaServer Pages(JSP)、数据库技术、Ajax(Asynchronous JavaScript and XML)以及前端分页组件,为用户提供了一种无需整个页面刷新即可获取并显示...

    layui+nicePage.js实现JSON自动表格分页代码.zip

    在本项目中,我们主要关注的是使用layui和nicePage.js实现JSON数据的自动表格分页。layui是一款轻量级的前端UI框架,提供了一系列丰富的组件,包括表格、按钮、表单等,适用于快速构建简洁、直观、强大的网页界面。...

    前后端分页.rar

    3. **Thymeleaf**:Thymeleaf是一个现代的服务器端模板引擎,用于生成HTML。在分页场景中,Thymeleaf可以接收服务器返回的分页数据,并动态地渲染页面,显示当前页的内容以及分页导航。 4. **SpringBoot集成**:...

    C#万能分页代码,GridView分页相当方便

    - **数据分片**:为了提高性能,应确保数据在服务器端进行分片处理,只加载当前页所需的数据,而非整个数据集。 - **缓存策略**:对于频繁访问的数据,可以考虑使用缓存技术减少数据库访问次数。 - **异步加载**:...

    GridView分页系列

    服务器端分页:在服务器上处理分页,适合数据量较小或对性能要求不高的情况。 客户端分页:在客户端JavaScript中处理分页,适用于大量数据和对性能要求较高的场景。 十、总结 "GridView分页系列"是一个全面探讨如何...

    使用vue和datatables进行表格的服务器端分页实例代码

    本篇文章将深入探讨如何结合Vue和DataTables实现服务器端分页的实例。 首先,我们要理解服务器端分页的概念。与客户端分页不同,服务器端分页在服务器上执行数据过滤、排序和分页逻辑,而不是在浏览器端。这样做...

    asp.net 分页

    在ASP.NET中,分页通常通过服务器端控件如GridView、ListView或DataPager来实现。以下将详细讲解ASP.NET分页的核心概念和技术: 1. **GridView控件**:GridView是最常用的展示数据的控件之一,它内建了分页功能。只...

    Asp.Net Ajax GridView的实现

    这主要通过使用JavaScript库(MicrosoftAjax.js)和服务器端的ASP.NET AJAX扩展来实现。 GridView控件是ASP.NET中的一个核心组件,用于显示和操作表格数据。它能够自动绑定到各种数据源,如SQL数据库、XML文件或...

    asp.net分页控件

    这可能涉及到JavaScript/jQuery前端分页,或者自定义服务器端分页控件。例如,可以创建一个自定义User Control,结合AJAX实现异步分页,提供更好的用户体验。 5. 高级分页功能: - 排序和筛选:结合SortExpression...

    asp.net处理不规则表格 结合jquery处理不规则表格

    综上所述,结合ASP.NET的服务器端能力与jQuery的客户端优势,我们可以有效地处理不规则表格,提供灵活、高性能的用户界面。在实际项目中,应根据具体需求选择合适的技术组合,确保代码的可维护性和性能。

    Mvc无刷新分页

    6. **分页逻辑**:在服务器端,我们需要计算总页数,根据当前页码和每页记录数截取数据。可以使用各种ORM框架,如Entity Framework,配合SQL查询来实现。 下面是一个简单的实现步骤: 1. **创建控制器方法**:在你...

    jqery+ajax数据表格

    在数据表格应用中,Ajax的核心作用是实现数据的动态加载和更新。当用户滚动、搜索或过滤数据时,Ajax可以向后台发送请求,获取新的数据片段,从而提高用户体验。 "datagrid"通常指的是数据网格控件,它是Web应用中...

Global site tag (gtag.js) - Google Analytics