博客信息

mvc之通用分页

发布时间:『 2019-03-23 22:38』  博客类别:自定义mvc  阅读(917)
   通用分页核心思路
   将上一次查询请求再发一次,只不过页码变了

1. PageBean
   分页三要素 
   page        页码        视图层传递过来
   rows        页大小      视图层传递过来
   total       总记录数    后台查出来

   pagination  是否分页    视图层传递过来


2. 后台
  2.1 entity
  2.2 dao
      第一次查满足条件的总记录数
      第二次查指定页码并满足条件的记录
      二次查询的条件要一致
  2.3 控制层
      Servlet


3. 视图层
   PageTag
   


4. junit
   java单元测试/白盒测试
   setUp
   tearDown 
   测试用例
   
   -- 符合条件的总记录数
   select count(1) from (select * from t_mvc_book) t;
   -- 从0开始符合条件的记录数
   select * from t_mvc_book limit 10,10
   
通用分页详细思路
1、准备工作(导入现有的工具类包括:数据库连接,字符集处理,字符串帮助类,通用分页实体类,添加junit包,作为调测使用)
2、编码dao层的新增与查询方法(新增在下一个知识点用)
3、使用junit测试写好的两个方法
4、修改sql语句变成带条件查询
5、编写servlet代码
6、在web.xml中配置处理book的servlet以及字符串编码集
7、在jsp添加带条件查询
${pageContext.request.contextPath}


8、将bookdao向上改造成通用的baseDao(生成查询记录数的sql语句,生成分页的sql语句)
9、在basedao中定义内部接口返回
10、将Object类型改成泛型
11、在junit中做测试
  

12、对pagebean增强(添加url、paramMap属性,添加初始化pagebean的方法、最大页、上一页、下一页方法)
13、自定义page分页标签(助手类、tld、jsp引用标签库)
14、将按钮条写入标签助手类
15、将隐藏的form表单写入标签助手类
16、将对应的js代码写入标签助手类
17、测试通用分页是否完善


核心代码如下

public class BaseDao<T> {

	/**
	 * 
	 * @param sql
	 *            决定查询那张表的数据
	 * @param clz
	 *            查询出来的数据封装到那个实体类中
	 * @param pageBean
	 *            决定是否分页
	 * @return
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 * @throws SQLException
	 */
	public List<T> executeQuery(String sql, Class clz, PageBean pageBean)
			throws InstantiationException, IllegalAccessException, SQLException {
		List<T> list = new ArrayList<>();
		Connection con = DBAccess.getConnection();
		PreparedStatement pst = null;
		ResultSet rs = null;
		try {
			if (pageBean != null && pageBean.isPagination()) {
				// 该分页了
				String countSql = getCountSql(sql);
				pst = con.prepareStatement(countSql);
				rs = pst.executeQuery();
				if (rs.next()) {
					pageBean.setTotal(rs.getLong(1) + "");
				}

				String pageSql = getPageSql(sql, pageBean);
				pst = con.prepareStatement(pageSql);
				rs = pst.executeQuery();

			} else {
				pst = con.prepareStatement(sql);
				rs = pst.executeQuery();
			}
			while (rs.next()) {
				// list.add(new Book(rs.getInt("bid"),
				// rs.getString("bname"),
				// rs.getFloat("price")));
				/*
				 * 1、创建了一个Book对象 2、从ResultSet结果集中获取值放入Book对象中属性中 2.1 获取到Book的属性对象 2.2 给属性对象赋值
				 * 3、将已经有值得book对象放入list集合中
				 */
				T t = (T) clz.newInstance();
				Field[] fields = clz.getDeclaredFields();
				for (Field field : fields) {
					field.setAccessible(true);
					field.set(t, rs.getObject(field.getName()));
				}
				list.add(t);
			}
		} finally {
			// shift+al+z
			DBAccess.close(con, pst, rs);
		}
		return list;
	}

	/**
	 * 将原生sql拼接出符合条件的某一页的数据查询sql
	 * 
	 * @param sql
	 * @param pageBean
	 * @return
	 */
	private String getPageSql(String sql, PageBean pageBean) {
		return sql + " limit " + pageBean.getStartIndex() + "," + pageBean.getRows();
	}

	/**
	 * 用原生sql拼接出查询符合条件的记录数
	 * 
	 * @param sql
	 * @return
	 */
	private String getCountSql(String sql) {
		return "select count(1) from (" + sql + ") t";
	}

}


js分页伪代码

<form id='pageBeanForm' action='' method='post'>
		<input type='hidden' name=''> <input type='hidden' name='page'>
	</form>
	
	<div style='text-align: right; font-size: 12px;'>
		每页N条,共N条,第N页,共N页  <a href='javascript:gotoPage(?)'>首页</a>  <a
			href='javascript:gotoPage(?)'>上一页</a>  <a
			href='javascript:gotoPage(?)'>下一页</a>  <a
			href='javascript:gotoPage(?)'>尾页</a>  <input type='text'
			id='skipPage'
			style='text-align: center; font-size: 12px; width: 50px;'>  <a
			href='javascript:skipPage()'>Go</a>
	</div>
	
	<script type='text/javascript'>
		function gotoPage(page) {
			document.getElementById('pageBeanForm').page.value = page;
			document.getElementById('pageBeanForm').submit();
		}
		function skipPage() {
			var page = document.getElementById('skipPage').value;
			if(!page || isNaN(page) || parseInt(page)<1 || parseInt(page)>maxPage){
				alert('请输入1~N的数字');
				return;
			}
			gotoPage(page);
		}
	</script>



关键字:     通用分页  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有