• Spring+Mybatis+jQuery.Pagination.js异步分页及JsonConfig的使用


    在开发工作中经常用到异步分页,这里简单整理一下资料。

    一、Controller方法

    package com.lwj.controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.lwj.entity.Member;
    import com.lwj.page.Page;
    import com.lwj.service.MemberService;
    import com.lwj.util.json.PageJsonConfig;
    
    import net.sf.json.JSONObject;
    
    @Controller
    @RequestMapping("/member")
    public class MemberController extends BaseController {
        private static final Logger log = LoggerFactory.getLogger(MemberController.class);
    
        @Autowired
        private MemberService memberService;
    
        @RequestMapping("/list")
        public String list() {
            return "member/list";
        }
    
        @RequestMapping("/getList")
        public @ResponseBody JSONObject getMembersByPage(HttpServletRequest requet, HttpServletResponse response,
                Page<Member> page) {
            try {
                if (page == null) {
                    page = new Page<Member>();
                }
                page = memberService.findListByPage(page);
                JSONObject jsonObject = JSONObject.fromObject(page, new PageJsonConfig());//JsonConfig注册分页相应类型为null的处理类
                return jsonObject;
            } catch (Exception e) {
                e.printStackTrace();
                log.error(e.getMessage(), e);
            }
            return null;
        }
    
        @RequestMapping("/add")
        public String add() {
            return "member/add";
        }
    
        /**
         * 添加用户
         * 
         * @param requet
         * @param response
         * @param member
         * @return
         */
        @RequestMapping("/save")
        public @ResponseBody String save(HttpServletRequest requet, HttpServletResponse response, Member member) {
            try {
                int num = memberService.addMember(member);
                if (num == 0) {
                    return "failed";
                }
                return "success";
            } catch (Exception e) {
                e.printStackTrace();
                log.error(e.getMessage(), e);
            }
            return "error";
        }
    }

    二、Dao实现类

    package com.lwj.dao.impl;
    
    import java.io.Serializable;
    import java.util.List;
    
    import org.springframework.stereotype.Repository;
    
    import com.lwj.dao.MemberDao;
    import com.lwj.entity.Member;
    import com.lwj.page.Page;
    
    /**
     * 
     * @Description : MemberDao实现类
     * @author : liwenjian
     * @version : 1.0
     * @Date : 2016年1月28日 下午3:22:04
     * @param <T>
     * @param <PK>
     */
    @Repository
    public class MemberDaoImpl<T, PK extends Serializable> extends BaseDaoImpl<Member, Integer>
            implements MemberDao<Member, Integer> {
        /**
         * 获取Mapper.xml默认的空间
         */
        private String namespace = getDefaultSqlNamespace();
    
        @Override
        public List<Member> getMembers() throws Exception {
            return super.select();
        }
    
        @Override
        public int insertMember(Member member) throws Exception {
            return super.insert(member);
        }
    
        @Override
        public int updateMember(Member member) throws Exception {
            return super.update(member);
        }
    
        @Override
        public Member findMemberByName(String name) throws Exception {
            return getSqlSession().selectOne(namespace + ".findByName", name);
        }
    
        @Override
        public List<Member> findListByEmail(String email) throws Exception {
            return getSqlSession().selectList(namespace + ".findListByEmail", email);
        }
    
        @Override
        public Page<Member> findListByPage(Page<Member> page) throws Exception {
            List<Member> list = getSqlSession().selectList(namespace + ".findListByPage", page);
            if (page != null && page.getTotalSize() == 0) {
                Integer totalSize = getSqlSession().selectOne(namespace + ".findCountByPage", page);
                page.setTotalSize(totalSize);
            }
            page.setList(list);
            return page;
        }
    
    }

    三、Member实体

    package com.lwj.entity;
    
    import java.io.Serializable;
    
    /**
     * 
     * @Description : 用户实体
     * @author : liwenjian
     * @version : 1.0
     * @Date : 2016年1月28日 下午3:06:48
     */
    public class Member extends BaseEntity implements Serializable {
    
        /**
         * serialVersionUID:TODO
         * 
         * @since 1.0.0
         */
    
        private static final long serialVersionUID = 1L;
    
        private String memberName;
        private String memberPassword;
        private String memberEmail;
        private Integer memberBirthday;
        private Integer memberSex;
    
        public String getMemberName() {
            return memberName;
        }
    
        public void setMemberName(String memberName) {
            this.memberName = memberName;
        }
    
        public String getMemberPassword() {
            return memberPassword;
        }
    
        public void setMemberPassword(String memberPassword) {
            this.memberPassword = memberPassword;
        }
    
        public String getMemberEmail() {
            return memberEmail;
        }
    
        public void setMemberEmail(String memberEmail) {
            this.memberEmail = memberEmail;
        }
    
        public Integer getMemberBirthday() {
            return memberBirthday;
        }
    
        public void setMemberBirthday(Integer memberBirthday) {
            this.memberBirthday = memberBirthday;
        }
    
        public Integer getMemberSex() {
            return memberSex;
        }
    
        public void setMemberSex(Integer memberSex) {
            this.memberSex = memberSex;
        }
    
    }

    四、Mapper XML

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
     PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.lwj.entity.MemberMapper">
        <!-- 开启二级缓存 -->
        <cache />
        <resultMap type="com.lwj.entity.Member" id="memberResult">
            <id column="id" property="id" />
            <result column="member_name" property="memberName" />
            <result column="member_password" property="memberPassword" />
            <result column="member_email" property="memberEmail" />
            <result column="member_birthday" property="memberBirthday" />
            <result column="member_sex" property="memberSex" />
            <result column="create_date" property="createDate" />
            <result column="modify_date" property="modifyDate" />
        </resultMap>
        <!-- 查询列表 -->
        <select id="select" resultMap="memberResult">
            SELECT * FROM t_member
        </select>
        <!-- 保存对象 -->
        <insert id="insert" parameterType="com.lwj.entity.Member">
            INSERT INTO t_member
            <trim prefix="(" suffix=")" suffixOverrides=",">
                <if test="memberName != null">
                    member_name,
                </if>
                <if test="memberPassword != null">
                    member_password,
                </if>
                <if test="memberEmail != null">
                    member_email,
                </if>
                <if test="memberBirthday != null">
                    member_birthday,
                </if>
                <if test="memberSex != null">
                    member_sex,
                </if>
                <if test="createDate != null">
                    create_date,
                </if>
                <if test="modifyDate != null">
                    modify_date,
                </if>
            </trim>
            <trim prefix="values (" suffix=")" suffixOverrides=",">
                <if test="memberName != null">
                    #{memberName},
                </if>
                <if test="memberPassword != null">
                    #{memberPassword},
                </if>
                <if test="memberEmail != null">
                    #{memberEmail},
                </if>
                <if test="memberBirthday != null">
                    #{memberBirthday},
                </if>
                <if test="memberSex != null">
                    #{memberSex},
                </if>
                <if test="createDate != null">
                    #{createDate},
                </if>
                <if test="modifyDate != null">
                    #{modifyDate},
                </if>
            </trim>
    
        </insert>
        <!-- 根据ID查询对象 -->
        <select id="selectPk" resultMap="memberResult" parameterType="java.lang.Integer">
            select * from t_member where id = #{id}
        </select>
        <!-- 根据ID更新对象 -->
        <update id="update" parameterType="com.lwj.entity.Member">
            update t_member
            <set>
                <if test="memberName != null">
                    member_name = #{memberName},
                </if>
                <if test="memberPassword != null">
                    member_password = #{memberPassword},
                </if>
                <if test="memberEmail != null">
                    member_email = #{memberEmail},
                </if>
                <if test="memberBirthday != null">
                    member_birthday = #{memberBirthday},
                </if>
                <if test="memberSex != null">
                    member_sex = #{memberSex},
                </if>
                <if test="createDate != null">
                    create_date = #{createDate},
                </if>
                <if test="modifyDate != null">
                    modify_date = #{modifyDate}
                </if>
            </set>
            where id = #{id}
        </update>
        <!-- 根据用户名称查询 -->
        <select id="findByName" parameterType="java.lang.String"
            resultMap="memberResult">
            select * from t_member
            where member_name = #{name}
        </select>
        <!-- 根据用户邮箱查询 -->
        <select id="findListByEmail" parameterType="java.lang.String"
            resultMap="memberResult">
            select * from t_member
            where member_email = #{email}
        </select>
        <!-- 根据用户条件查询分页 -->
        <select id="findListByPage" parameterType="com.lwj.page.Page"
            resultMap="memberResult">
            select * from t_member
            where 1=1
            <if test="condition!=null">
                <if test="condition.memberName!=null and condition.memberName!=''">
                    and member_name = #{condition.memberName}
                </if>
                <if test="condition.memberPassword!=null and condition.memberPassword!=''">
                    and member_password = #{condition.memberPassword}
                </if>
                <if test="condition.memberEmail!=null and condition.memberEmail!=''">
                    and member_email = #{condition.memberEmail}
                </if>
            </if>
            limit #{offSet},#{pageSize}
        </select>
        <!-- 根据用户条件查询总数 -->
        <select id="findCountByPage" parameterType="com.lwj.page.Page"
            resultType="java.lang.Integer">
            select count(1) from t_member
            where 1=1
            <if test="condition!=null">
                <if test="condition.memberName!=null and condition.memberName!=''">
                    and member_name = #{condition.memberName}
                </if>
                <if test="condition.memberPassword!=null and condition.memberPassword!=''">
                    and member_password = #{condition.memberPassword}
                </if>
                <if test="condition.memberEmail!=null and condition.memberEmail!=''">
                    and member_email = #{condition.memberEmail}
                </if>
            </if>
        </select>
    </mapper>

    五、Page分页类

    package com.lwj.page;
    
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.List;
    
    public class Page<T> implements Serializable {
        /**
         * 
         */
        private static final long serialVersionUID = 8036358745002950680L;
    
        private static final Integer MIN_PAGE = 1;// 最小页数
    
        private static final Integer DEFAULT_PAGE_SIZE = 20;// 默认每页显示20条数据
    
        private static final Integer TOTAL_SIZE = 0;// 总数据数
    
        /**
         * 当前页码
         */
        private Integer currentPage = MIN_PAGE;
    
        /**
         * 每页显示数
         */
        private Integer pageSize = DEFAULT_PAGE_SIZE;
    
        /**
         * limit的开始位置
         */
        private Integer offSet;
    
        /**
         * 总数据数
         */
        private Integer totalSize;
    
        /**
         * 实体条件
         */
        private T condition;
    
        /** 结果集 */
        private List<T> list = new ArrayList<T>();
    
        /**
         * 获取当前页码
         * 
         * @return 当前页码
         */
        public Integer getCurrentPage() {
            if (this.currentPage != null && this.currentPage >= 1) {
                return currentPage;
            }
            return MIN_PAGE;
        }
    
        /**
         * 设置当前页码
         * 
         * @param currentPage
         *            当前页码
         */
        public void setCurrentPage(Integer currentPage) {
            this.currentPage = currentPage;
        }
    
        /**
         * 获取每页显示数
         * 
         * @return 每页显示数
         */
        public Integer getPageSize() {
            if (this.pageSize != null && this.pageSize >= 1) {
                return this.pageSize;
            }
            return DEFAULT_PAGE_SIZE;
        }
    
        /**
         * 设置每页显示数
         * 
         * @param pageSize
         *            每页显示数
         */
        public void setPageSize(Integer pageSize) {
            this.pageSize = pageSize;
        }
    
        public Integer getOffSet() {
            offSet = (this.getCurrentPage() - 1) * this.getPageSize();
            return offSet;
        }
    
        public void setOffSet(Integer offSet) {
            this.offSet = offSet;
        }
    
        /**
         * 获取总条数
         * 
         * @return 总条数
         */
        public Integer getTotalSize() {
            if (this.totalSize != null && this.totalSize >= 0) {
                return this.totalSize;
            }
            return TOTAL_SIZE;
        }
    
        /**
         * 设置总条数
         * 
         * @param totalSize
         *            总条数
         */
        public void setTotalSize(Integer totalSize) {
            this.totalSize = totalSize;
        }
    
        /**
         * 获取实体条件
         * 
         * @return 实体条件
         */
        public T getCondition() {
            return condition;
        }
    
        /**
         * 设置实体条件
         */
        public void setCondition(T condition) {
            this.condition = condition;
        }
    
        /**
         * 获取结果集
         * 
         * @return 结果集
         */
        public List<T> getList() {
            return list;
        }
    
        /**
         * 设置结果集
         * 
         * @param list
         *            结果集
         */
        public void setList(List<T> list) {
            this.list = list;
        }
    
    }

    六、PageJsonConfig分页JsonConfig处理类

    package com.lwj.util.json;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Locale;
    
    import net.sf.json.JSONNull;
    import net.sf.json.JSONObject;
    import net.sf.json.JsonConfig;
    import net.sf.json.processors.JsonValueProcessor;
    
    /**
     * PageJsonConfig分页转换成JSON处理类
     * 
     * @Description :JsonConfig类重写
     * @author : liwenjian
     * @version : 1.0
     * @Date : 2016年5月6日 上午9:44:31
     */
    public class PageJsonConfig extends JsonConfig {
        public PageJsonConfig() {
            // 可同时注册处理多种数据
            this.registerJsonValueProcessor("condition", new EntityJsonValueProcessor());// 注入处理动态实体类condition=null
            this.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor());// 注入处理Date类
        }
    
        /**
         * 
         * @Description :JSONArray.fromObject()转换异常,时间类型空值处理类
         * @author : liwenjian
         * @version : 1.0
         * @Date : 2016年5月6日 上午9:34:26
         */
        public class DateJsonValueProcessor implements JsonValueProcessor {
    
            @Override
            public Object processArrayValue(Object obj, JsonConfig jsonconfig) {
                return process(obj);
            }
    
            @Override
            public Object processObjectValue(String s, Object obj, JsonConfig jsonconfig) {
                return process(obj);
            }
    
            private Object process(Object obj) {
                if (obj == null) {// 如果时间为null,则返回空字串
                    return "";
                }
                if (obj instanceof Date) {
                    obj = new java.util.Date(((Date) obj).getTime());
                }
                if (obj instanceof java.util.Date) {
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);// 格式化时间为yyyy-MM-dd类型
                    return sdf.format(obj);
                } else {
                    return new Object();
                }
            }
    
        }
    
        /**
         * 
         * @Description :实体类条件condition处理类,为空则返回""
         * @author : liwenjian
         * @version : 1.0
         * @Date : 2016年5月6日 下午3:41:35
         */
        public class EntityJsonValueProcessor implements JsonValueProcessor {
    
            @Override
            public Object processArrayValue(Object obj, JsonConfig jsonconfig) {
                return obj;
            }
    
            @Override
            public Object processObjectValue(String s, Object obj, JsonConfig jsonconfig) {
                if ("condition".equals(s)) {// com.lwj.page.Page分页类里面的condition动态实体对象,这里是以key的方式,如果condition为com.excenon.entity.Member类,则obj为传入的是com.lwj.entity.Member对象
                    return JSONNull.getInstance().equals(obj) ? "" : JSONObject.fromObject(obj, new PageJsonConfig());//为了方便这里就直接调用 new PageJsonConfig(),不再编写另一个处理null的Date类型的类,PageJsonConfig中的DateJsonValueProcessor方法处理null Date类型
                }
                return obj;
            }
    
        }
    }

    七、异步分页jQuery.Pagination.js的list.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%
        String path = request.getContextPath();
        String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
                + path + "/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <base href="<%=basePath%>">
    
    <title>用户列表</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
    <link rel="stylesheet" type="text/css"
        href="<%=path%>/resources/js/jquery/pagination.css">
    <script type="text/javascript"
        src="<%=path%>/resources/js/jquery/jquery-1.8.3.min.js"></script>
    <script type="text/javascript"
        src="<%=path%>/resources/js/jquery/jquery.pagination.js"></script>
    
    <script type="text/javascript">
        var total_size = 0;//总数据条数
        var page_size = 30;//每页显示数
        var pageIndex = 0;//当前页码
        $(document).ready(function() {
            //初始化分页,展示分页信息并动态获取总数据条数、每页展示条数
            initPagination(pageIndex);
            //初始化分页插件
            $("#Pagination").pagination(total_size, {
                callback : pageselectCallback,
                prev_text : '上一页',
                next_text : '下一页',
                link_to : 'javascript:void(0);',//分页的链接,默认“#”
                items_per_page : page_size,//每页显示的条目数           
                num_display_entries : 5,//连续分页主体部分显示的分页条目数   
                current_page : pageIndex,//当前选中的页面
                num_edge_entries : 1//两侧显示的首尾分页的条目数
            });
        });
        /**
         *分页插件回调方法,page_index为当前页码
         */
        function pageselectCallback(page_index, jq) {
            initPagination(page_index);
        }
        /**
         *初始化分页,展示分页信息并动态获取总数据条数、每页展示条数
         */
        function initPagination(page_index) {
            $.ajax({
                url : "./member/getList.html",
                data : {
                    currentPage : page_index + 1,
                    pageSize : page_size,
                    totalSize : total_size
                },
                type : "GET",
                dataType : "json",
                async : false,
                success : function(data) {
                    if (!$.isEmptyObject(data)) {
                        page_size = data.pageSize;
                        total_size = data.totalSize;
                        var htmlStr = "";
                        $.each(data.list, function(i, item) {
                            htmlStr += "<li>ID:" + item.id + " 名称:" + item.memberName + " 密码:" + item.memberPassword +" 创建时间:" + item.createDate +"<li/>";
                        });
                        $("#list").html(htmlStr);
                    } else {
                        alert("没有获取到相关信息!");
                    }
                }
            });
        }
    </script>
    
    </head>
    
    <body>
        <center>
            <ul id="list" style="list-style-type: none;">
            </ul>
            <div id="Pagination" class=""></div>
        </center>
    </body>
    </html>

    展示:

  • 相关阅读:
    最详细易懂的CRC-16校验原理(附源程序)
    咳嗽秘方
    三十年前三十年后
    车载导航系统中常用物理量和单位
    mssql 中文乱码 字库集 问题解决方法
    CuteEditor.Editor+a+a+c+a+a.a() System.RuntimeType.get_Assembly() 问题解决方法
    .NET Framework 4.5 五个很棒的特性
    很管用的治咳嗽秘方
    python 使用pip install 手动安装本地包的方法
    Facebook支持python的开源预测工具Prophet
  • 原文地址:https://www.cnblogs.com/lyxy/p/5472867.html
Copyright © 2020-2023  润新知