j2ee通用分页 下

目录

1.实体类

 2.dao类

3.工具类(util) 

 4.Jsp页面


1.实体类

  • Book.java 
package com.jmh.entity;

import javax.servlet.http.HttpServletRequest;

/**
 * 实体类
 */
public class Book{
    private int book_id;//编号
    private String book_name;//名称
    private float price;//价格
    private Integer sa;

    public int getBook_id() {
        return book_id;
    }

    public String getBook_name() {
        return book_name;
    }

    public float getPrice() {
        return price;
    }

    public void setBook_id(int book_id) {
        this.book_id = book_id;
    }

    public void setBook_name(String book_name) {
        this.book_name = book_name;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{" +
                "book_id=" + book_id +
                ", book_name='" + book_name + '\'' +
                ", price=" + price +
                '}';
    }

    public Book(int book_id, String book_name, float price) {
        this.book_id = book_id;
        this.book_name = book_name;
        this.price = price;
    }

    public Book() {
    }

}

 2.dao类

  •  BookDao.java
package com.jmh.dao;

import com.jmh.base.BaseDao;
import com.jmh.entity.Book;
import com.jmh.util.CommonUtils;
import com.jmh.util.PageBean;
import com.jmh.util.StringUtils;

import java.lang.reflect.InvocationTargetException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class BookDao extends BaseDao<Book> {
   public List<Book> query(Book b, PageBean pbs){
       //定义基础查询语句
       String sql="select book_id,book_name,price from tb_book where 1=1 ";
       //判断是否符合模糊查询条件     书本名称不为空
       if(StringUtils.isNotBlank(b.getBook_name())){//符合
           //符合就往基础查询语句里面追加模糊查询SQL语句
        sql+=" and book_name like '%"+b.getBook_name()+"%'";
       }

       return  this.exequery(sql, pbs, new callBase<Book>() {
           @Override
           public List rsForeach(ResultSet rs) throws InvocationTargetException, SQLException, InstantiationException, IllegalAccessException, NoSuchMethodException {
               List<Book> books = CommonUtils.toList(rs, Book.class);
               return  books;
           }
       });
   }
}
  •  BaseDao.java
package com.jmh.base;

import com.jmh.util.DBHelper;
import com.jmh.util.PageBean;

import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class BaseDao<T> {
    /**
     * 编写内部接口
     */
    public interface callBase<T>{
        public List<T> rsForeach(ResultSet rs) throws InvocationTargetException, SQLException, InstantiationException, IllegalAccessException, NoSuchMethodException;
    }
    private Connection con;
    private PreparedStatement ps;
    private ResultSet rs;
    private List<T> list;
    public List<T> exequery(String sql, PageBean pb,callBase ca){
    list=new ArrayList<>();
    //创建连接
    con= DBHelper.getConnection();
    try {
    //判断是否符合统计总数据量
        if(null!=pb&&pb.isPageaction()){//如果对象不为空 并且要分页
            ps=con.prepareCall(this.sumCount(sql));
            rs=ps.executeQuery();
            if(rs.next()){
                pb.setTotls(rs.getInt(1));
            }
            //释放资源
            DBHelper.close(null,ps,rs);
        }
    //判断是否符合分页查询
        if(null!=pb&&pb.isPageaction()){//如果对象不为空 并且要分页
            sql=this.pageIng(sql,pb);
        }
        ps=con.prepareCall(sql);
        rs=ps.executeQuery();
        //返回 回去
        return  ca.rsForeach(rs);
    }catch (Exception e){
        e.printStackTrace();
    }finally {
        DBHelper.close(con,ps,rs);
    }
        return  list;
    }

    /**
     * 统计总数据量
     * @param sql 查询语句
     * @return 查询语句
     */
    public String sumCount(String sql){
        String sumCount=" select count(0) from ( "+sql+" ) e";
        //System.out.println("总数据量==="+sumCount);
        return sumCount;
    }

    /**
     * 分页查询语句
     * @param sql
     * @param pb
     * @return
     */
    public String pageIng(String sql,PageBean pb){
        String pageIng=sql+" limit "+(pb.getPage()-1)*pb.getRows()+" , "+pb.getRows();
       // System.out.println("分页==="+pageIng);
        return pageIng;
    }
}

3.工具类(util) 

  • CommonUtils.java
package com.jmh.util;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 获取查询全部的方法
 */
public class CommonUtils {
    public static <T> List<T> toList(ResultSet rs,Class<T> ca) throws SQLException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
        //1.实例化集合
        List<T> list=new ArrayList<T>();
        //2.获取结果集、集合
        ResultSetMetaData me = rs.getMetaData();
        //3.获取所有属性 根据类方法
        Field[] fe = ca.getDeclaredFields();
        //开始遍历
        while(rs.next()){
            //根据类方法获取对象
            T t = ca.newInstance();
            //遍历结果集、集合获取列名
            for (int i=0;i<me.getColumnCount();i++){
                //获取列名
                String colName = me.getColumnLabel(i + 1);
                //遍历获取到的所有属性
                for (Field f:fe) {
                    //获取属性名
                    String fName = f.getName();
                    //比较属性名和列明是否一致
                    if(colName.equals(fName)){//代表一致
                        //拼接成方法
                        String setName = "set" + fName.substring(0, 1).toUpperCase() + fName.substring(1);
                        //获取方法
                        Method meName = ca.getDeclaredMethod(setName, f.getType());//参数方法名、参数类型
                        //设置访问权限
                        meName.setAccessible(true);
                        //开始调用方法
                        Object invoke = meName.invoke(t, rs.getObject(colName));
                    }
                }
            }
           //System.out.println("对象==="+t);

            list.add(t);
        }
        return list;

    }
}
  • EncodingFilter.java
package com.jmh.util;

import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 中文乱码处理
 * 
 */
public class EncodingFilter implements Filter {

	private String encoding = "UTF-8";// 默认字符集

	public EncodingFilter() {
		super();
	}

	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;

		// 中文处理必须放到 chain.doFilter(request, response)方法前面
		res.setContentType("text/html;charset=" + this.encoding);
		if (req.getMethod().equalsIgnoreCase("post")) {
			req.setCharacterEncoding(this.encoding);
		} else {
			Map map = req.getParameterMap();// 保存所有参数名=参数值(数组)的Map集合
			Set set = map.keySet();// 取出所有参数名
			Iterator it = set.iterator();
			while (it.hasNext()) {
				String name = (String) it.next();
				String[] values = (String[]) map.get(name);// 取出参数值[注:参数值为一个数组]
				for (int i = 0; i < values.length; i++) {
					values[i] = new String(values[i].getBytes("ISO-8859-1"),
							this.encoding);
				}
			}
		}

		chain.doFilter(request, response);
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		String s = filterConfig.getInitParameter("encoding");// 读取web.xml文件中配置的字符集
		if (null != s && !s.trim().equals("")) {
			this.encoding = s.trim();
		}
	}

}
  •  PageBean.java
package com.jmh.util;

import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Map;

/**
 * 分页工具类
 * @author 蒋明辉
 *
 */
public class PageBean{
	private Integer page=1;//当前页码 默认为第一页
	private Integer rows=10;//页大小 默认页大小为10条
	private Integer totls=0;//总数据量 默认为0
	private boolean pageaction=true;//判断是否要分页 默认要分页
	private String url;//请求路径
	private Map<String, String[]> map;//请求参数、保存请求的参数
	public PageBean() {
	}

	public PageBean(Integer page, Integer rows, Integer totls, boolean pageaction, String url, Map<String, String[]> map) {
		this.page = page;
		this.rows = rows;
		this.totls = totls;
		this.pageaction = pageaction;
		this.url = url;
		this.map = map;
	}

	public Integer getPage() {
		return page;
	}
	public void setPage(Integer page) {
		this.page = page;
	}
	public void setPage(String page) {
		if(null!=page){
			this.page = Integer.parseInt(page);
		}
	}
	public Integer getRows() {
		return rows;
	}
	public void setRows(Integer rows) {
		this.rows = rows;
	}
	public void setRows(String rows) {
		if(null!=rows){
			this.rows = Integer.parseInt(rows);
		}
	}
	public Integer getTotls() {
		return totls;
	}
	public void setTotls(Integer totls) {
		this.totls = totls;
	}
	public void setTotls(String totls) {
		if(null!=totls){
			this.totls = Integer.parseInt(totls);
		}
	}
	public boolean isPageaction() {
		return pageaction;
	}
	public void setPageaction(boolean pageaction) {
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}

	public Map<String, String[]> getMap() {
		return map;
	}

	public void setMap(Map<String, String[]> map) {
		this.map = map;
	}

	@Override
	public String toString() {
		return "PageBean [page=" + page + ", rows=" + rows + ", totls=" + totls + ", pageaction=" + pageaction
				+ ", url=" + url + ", map=" + map + "]";
	}
	/**
	 * 初始化PageBase方法
	 */
	public void initPageBase(HttpServletRequest req){
		//设置页码
		this.setPage(req.getParameter("page"));
		//设置页大小
		this.setRows(req.getParameter("rows"));
		//设置总数量
		this.setTotls(req.getParameter("totls"));
		//设置是否分页
		this.setPageaction(Boolean.parseBoolean(req.getParameter("pageaction")));
		//设置URL
		this.setUrl(req.getRequestURI());
		//设置map集合
		this.setMap(req.getParameterMap());
	}
	/**
	 * 上一页的方法
	 */
	public int getPrePage(){
		if(this.page==1){
			return this.page;
		}
		return this.page-1;
	}
	/**
	 * 最大页码的方法
	 */
	public int getMaxPage(){
		int page=this.totls/this.rows;
		if(this.totls%this.rows!=0){
			page++;
		}
		return page;
	}
	/**
	 * 下一页的方法
	 */
	public int getNextPage(){
		int next=this.page+1;
		if(this.page==getMaxPage()){
			return this.page;
		}
		return this.page+1;
	}

}
  •  PageTag.java
package com.jmh.util;

import java.io.IOException;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;

import com.jmh.util.PageTag;

public class PageTag extends BodyTagSupport {
	private PageBean pageBean;

	public PageTag() {
		super();
	}

	public PageBean getPageBean() {
		return pageBean;
	}

	public void setPageBean(PageBean pageBean) {
		this.pageBean = pageBean;
	}

	@Override
	public int doStartTag() throws JspException {
		JspWriter out = pageContext.getOut();
		try {
			out.println(toHtml());
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		return super.doStartTag();
	}
	
	
	private String toHtml() {
		//pageBean为空或者 不分页
		if(null==pageBean || !pageBean.isPageaction()) {
			return "";
		}
		StringBuilder sb = new StringBuilder();
		//拼接form表单
		/*<form action="${pageBean.url}" method="post" id="pageBeanForm">
		<!-- 设置页码 -->
		<input type="hidden" name="page"/>
	    <!-- 参数列表 -->
		</form>*/
		sb.append("<form action=\""+pageBean.getUrl()+"\" method=\"post\" id=\"pageBeanForm\">");
		sb.append("<input type=\"hidden\" name=\"page\"/>");
		
		//参数列表
		
		Map<String, String[]> map = pageBean.getMap();
		String name =null;
		String[] values = null;
		// bookName = '不短命'  hobby="篮球"  hobby="足球" page="2"
		Set<Entry<String, String[]>> entrySet = map.entrySet();
		for (Entry<String, String[]> entry : entrySet) {
			name = entry.getKey();
			if(name.equals("page")) {
				continue;
			}
			values = entry.getValue();
			for (String value : values) {
				
				//<input type="hidden" name="bookName" valu="不短命"/>
				//<input type="hidden" name="hobby" valu="篮球"/>
				//<input type="hidden" name="hobby" valu="足球"/>
				sb.append("<input type=\"hidden\" name=\""+name+"\" value=\""+value+"\"/>");
			}
		}
		sb.append("</form>");
		
		
		//拼接div部分
		/*<div style="width:100%;text-align: right;">
		第几页/总共多少页,共多少条记录 
		<a href="javascript:gotoPage(1)">首页</a>&nbsp;
		<a href="javascript:gotoPage(${pageBean.getPreviousPage()})">上一页</a>&nbsp;
		<a href="javascript:gotoPage(${pageBean.getNextPage()})">下一页</a>&nbsp;
		<a href="javascript:gotoPage(${pageBean.getMaxPage()})">末页</a>&nbsp;
		<input type="text" id="skipPage" style="width:30px;"/>&nbsp;
		<a href="javascript:skipPage(${pageBean.getMaxPage()})">GO</a>
	
	
	
		</div>*/
		sb.append("<div style=\"width:100%;text-align: right;\">");
		sb.append("第"+pageBean.getPage()+"页/总共"+pageBean.getMaxPage()+"页,共"+pageBean.getTotls()+"条记录 ");
		
		//首页  上一页
		if(pageBean.getPage()!=1) {
			sb.append("<a href=\"javascript:gotoPage(1)\">首页</a>&nbsp;\r\n" + 
					"		<a href=\"javascript:gotoPage("+pageBean.getPrePage()+")\">上一页</a>&nbsp;");
		}else {
			sb.append("<a>首页</a>&nbsp;<a>上一页</a>&nbsp;");
		}
		
		
		//末页 下一页
		
		if(pageBean.getPage()!=pageBean.getMaxPage()) {
			sb.append("<a href=\"javascript:gotoPage("+pageBean.getNextPage()+")\">下一页</a>&nbsp;\r\n" + 
					"		<a href=\"javascript:gotoPage("+pageBean.getMaxPage()+")\">末页</a>&nbsp;");
		}else {
			sb.append("<a>下一页</a>&nbsp;<a>末页</a>&nbsp;");
		}
		
		//跳转页
		sb.append("<input type=\"text\" id=\"skipPage\" style=\"width:30px;\"/>&nbsp;");
		sb.append("<a href=\"javascript:skipPage()\">GO</a>");
		sb.append("</div>");
		
		//拼接js
		/*<script type="text/javascript">
		function gotoPage(page) {
			document.getElementById('pageBeanForm').page.value=page;
			document.getElementById('pageBeanForm').submit();
		}
		function skipPage(maxPage) {
			var page = document.getElementById('skipPage').value;
			if(isNaN(page) || page<1 || page>maxPage){
				alert("请输入1-"+maxPage+"的数字");
				return false;
			}
			gotoPage(page);
		}
		</script>*/
		
		sb.append("<script type=\"text/javascript\">\r\n" + 
				"	function gotoPage(page) {\r\n" + 
				"		document.getElementById('pageBeanForm').page.value=page;\r\n" + 
				"		document.getElementById('pageBeanForm').submit();\r\n" + 
				"	}\r\n" + 
				"	function skipPage() {\r\n" + 
				"		var page = document.getElementById('skipPage').value;\r\n" + 
				"		if(isNaN(page) || page<1 || page>"+pageBean.getMaxPage()+"){\r\n" + 
				"			alert(\"请输入1-\"+"+pageBean.getMaxPage()+"+\"的数字\");\r\n" + 
				"			return false;\r\n" + 
				"		}\r\n" + 
				"		gotoPage(page);\r\n" + 
				"	}\r\n" + 
				"\r\n" + 
				"</script>");
		
		
		return sb.toString();
	}
	
	
}
  •  StringUtils.java
package com.jmh.util;

public class StringUtils {
	// 私有的构造方法,保护此类不能在外部实例化
	private StringUtils() {
	}

	/**
	 * 如果字符串等于null或去空格后等于"",则返回true,否则返回false
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isBlank(String s) {
		boolean b = false;
		if (null == s || s.trim().equals("")) {
			b = true;
		}
		return b;
	}
	
	/**
	 * 如果字符串不等于null或去空格后不等于"",则返回true,否则返回false
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isNotBlank(String s) {
		return !isBlank(s);
	}

}

 4.Jsp页面

  •  indexTwo.jsp
<%--
  Created by IntelliJ IDEA.
  User: 蒋明辉
  Date: 2022/7/1
  Time: 19:41
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="l" uri="/zking" %>
<html>
<head>
    <title>书本主页</title>
</head>
<%--编写js代码
<script type="text/javascript">
    function gotopage(page) {
        //获取表单编号
        document.getElementById("formName").page.value=page;
        //再次调用方法
        document.getElementById("formName").submit();
    }
    //指定跳转页码
    function zhiding(maxPage) {
        //获取文本框的值
        var sa=document.getElementById("sa").value;
        console.info(sa)
        //判断
        if(isNaN(sa)||sa<1||sa>maxPage){
            alert('请输入1-'+maxPage+'的页数');
            return false;
        }
        //调用方法
        gotopage(sa);
    }
</script>--%>
<body>
<%--判断如果指定的数据为空就跳转页面--%>
<c:if test="${empty query}">
    <jsp:forward page="/bookServlet.do"></jsp:forward>
</c:if>
<%--再次发出请求
<div>
    <form id="formName">
        <input type="hidden" name="page" />
    </form>
</div>--%>
    <h1>书本主页</h1>
    <%--模糊查询组件--%>
    <div align="center">
        <form action="<%=request.getContextPath()%>/bookServlet.do" method="post">
            书本名称:<input type="text" name="book_name" />&nbsp;
            <button type="submit">查询</button>
        </form>
    </div>
    <div align="center">
        <table border="2px" width="100%">
            <tr style="text-align: center">
                <td>书本编号</td>
                <td>书本名称</td>
                <td>书本价格</td>
            </tr>
            <%--开始遍历--%>
            <c:forEach items="${query}" var="sa">
                <tr style="text-align: center">
                    <td>${sa.book_id}</td>
                    <td>${sa.book_name}</td>
                    <td>${sa.price}</td>
                </tr>
            </c:forEach>
        </table>
    </div>
    <%--分页组件--%>
<%--    <div align="right">
        <a href="#">当前第${pageBase.page}页/${pageBase.totls}条数据</a>&nbsp;
        <a href="javascript:gotopage(1);">首页</a>&nbsp;
        <a href="javascript:gotopage(${pageBase.prePage});">上一页</a>&nbsp;
        <a href="javascript:gotopage(${pageBase.nextPage});">下一页</a>&nbsp;
        <a href="javascript:gotopage(${pageBase.maxPage});">尾页</a>
        <input id="sa" type="text" style="width: 50px;text-align: center" />&nbsp;<a href="javascript:zhiding(${pageBase.maxPage});">跳转</a>
    </div>--%>
<div>
    <l:page pageBean="${pageBase}"/>
</div>
    ${pageBase}
</body>
</html>

效果图


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值