一个完整的Ajax查询及对查询结果实现分页的范例

本文介绍了一个完整的Ajax查询及对查询结果实现分页的过程,包括客户端JavaScript分页组件的使用,服务器端Java Servlet的编写,以及数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分页是WEB应用开发中最常用的功能之一,大多数是在动态页面(如:jsp、asp、php)中完成。pageObj是本人针对JavaScript数组实现分页的一个通用的对象,使用简单,效果良好,功能比较完备,其原理与jsp分页原理相同,如对数据进行分组、每组多少页、每页多少条记录等等,只是编写代码更为复杂,但实用价值高。本篇将介绍一个Ajax查询及对查询结果实现分页的全部过程,示例是对一个分类表进行查询。

 

查询的基本方法是:

pvo.query("请求url",function(){/*实现用户代码*/});

 

分页的基本方法是:

1、创建分页对象,详细参考page.html文件

var p=new pageObj({uid:"pageTD",list:label_v,numPerPage:24,numPerOne:8,barType:2,f:function(){ alert(p.list.length+"|"+p.pageList.length);}});

2、显示分页
 p.showPage();

 

一、效果图

这是点击查询按钮后生成的分页结果

这是连续点击两次下一组按钮、点击第25页按钮后的效果

 

二、数据库表定义


create table label(
label_id bigint primary key,          /*通用分类表,主键*/
parent_id bigint default 0,             /*父键*/
label varchar(64),                           /*标签*/
groupid varchar(32)                       /*类别*/
);

 

三、客户端网页page.html文件

 

<!--
一个完整的JavaWEB下的Ajax查询及分页的范例
客户端代码
胡开明
2011-11-21
-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title>一个完整的Ajax查询及对查询结果实现分页的范例</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script type="text/javascript" src="res/js/pvo.js"></script>
        <script type="text/javascript" src="res/js/jbxx.jsp"></script>
        <script type="text/javascript" src="res/js/page.js"></script>
        <script type="text/javascript">
            function chaxun(){
                var action=pvo.getRoot()+ "/ExServlet?method=queryLabel";//查询请求的action,如同form中的action;
                pvo.query(action, function(){
                    var p=new pageObj({//创建分页对象
                        uid:"browseTD",//指定一个容器,供显示结果
                        numPerPage:6,//每页显示的记录数
                        numPerOne:10,//每组的页数
                        list:pvo.RESULT,//这是查询结果
                        barType:2//2:表示在查询结果的上下方都显示索引条;0,只在查询结果的上方都显示索引条;1,只在查询结果的下方都显示索引条;
                    });
                    p.f=function(){//实现用户方法
                        var list = p.pageList;//从分页的结果中取当前页的记录
                        var uid=p.bodyid;
                        document.getElementById(uid).innerHTML="";
                        var header="";
                        var html="";
                        var keys=null;
                        if(list.length>0){
                            for(var a=0;a<list.length;a++){//遍历当前分页的记录
                                html=html+"<tr>";
                                var m=list[a];
                                keys=m.keys();
                                for(var b=0;b<keys.length;b++){
                                    var v=m.get(keys[b]);//提取字段值
                                    if(v==null||v=="")v="  ";
                                    html=html+"<td>"+v+"</td>";
                                }
                                html=html+"</tr>";
                            }
                        }else{
                            html="<tr><td>暂无记录</td></tr>";
                        }
                        if(keys!=null){
                            header="<tr>";
                            for(var b=0;b<keys.length;b++){
                                header=header+"<th align=center>"+keys[b]+"</th>";//用字段名构成列表的标题
                            }
                            header=header+"</tr>";
                        }
                        document.getElementById(uid).innerHTML="<table id='browseTable' border='1px' style='width:100%;'>"+header+html+"</table>";

                    }
                    p.showPage();//显示分页结果
                });
            }
        </script>
    </head>
    <body>
        <p>一个完整的Ajax查询及对查询结果实现分页的范例</p>
        <p><input type="button" value="查询" οnclick="chaxun()" /></p>
        <div id="browseTD" style="width:740px;">
        </div>
    </body>
</html>


四、服务器端文件

1、Servlet文件

/*
 * 一个完整的JavaWEB下的Ajax查询及分页的范例
 * 服务端代码
 * 2011-11-21
 */
package cn.hkm.example;

import cn.hkm.sql.ProcessVO;
import cn.hkm.web.ProcessForm;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author 胡开明
 */
@WebServlet(name = "ExServlet", urlPatterns = {"/ExServlet"})
public class ExServlet extends HttpServlet {

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        String method = request.getParameter("method");

        System.out.println(method);

        if ("queryLabel".equals(method)) {
            queryLabel(request, response);
        }
    }

    /**
     * @param request servlet request
     * @param response servlet response
     */
    private void queryLabel(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        response.setContentType("text/xml;charset=UTF-8");
        String returnValue = "";
        PrintWriter out = null;
        try {
            out = response.getWriter();
            String sql = "select * from label";
            ProcessVO pvo = new ProcessVO(_Con.getCon());
            try {
                List v = pvo.getSomeRecord(sql);
                if (v.size() > 0) {
                    for (int i = 0; i < v.size(); i++) {
                        Map map = (Map) v.get(i);
                        returnValue = returnValue + "<record>" + mapToXml(map) + "</record>";
                    }
                    returnValue = "<records>" + returnValue + "</records>";
                } else {
                    returnValue = "<records></records>";
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            } finally {
                pvo.closeCon();
                out.write(returnValue);
                out.close();
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

    public String mapToXml(Map m) {
        String xml = "";
        if (m != null && m.size() > 0) {
            Set set = m.keySet();
            Object[] obj = set.toArray();
            for (int i = 0; i < obj.length; i++) {
                xml = xml + "<" + obj[i] + ">" + filterChar(m.get(obj[i])) + "</" + obj[i] + ">";
            }
        }
        return xml;
    }

    /**
     * 在String中,使用s.replace("<","<");使用s.replace(">",">");不能达到预期效果
     *替换字符'<'和'>'
     **/
    public String filterChar(Object obj) {
        String str = "";
        if (obj == null) {
            return str;
        }
        str = obj.toString();

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) != '<' && str.charAt(i) != '>' && str.charAt(i) != '"' && str.charAt(i) != '&') {// && str.charAt(i) != '\''
                sb.append(str.charAt(i));
            } else {
                if (str.charAt(i) == '<') {
                    sb.append("<");
                }
                if (str.charAt(i) == '>') {
                    sb.append(">");
                }
                if (str.charAt(i) == '"') {
                    sb.append(""");
                }
                //if (str.charAt(i) == '\'') {
                // sb.append("’");//´
                //}
                if (str.charAt(i) == '&') {
                    sb.append("&");
                }
            }
        }
        return sb.toString();
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}


2、数据库连接文件

package cn.hkm.example;

import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;

public class _Con {

    public static synchronized Connection getCon() {
        Connection con = null;
        String url = "jdbc:microsoft:sqlserver://localhost:1433; SendStringParametersAsUnicode=false";
        String userName = "admin";
        String password = "admin";//pio99
        try {
            Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
            con = DriverManager.getConnection(url, userName, password);
        } catch (SQLException ex1) {
            ex1.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        return con;
    }
}


五、JavaScript分页组件page.js

/**
 * 对数组分页
 * 胡开明
 * 范例:
 var p=new pageObj({uid:"pageTD",list:label_v,numPerPage:24,numPerOne:8,barType:2,f:function(){ alert(p.list.length+"|"+p.pageList.length);}});
 p.showPage();
 * @param config={node:null,uid:"",list:null,f:function(){}};
 */

function pageObj(config){
    var obj=this;
    if(config==null)config={};
    var props={
        node:null,
        uid:null,//容器id
        barid:"pageBar",
        barid2:"pageBar2",
        bodyid:"pageBody",
        list:null,//记录的结果集,如查询结果
        pageList:null,//当前分页的子集,可供在用户方法中调用
        numPerPage:24,//每页的记录的个数
        numPerOne:8,//每组的页的个数
        numGroup:0,
        index:0,
        withAnchor:false,//是否使用锚,以便定位到锚的位置
        anchor:"",
        barType:0,//0:bar的位置只在顶部显示,1:bar的位置只在底部显示,2:bar的位置在顶部和底部都显示。
        barClass:"pageBar",//通常给一个背景图即可
        bodyClass:"pageContent",//
        f:null//用户方法
    }
    for(var i in props)this[i]=(typeof config[i]=='undefined')?props[i]:config[i];

    if(obj.f==null){
        obj.f=function(){
            alert('请定义用户方法。列:var p=new pageObj({uid:"pageTD",list:label_v,f:function(){ alert(p.list.length+"|"+p.pageList.length);}}); p.showPage();');
        }
    }
    //if(obj.list==null)obj.list=pvo.getResult();
    if(obj.list==null)obj.list=new Array();
    if(obj.list!=null)obj.pageList=obj.list.slice(obj.numPerPage*obj.index,obj.numPerPage*obj.index+obj.numPerPage);//供用户当前使用的数据
    if(obj.uid!=null){
        obj.barid=obj.uid+"Bar";
        obj.barid2=obj.uid+"Bar2";
        obj.bodyid=obj.uid+"Body";
        obj.anchor=obj.uid+"Anchor";
    }

    var anchor="";
    if(obj.withAnchor){
        anchor="<div style='clear:both;height:0px;'><a name='"+obj.anchor+"'></a></div>"
    }

    //容器 开始
    var listDiv=anchor+"<div><div id='"+obj.barid+"' style='float:left;margin: 0px auto;width:100%;height: 26px;line-height: 26px;background-color:#F0F0EE;color:#000000;text-align: left;font-family: Arial,Helvetica,sans-serif;font-size: 14px;display:none;' class="+obj.barClass+"></div><div id='"+obj.bodyid+"' style='float:left;margin: 0px auto;width:100%;' class="+obj.bodyClass+"></div></div>";
    if(obj.barType==1){
        listDiv=anchor+"<div><div id='"+obj.bodyid+"' style='float:left;margin: 0px auto;width:100%;' class="+obj.bodyClass+"></div><div id='"+obj.barid+"' style='float:left;margin: 0px auto;width:100%;height: 26px;line-height: 26px;background-color:#F0F0EE;color:#000000;text-align: left;font-family: Arial,Helvetica,sans-serif;font-size: 14px;display:none;' class="+obj.barClass+"></div></div>";
    }
    if(obj.barType==2){
        listDiv=anchor+"<div><div id='"+obj.barid+"' style='float:left;margin: 0px auto;width:100%;height: 26px;line-height: 26px;background-color:#F0F0EE;color:#000000;text-align: left;font-family: Arial,Helvetica,sans-serif;font-size: 14px;display:none;' class="+obj.barClass+"></div><div id='"+obj.bodyid+"' style='float:left;margin: 0px auto;width:100%;' class="+obj.bodyClass+"></div><div id='"+obj.barid2+"' style='float:left;margin: 0px auto;width:100%;height: 26px;line-height: 26px;background-color:#F0F0EE;color:#000000;text-align: left;font-family: Arial,Helvetica,sans-serif;font-size: 14px;display:none;' class="+obj.barClass+"></div></div>";
    }

    function initDiv(){//写容器//分页页面结构
        if(obj.node==null){
            if(document.getElementById(obj.uid))obj.node=document.getElementById(obj.uid);
        }
        if(obj.node!=null)obj.node.innerHTML=listDiv;
        if(obj.list.length<=obj.numPerPage){
            document.getElementById(obj.barid).style.display="none";
            if(obj.barType==2){
                document.getElementById(obj.barid2).style.display="none";
            }
        }else{
            document.getElementById(obj.barid).style.display="block";
            if(obj.barType==2){
                document.getElementById(obj.barid2).style.display="block";
            }
        }
    }
    initDiv();
    //容器 结束

    //初始化索引条 开始
    var all=obj.list.length;
    var allPages=0;//总页数
    i=all%obj.numPerPage;
    if(i==0){
        allPages=parseInt(all/obj.numPerPage);
    }else{
        allPages=parseInt(all/obj.numPerPage+1);
    }

    var group=1;//总分组数
    var j=all%(obj.numPerPage*obj.numPerOne);
    if(j==0){
        group=parseInt(all/(obj.numPerPage*obj.numPerOne));
    }else{
        group=parseInt(all/(obj.numPerPage*obj.numPerOne)+1);
    }
    var oneGroupPages=obj.numPerOne;//当前组的页面数,
    if(allPages<obj.numPerOne){
        oneGroupPages=allPages;
    }

    obj.showGroup=function(numGroup){
        obj.numGroup=numGroup;
        obj.index=numGroup*obj.numPerOne;
        obj.showPage(obj.index);
    }

    obj.showPage=function(index){
        if(obj.list.length==0){
            return;
        }

        if(index==null)index=0;

        obj.index=index;
        if(allPages-obj.numGroup*obj.numPerOne<obj.numPerOne)oneGroupPages=allPages-obj.numGroup*obj.numPerOne;
        else{
            oneGroupPages=obj.numPerOne;
        }
        obj.pageList=obj.list.slice(obj.numPerPage*obj.index,obj.numPerPage*obj.index+obj.numPerPage);
        if(obj.list.length<=obj.numPerPage){//不显示索引条
            obj.pageList=obj.list;
        }
        var begin=obj.numGroup*obj.numPerOne;
        var end=obj.numGroup*obj.numPerOne+oneGroupPages;
        var visit="";
        var visit2="";
        if(obj.withAnchor){
            for(i=begin;i<end;i++){
                visit=visit+"<span id='"+obj.uid+"_page_"+i+"' style='float:left;margin-top:6px;margin-left:1px;padding:1px 6px 1px 6px;width:auto;line-height:14px;height:14px;text-indent:0px;text-align:center;font-family:Helvetica,Arial,sans-serif;font-size: 12px;font-weight:bold;background:#7B7B63;color:#ffffff;cursor:pointer;'><a style='color:#ffffff;' href='#"+obj.anchor+"'>"+(i+1)+"</a></span>";
                visit2=visit2+"<span id='"+obj.uid+"_pageB_"+i+"' style='float:left;margin-top:6px;margin-left:1px;padding:1px 6px 1px 6px;width:auto;line-height:14px;height:14px;text-indent:0px;text-align:center;font-family:Helvetica,Arial,sans-serif;font-size: 12px;font-weight:bold;background:#7B7B63;color:#ffffff;cursor:pointer;'><a style='color:#ffffff;' href='#"+obj.anchor+"'>"+(i+1)+"</a></span>";
            }
        }else{
            for(i=begin;i<end;i++){
                visit=visit+"<span id='"+obj.uid+"_page_"+i+"' style='float:left;margin-top:6px;margin-left:1px;padding:1px 6px 1px 6px;width:auto;line-height:14px;height:14px;text-indent:0px;text-align:center;font-family:Helvetica,Arial,sans-serif;font-size: 12px;font-weight:bold;background:#7B7B63;color:#ffffff;cursor:pointer;'>"+(i+1)+"</span>";
                visit2=visit2+"<span id='"+obj.uid+"_pageB_"+i+"' style='float:left;margin-top:6px;margin-left:1px;padding:1px 6px 1px 6px;width:auto;line-height:14px;height:14px;text-indent:0px;text-align:center;font-family:Helvetica,Arial,sans-serif;font-size: 12px;font-weight:bold;background:#7B7B63;color:#ffffff;cursor:pointer;'>"+(i+1)+"</span>";
            }
        }

        var next="<span id='"+obj.uid+"_next' style='float:left;margin-top:6px;margin-left:1px;padding:1px 1px 1px 1px;line-height:14px;height:14px;background:#7B7B7B;color:#efefef;cursor:pointer;' title='下一组'><div style='width:20px;height:14px;'>>></div></span>";
        var next2="<span id='"+obj.uid+"_next2' style='float:left;margin-top:6px;margin-left:1px;padding:1px 1px 1px 1px;line-height:14px;height:14px;background:#7B7B7B;color:#efefef;cursor:pointer;' title='下一组'><div style='width:20px;height:14px;'>>></div></span>";
        var pre="<span id='"+obj.uid+"_pre' style='float:left;margin-top:6px;margin-left:1px;padding:1px 1px 1px 1px;line-height:14px;height:14px;background:#7B7B7B;color:#efefef;cursor:pointer;' title='上一组'><div style='width:20px;height:14px;'><<</div></span>";
        var pre2="<span id='"+obj.uid+"_pre2' style='float:left;margin-top:6px;margin-left:1px;padding:1px 1px 1px 1px;line-height:14px;height:14px;background:#7B7B7B;color:#efefef;cursor:pointer;' title='上一组'><div style='width:20px;height:14px;'><<</div></span>";



        var s="";
        var s2="";
        if(group>1){//按多组方式显示索引
            s="<div style='float:left;margin: 0px auto;width:100%;'><span style='float:left;margin-top:6px;margin-left:1px;padding:1px 6px 1px 6px;line-height:14px;height:14px;text-indent:0px;'>" + all + "条/" + allPages + "页</span>"+pre+ next+"  "+visit +"</div>";
            s2="<div style='float:left;margin: 0px auto;width:100%;'><span style='float:left;margin-top:6px;margin-left:1px;padding:1px 6px 1px 6px;line-height:14px;height:14px;text-indent:0px;'>" + all + "条/" + allPages + "页</span>"+pre2+ next2+"  "+visit2 +"</div>";
        }else{//按一组方式显示索引
            s="<div style='float:left;margin: 0px auto;width:100%;'><span style='float:left;margin-top:6px;margin-left:1px;padding:1px 6px 1px 6px;line-height:14px;height:14px;text-indent:0px;'>" + all + "条/" + allPages + "页</span>"+"  "+visit+"</div>";
            s2="<div style='float:left;margin: 0px auto;width:100%;'><span style='float:left;margin-top:6px;margin-left:1px;padding:1px 6px 1px 6px;line-height:14px;height:14px;text-indent:0px;'>" + all + "条/" + allPages + "页</span>"+"  "+visit2+"</div>";
        }
        document.getElementById(obj.barid).innerHTML=s;
        document.getElementById(obj.uid+"_page_"+index).style.backgroundColor="#990000";
        if(obj.barType==2){
            document.getElementById(obj.barid2).innerHTML=s2;
            document.getElementById(obj.uid+"_pageB_"+index).style.backgroundColor="#990000";
        }
        for(i=begin;i<end;i++){
            document.getElementById(obj.uid+"_page_"+i).οnclick=function(){
                var x=this.id;
                x=x.substring((obj.uid+"_page_").length);//x=x.replace(/[a-zA-Z_]|\s+/g, "");
                x=parseInt(x);
                obj.showPage(x);
            }
            if(obj.barType==2){
                document.getElementById(obj.uid+"_pageB_"+i).οnclick=function(){
                    var x2=this.id;
                    x2=x2.substring((obj.uid+"_pageB_").length);//x2=x2.replace(/[a-zA-Z_]|\s+/g, "");
                    x2=parseInt(x2);
                    obj.showPage(x2);
                }
            }
        }
        if(obj.numGroup<(group-1)){
            if(document.getElementById(obj.uid+"_next")){
                document.getElementById(obj.uid+"_next").οnclick=function(){
                    obj.showGroup(obj.numGroup+1);
                }
            }
            if(obj.barType==2){
                if(document.getElementById(obj.uid+"_next2")){
                    document.getElementById(obj.uid+"_next2").οnclick=function(){
                        obj.showGroup(obj.numGroup+1);
                    }
                }
            }
        }else{
            if(document.getElementById(obj.uid+"_next")){
                document.getElementById(obj.uid+"_next").οnclick=function(){
                    obj.showGroup(group-1);
                }
            }
            if(obj.barType==2){
                if(document.getElementById(obj.uid+"_next2")){
                    document.getElementById(obj.uid+"_next2").οnclick=function(){
                        obj.showGroup(group-1);
                    }
                }
            }
        }
        if(obj.numGroup>0){
            if(document.getElementById(obj.uid+"_pre")){
                document.getElementById(obj.uid+"_pre").οnclick=function(){
                    obj.showGroup(obj.numGroup-1);
                }
            }
            if(obj.barType==2){
                if(document.getElementById(obj.uid+"_pre2")){
                    document.getElementById(obj.uid+"_pre2").οnclick=function(){
                        obj.showGroup(obj.numGroup-1);
                    }
                }
            }
        }else{
            if(document.getElementById(obj.uid+"_pre")){
                document.getElementById(obj.uid+"_pre").οnclick=function(){
                    obj.showGroup(0);
                }
            }
            if(obj.barType==2){
                if(document.getElementById(obj.uid+"_pre2")){
                    document.getElementById(obj.uid+"_pre2").οnclick=function(){
                        obj.showGroup(0);
                    }
                }
            }
        }
        obj.f();
    }
}


下一篇将介绍List<Map>类型数组在表单管理中的应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值