自定义标签实现分页查询

13 篇文章 3 订阅
7 篇文章 0 订阅

自定义标签实现分页查询

忙活了一下午才写好,真是菜。不过还是很开心。

第一步、导入资源

这里写图片描述
自定义标签库和自定义标签类(实现了tagSupport)

第二步、前端页面使用自定义标签

导入自定义标签库
这里写图片描述
使用自定义标签
这里写图片描述

第三步、后台实现

后台实现的过程就是将查询到的信息及分页信息封装到page对象中相应给前端页面
这里写图片描述
分析:size是由开发者自定义的,page是由前端页面传来的。因此我们只需要准备total和rows结果集就可以了
1、首先创建实体类customer

package com.hytXwz.crm.entity;

import java.io.Serializable;
import java.util.Date;

public class Customer implements Serializable {

    private static final long serialVersionUID = -6128501330437420783L;

    private Long cust_id;
    private String cust_name;
    private Long cust_user_id;
    private Long cust_create_id;
    private String cust_source;
    private String cust_industry;
    private String cust_level;
    private String cust_linkman;
    private String cust_phone;
    private String cust_mobile;
    private String cust_zipcode;
    private String cust_address;
    private Date cust_createtime;
    。。。get/set省略了

2、dao层(重要)
CustomerDao 从数据库中查询我们需要用到的total和rows

package com.hytXwz.crm.dao;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.hytXwz.crm.entity.Customer;
import com.hytXwz.crm.entity.QueryVo;

@Repository("customerDao")
public interface CustomerDao {

    //查询符合条件的结果集
    List<Customer> selectRowsByQueryVo(QueryVo vo);
    //查询符合条件的结果数量
    Integer selectCountByQueryVo(QueryVo vo);

}

CustomerDao.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.hytXwz.crm.dao.CustomerDao">

    <!-- 根据条件返回结果集 -->
    <select id="selectRowsByQueryVo" parameterType="QueryVo" resultType="Customer">
        SELECT * FROM customer 
        <where>
            <if test="custName != null and '' != custName">
                cust_name LIKE "%"#{custName}"%"
            </if>
            <if test="custSource != null and '' != custSource">
                and cust_source = #{custSource}
            </if>
            <if test="custIndustry != null and '' != custIndustry">
                and cust_industry = #{custIndustry}
            </if>
            <if test="custLevel != null and '' != custLevel">
                and cust_level = #{custLevel}
            </if>
        </where>
        limit #{startRow}, #{size}
    </select>
    <!-- 根据条件返回结果数量
        这里用count(1)和count(*)都行,没有什么区别
     -->
    <select id="selectCountByQueryVo" parameterType="QueryVo" resultType="Integer">
        SELECT count(1) FROM customer 
        <where>
            <if test="custName != null and '' != custName">
                cust_name LIKE "%"#{custName}"%"
            </if>
            <if test="custSource != null and '' != custSource">
                and cust_source = #{custSource}
            </if>
            <if test="custIndustry != null and '' != custIndustry">
                and cust_industry = #{custIndustry}
            </if>
            <if test="custLevel != null and '' != custLevel">
                and cust_level = #{custLevel}
            </if>
        </where>
    </select>

</mapper>

3.service层 –将Dao从数据库中拿到的数据封装到page对象并且加入size和page(属性)
把每页现实的记录数放到properties文件中使用@value注解拿数据避免硬编码。这里我配置到applicationContext.xml文件中读取properties失败不知道为什么,所以用了@PropertiesResource标签。不过这样更加方便啦

package com.hytXwz.crm.service.impl;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;

import com.hytXwz.common.utils.Page;
import com.hytXwz.crm.dao.CustomerDao;
import com.hytXwz.crm.entity.Customer;
import com.hytXwz.crm.entity.QueryVo;
import com.hytXwz.crm.service.CustomerService;

@PropertySource("classpath:resource.properties")
@Service("customerService")
public class CustomerServiceImpl implements CustomerService {

    @Value("${page.size}")
    private String size;

    @Resource(name="customerDao")
    private CustomerDao customerDao;

    @Override
    public Page<Customer> selectPageByQueryVo(QueryVo vo) {
        Page<Customer> page = new Page<>();
//      page.setSize(5);
        //在QueryVo不为空的前提条件下开始组装page对象
        if(null != vo) {
            //当前页显示的用户信息数size
            vo.setSize(Integer.parseInt(size));
            page.setSize(vo.getSize());
            //当前页数page
            if(null != vo.getPage()) {
                page.setPage(vo.getPage());
                vo.setStartRow((vo.getPage() - 1) * vo.getSize());
            }
            //分页后的结果集
            //1.先对查询条件进行处理
            if(null != vo.getCustName() && "".equals(vo.getCustName())) {
                vo.setCustName(vo.getCustName().trim());
            }
            if(null != vo.getCustSource() && "".equals(vo.getCustSource())) {
                vo.setCustSource(vo.getCustSource().trim());
            }
            if(null != vo.getCustIndustry() && "".equals(vo.getCustIndustry())) {
                vo.setCustIndustry(vo.getCustIndustry().trim());
            }
            if(null != vo.getCustLevel() && "".equals(vo.getCustLevel())) {
                vo.setCustLevel(vo.getCustLevel().trim());
            }
            //2.查询结果集
            page.setRows(customerDao.selectRowsByQueryVo(vo));
            //符合条件的结果总数
            page.setTotal(customerDao.selectCountByQueryVo(vo));
        }
        return page;
    }

}

4、controller层 – 将page对象相应给jsp,实现分页
在从数据库中拿option标签属性时同样用到了@value注解避免硬编码

package com.hytXwz.crm.controller;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.hytXwz.common.utils.Page;
import com.hytXwz.crm.entity.BaseDict;
import com.hytXwz.crm.entity.Customer;
import com.hytXwz.crm.entity.QueryVo;
import com.hytXwz.crm.service.BaseDictService;
import com.hytXwz.crm.service.CustomerService;

@Controller
public class CustomerController {

    //从配置文件中获取的参数
    @Value("${formType.code}")
    private String formTypeCode;
    @Value("${industryType.code}")
    private String industryTypeCode;
    @Value("${levelType.code}")
    private String levelTypeCode;

    //注入service依赖
    @Resource(name="baseDictService")
    private BaseDictService baseDictService;
    @Resource(name="customerService")
    private CustomerService customerService;


    //加载页面
    @RequestMapping("/customer/list")
    public String selectOptions(QueryVo vo, Model model) {
        //加载select标签中的option选项
//      List<BaseDict> fromType = baseDictService.selectBaseDictByTypeCode("001");
//      List<BaseDict> industryType = baseDictService.selectBaseDictByTypeCode("002");
//      List<BaseDict> levelType = baseDictService.selectBaseDictByTypeCode("006");
        //避免硬编码问题从出具库中读取typecode
        List<BaseDict> fromType = baseDictService.selectBaseDictByTypeCode(formTypeCode);
        List<BaseDict> industryType = baseDictService.selectBaseDictByTypeCode(industryTypeCode);
        List<BaseDict> levelType = baseDictService.selectBaseDictByTypeCode(levelTypeCode);
        model.addAttribute("fromType", fromType);
        model.addAttribute("industryType", industryType);
        model.addAttribute("levelType", levelType);
        //加载客户信息 -- 只需要返回一个page对象即可
        Page<Customer> page = customerService.selectPageByQueryVo(vo);
        model.addAttribute("page", page);
        return "customer";
    }

}

这样分页效果就实现啦!
这里写图片描述

    join with me:713788313
简单,简易使用 package auvtech; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; public class PageTag extends TagSupport { private String name="page"; private String action; private int measurement; public void setName(String name) { this.name = name; } public void setAction(String action) { this.action = action; } public void setMeasurement(int measurement) { this.measurement = measurement; } @Override public int doStartTag() throws JspException { try{ JspWriter out = pageContext.getOut(); Pageination page=(Pageination)pageContext.getSession().getAttribute(name); //在page中只有3个属性是已知的,1,一共多少记录,2,一页显示多少记录,3,以及返回的结果集 //1.重新给page分布内容 setPage(page); //2.输出html out.print(getHtml(page)); //3.输出js out.print(getJs(page)); }catch(IOException ioException){ throw new JspException(ioException.getMessage() ); } return(SKIP_BODY); } private void setPage(Pageination page){ if (page.getMaxNoteNum() != 0) { // 一共多少页 if (page.getOnePageMaxNum() != 0&&page.getMaxNoteNum() % page.getOnePageMaxNum() == 0) { page.setMaxPageNum(page.getMaxNoteNum() / page.getOnePageMaxNum()); } else if(page.getOnePageMaxNum()!= 0){ page.setMaxPageNum(page.getMaxNoteNum() / page.getOnePageMaxNum() + 1); } }else { page.setMaxPageNum(0); } //设置当前页记录数目 if(page.getResultList()!= null) page.setCurrentPageNoteNum(page.resultList.size()); else page.setCurrentPageNoteNum(0); } //生成html代码 private String getHtml(Pageination page){ StringBuffer sb = new StringBuffer(); //添加一个尺寸框 sb.append("量度米尺:"); sb.append("<input text='text' id='onePageMaxNum' name='onePageMaxNum' size='2' value='"+page.getOnePageMaxNum()+"'/>"); sb.append("[ 总发信息 ]: " + page.getMaxNoteNum() + "条 ,当前是:第" + page.getCurrentPage() + " 页 / 共 " + page.getMaxPageNum() + "页 本页 " + page.getCurrentPageNoteNum() + " 条"); //首页,上一页,下一页,尾页 if(page.getCurrentPage()>1) sb.append(" <a onclick='firstPage();' style='cursor:pointer'>首页</a>"); else sb.append("首页"); if(page.getCurrentPage()>1) sb.append(" <a onclick='previousPage();' style='cursor:pointer'>上一页</a>"); else sb.append("上一页"); if(page.getCurrentPage()<page.getMaxPageNum()) sb.append(" <a onclick='nextPage();' style='cursor:pointer'>下一页</a>"); else sb.append("下一页"); if(page.getCurrentPage()<page.getMaxPageNum()) sb.append(" <a onclick='lastPage();' style='cursor:pointer'>尾页</a>"); else sb.append("尾页"); //跳转 sb.append(" 跳转到:<select name='goToPage' onchange='javascript:goPage(this.value)'>"); for (int i = 1; i <= page.getMaxPageNum(); i++) { sb.append("<option value=").append(i); if ( i == page.getCurrentPage()){ sb.append(" selected"); } sb.append(">第").append(i).append("页</option>"); } sb.append("</select>"); return sb.toString(); } //生成js代码 private String getJs(Pageination page){ StringBuffer sb=new StringBuffer(); sb.append("<script language=javascript>"); //跳转事件 sb.append("function goPage(cpage){").append("window.location='").append(action); sb.append("?currentPageNum='+").append("cpage"); sb.append("+'&onePageMaxNum='+").append("getMaxNum()"); sb.append(";}"); //得到分页米尺数值 sb.append("function getMaxNum(){"); sb.append("var val=document.getElementById('onePageMaxNum').value;"); sb.append("if(val=='') return "+measurement+";"); sb.append(" return document.getElementById('onePageMaxNum').value"); sb.append(";}\n"); //首页 sb.append("function firstPage(){"); sb.append("var loca='"+action+"?currentPageNum="+1+"&onePageMaxNum='+getMaxNum();"); sb.append("window.location.href=loca;"); sb.append("}\n"); //上一页 sb.append("function previousPage(){"); sb.append("var loca='"+action+"?currentPageNum="+(page.getCurrentPage()-1)+"&onePageMaxNum='+getMaxNum();"); sb.append("window.location.href=loca;"); sb.append("}"); //下一页 sb.append("function nextPage(){"); sb.append("var loca='"+action+"?currentPageNum="+(page.getCurrentPage()+1)+"&onePageMaxNum='+getMaxNum();"); sb.append("window.location.href=loca;"); sb.append("}\n"); //尾页 sb.append("function lastPage(){"); sb.append("var loca='"+action+"?currentPageNum="+page.getMaxPageNum()+"&onePageMaxNum='+getMaxNum();"); sb.append("window.location.href=loca;"); sb.append("}\n"); sb.append("</script>"); return sb.toString(); } }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值