前言
由于分页要整理的东西较多,所以昨天刚好整理好,今天给大家分享出来
分页准备
这里是分页准备工作的博文---->通用分页
分页代码优化
优化点一:
之前的分页,我是把分页初始化在servlet层进行的,定的是固定值,现在我是存入一个请求,在pageBean实体类直接加上这个方法:
// pagebean初始化
public void setRequest(HttpServletRequest request,PageBean pageBean) {
pageBean.setPage(request.getParameter("page"));
pageBean.setRows(request.getParameter("rows"));
pageBean.setPagination(request.getParameter("pagination"));
//获取项目的请求地址---->(相当于绝对路径)
pageBean.setUrl(request.getContextPath()+request.getServletPath());
//获取请求的所有数据
pageBean.setParameterMap(request.getParameterMap());
}
优化点二:通用功能类BaseDao遍历使用反射优化
package com.xiaoyang.test.dao;
/**
*
* @author xiaoyang
* 2020年4月22日
* 用来做通用分页
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FilterInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.annotation.WebServlet;
import com.xiaoyang.test.entity.Job;
import com.xiaoyang.test.util.DBAccess;
import com.xiaoyang.test.util.PageBean;
public class BaseDao<k> {
public List<k> executeQuery(String sql, PageBean pageBean, Class clz) {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
if (null != pageBean && pageBean.isPagination()) {
try {
con = DBAccess.getConnection();
String countSql = this.getCountSql(sql);
ps = con.prepareStatement(countSql);
rs = ps.executeQuery();
if (rs.next()) {
int total = rs.getInt(1);// 总记录数
pageBean.setTotal(total);// 给pagebean的总记录数赋值
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
DBAccess.close(null, ps, rs);
}
}
// 2.查询指定页码并满足条件的总记录数
try {
if(con==null) {
con=DBAccess.getConnection();
}
String pageSql =sql;
if(null!=pageBean&&pageBean.isPagination()) {
pageSql = this.getPageSql(sql, pageBean);
}
ps = con.prepareStatement(pageSql);
rs = ps.executeQuery();
// 不同内容
List<k> list=new ArrayList<k>();
k k;
while(rs.next()) {
//反射实例化
k =(k)clz.newInstance();
//反射获取所有属性对象
Field[] fields = clz.getDeclaredFields();
//遍历
for (Field field : fields) {
//给私有属性权限
field.setAccessible(true);
//给属性对象赋值
field.set(k, rs.getObject(field.getName()));
}
list.add(k);
}
return list;
} catch (Exception e) {
throw new RuntimeException();
} finally {
DBAccess.close(con, ps, rs);
}
}
/**
* 专门写一个方法用来拼接查询语句的统计满足条件的总行数
*
* @param sql
* @return
*/
public String getCountSql(String sql) {
return "select count(*) from (" + sql + ") t1";
}
/**
* 专门写一个方法用来存储拼接分页的sql
*
* @param sql
* @param pageBean
* @return
*/
public String getPageSql(String sql, PageBean pageBean) {
return sql + " limit " + pageBean.getStartsIndex() + "," + pageBean.getRows();
}
}
这里用反射进行遍历好处就是:
/**
* 查询方法 模糊查询和查询全部
*
* @param stu
* @return
*/
public List<Job> find(Job job, PageBean pageBean) {
List<Job> jobList = new ArrayList<Job>();
String sql = "select * from t_solr_job where 1=1 ";
return executeQuery(sql, pageBean, Job.class);
}
查询方法只有两行代码,瞬间感觉代码少了很多,之前每个属性遍历赋值真的很麻烦
优化点三:结合自定义标签类开发通用分页标签:
package com.xiaoyang.test.tag;
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.xiaoyang.test.util.PageBean;
public class PageTag extends BodyTagSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
//定义pageBean数属性
private PageBean pageBean;
public PageBean getPageBean() {
return pageBean;
}
public void setPageBean(PageBean pageBean) {
this.pageBean = pageBean;
}
public PageTag() {}
@Override
public int doStartTag() throws JspException {
// TODO Auto-generated method stub
JspWriter out = pageContext.getOut();
try {
out.println(toHtml());
} catch (IOException e) {
throw new RuntimeException(e);
}
return SKIP_BODY;
}
public String toHtml() {
StringBuffer bf=new StringBuffer();
//生产分页按钮
bf.append("当前第:"+this.pageBean.getPage()+"页 共"+this.pageBean.getMaxPage()+"页 共"+this.pageBean.getTotal()+"条");
bf.append("<a href='javascript:doForward(1)'>首页</a>");
bf.append("<a href='javascript:doForward("+this.pageBean.getFrontPage()+")'>上一页</a>");
bf.append("<a href='javascript:doForward("+this.pageBean.getNextPage()+")'>下一页</a>");
bf.append("<a href='javascript:doForward("+this.pageBean.getMaxPage()+")'>末页</a>");
bf.append("<input type='text' id='gotoPage'><a href='javascript:gotoPage()'>go..</a>");
//生成分页的表单
bf.append("<form id='form' action='"+this.pageBean.getUrl()+"' method='post'>");
bf.append("<input id='page' type='hidden' name='page' />");
Map<String, String[]> parameterMap=pageBean.getParameterMap();
Set<Entry<String, String[]>> entrySet = parameterMap.entrySet();
for (Entry<String, String[]> entry : entrySet) {
String name=entry.getKey();
String values[]=entry.getValue();
if(name.equals("page")) {
continue;
}
for(String value : values) {
bf.append("<input type='hidden' name='"+name+"' value='"+value+"'/>");
}
}
bf.append("</form>");
//生产js
bf.append("<script type='text/javascript'>\r\n" +
" function doForward(page){\r\n" +
" console.info(page);\r\n" +
" document.getElementById('page').value=page;\r\n" +
" document.getElementById('form').submit();\r\n" +
" }\r\n" +
" \r\n" +
" function gotoPage(){\r\n" +
" var page=document.getElementById('gotoPage').value;\r\n" +
" if(isNaN(page)){\r\n" +
" alert(\"请输入一个数字\");\r\n" +
" }else if(page<1 || page>"+this.pageBean.getMaxPage()+"){\r\n" +
" alert(\"请输入1-"+this.pageBean.getMaxPage()+"之间的数字\");\r\n" +
" }else{\r\n" +
" doForward(page) \r\n" +
" }\r\n" +
" }\r\n" +
" </script> ");
return bf.toString();
}
}
使用了自定义标签后,只需配置一下tld文件,直接在页面引用:
<%@taglib prefix="z" uri="/xiaoyang" %>//头部引用
<z:page pageBean="${pageBean }"></z:page>//页面引用
最后附上后台处理分页代码和效果图:
package com.xiaoyang.Job.action;
import java.io.IOException;
import java.util.List;
import javax.servlet.*;
import com.xiaoyang.*;
public class BookServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.设置编码
req.setCharacterEncoding("utf-8");
HttpSession session = req.getSession();
//2.
//分页对象
PageBean pageBean = new PageBean();
//将请求存入分页中
pageBean.setRequest(req,pageBean);
//将pageBean分页数据存入请求
req.setAttribute("pageBean", pageBean);
//3.调用查询方法
//获取方法
List<Job> jobList = jd.find(job, pageBean);
//4.将查询出的集合放到session作用域中
session.setAttribute("jobList", jobList );
req.getRequestDispatcher("jobList.jsp").forward(req, resp);
}
}
功能流程图解
尾言
好了,通用分页已经搞定了,过两天我会把完整源码分享出来,溜了溜了…