这是迎合公司需要做的分页功能,大部分代码已经提取到公共部分,只许调用即可。
一。上图
2.js代码
首先,设置datagrid是否显示分页控件 pagination:true;
然后,定义分页事件
//设置分页控件
$('#leftGroupGrid').datagrid('getPager').pagination({
pageSize: 10,//每页显示的记录条数,默认为10
pageList: [5,10,15],//可以设置每页记录条数的列表
beforePageText: '第',//页数文本框前显示的汉字
afterPageText: '页 共 {pages} 页',
displayMsg: '当前显示 {from} - {to} 条记录 共 {total} 条记录',
});
前台工作基本都已弄好,不清楚的可以看下easyui文档。
3,后台。
第一。pager.java实体类
封装了所有pager需要用的字段
/**
* 当前页码
*/
private int currentPageNum;
/**
* 每页展示的数量
*/
private int itemPerPage = PagerConst.PAGE10;
/**
* 数据的总数量
*/
private int totalCount;
/**
* 当前的数据
*/
private List Data;
/**
* 地址
*/
private String baseUrl;
/**
* 展示的页码数量
*/
private int displayPageNum = 10;
/**
* 开始和结束的边界页码数量
*/
private int edgePageNum = 2;
/**
* 总页码
*/
private int totalPage = 1;
/**
* 每页的第一条记录数
*/
private int firstPerPage;
/**
* 每页的最后一条记录数
*/
private int lastPerPage;
/**
* 查询条件
*/
private Map<String,String> condition = new HashMap<String, String>();
第二。PagerHelper.java
这是一个pager帮助类,通过request.getParameter("page")和request.getParameter("rows")分别取到easyui里page和rows,这两个参数是easyui已经定义好了的,只能通过这两个名字取当前页和 每页显示的记录数,PagerConst.PAGE1,PagerConst.PAGE_STR10表示的是两个字符串常量,分别表示1和15
package com.ewolfit.easyframe.util.pager;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
public class PagerHelper
{
public static Pager getPagerInstance(HttpServletRequest request)
{
return getPagerInstance(request, true);
}
public static Pager getPagerInstance(HttpServletRequest request, boolean setParameter)
{
Pager pager = new Pager();
pager.setCurrentPageNum(1);
pager.setBaseUrl(request.getRequestURI());
if(request.getParameter("cpage")!=null)
{
try
{
pager.setCurrentPageNum(Integer.parseInt(request.getParameter("cpage")));
}
catch (Exception e) {
}
}
if(request.getParameter("itemPerPage")!=null)
{
try
{
pager.setItemPerPage(Integer.parseInt(request.getParameter("itemPerPage")));
}
catch (Exception e) {
}
}
//判断easyui分页功能中当前页参数是否存在
if (request.getParameter("page")!=null) {
//当前页
int intPage = Integer.parseInt((request.getParameter("page") == null || request.getParameter("page") == "0") ?PagerConst.PAGE1:request.getParameter("page"));
pager.setCurrentPageNum(intPage);
}
//判断easyui分页功能中每页显示的记录数参数是否存在
if (request.getParameter("rows")!=null) {
//每页显示条数
int number = Integer.parseInt((request.getParameter("rows") == null || request.getParameter("rows") == "0") ? PagerConst.PAGE_STR10:request.getParameter("rows"));
pager.setItemPerPage(number);
}
if(setParameter)
{
Enumeration enumeration = request.getParameterNames();
while(enumeration.hasMoreElements())
{
String key=(String)enumeration.nextElement();
String[] values = request.getParameterValues(key);
if(values.length>1)
{
StringBuffer str = new StringBuffer(100);
for(String s : values)
{
if(!"".equals(s)) str.append(s + ",");
}
pager.addParam(key, str.substring(0, str.length()-1));
}
else
{
if(!"".equals(values[0])) pager.addParam(key, values[0]);
}
pager.removeParam("cpage");
pager.removeParam("itemPerPage");
}
}
request.setAttribute("pager", pager);
return pager;
}
}
第三。先看控制层
groupModel是传进来的参数,
JSONResponseHepler.writeJsonForEasyuiGrid(getResponse(), pager, efList)以json数据返回。
/**
* 查询所有
*/
public void doList() throws IOException {
Pager pager = PagerHelper.getPagerInstance(getRequest());
List<EfDictionaryGroup> efList = efDictionaryGroupService.findByCondition(groupModel,pager);
JSONResponseHepler.writeJsonForEasyuiGrid(getResponse(), pager, efList);
}
JSONResponseHepler.java里的内容
public class JSONResponseHepler {
//将easyui分页对象以json数据返回
public static void writeJsonForEasyuiGrid(HttpServletResponse response,Pager pager,List list){
response.setContentType("text/html;charset=utf-8");
PrintWriter out;
try {
Map<String, Object> jsonMap=new HashMap<String, Object>();
jsonMap.put("total", pager.getTotalCount()); //total键 存放总记录数,必须的
jsonMap.put("rows", list); //rows键 存放每页记录 list
out = response.getWriter();
out.print(JSONUtils.mapToJson(jsonMap));
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
其实可以将这段代码直接放到上面调用部分。
第四。service层调用
@Override
public List<EfDictionaryGroup> findByCondition(EfDictionaryGroupModel model,Pager p) {
return efDictionaryGroupDAO.findByCondition(model, p);
}
第五。Dao层继承了EfBaseDAO类
buildHibernatePager(query, p)执行是hibernate分页方法
public List<EfDictionaryGroup> findByCondition(EfDictionaryGroupModel model,Pager p) {
log.debug("finding all EfDictionaryGroup instances");
try {
StringBuffer queryString = new StringBuffer("from EfDictionaryGroup a where 1=1 ");
//组名
if(!StringUtils.isEmpty(model.getGroupname())){
queryString.append(" and a.groupname = '"+model.getGroupname()+"' ");
}
//类型
if(!StringUtils.isEmpty(model.getType())){
queryString.append(" and a.type = '"+model.getType()+"' ");
}
//字典表类型
if(!StringUtils.isEmpty(model.getDicDicType())){
queryString.append(" and a.dicDicType = '"+model.getDicDicType()+"' ");
}
//备注
if(!StringUtils.isEmpty(model.getRemark())){
queryString.append(" and a.remark like '%"+model.getRemark().trim()+"%' ");
}
//排序(类型,组名,值)
queryString.append(" order by a.dicDicType ,a.type ,a.groupname ");
Query query = getSessionFactory().openSession().createQuery(queryString.toString());
if(p != null)
{
buildHibernatePager(query, p);
}
return query.list();
} catch (RuntimeException re) {
log.error("find all failed", re);
throw re;
}
}
第六。EfBaseDAO.java
query.setFirstResult((pager.getCurrentPageNum() - 1)*pager.getItemPerPage());query.setMaxResults(pager.getItemPerPage())重点,不懂的可以上网查,buildHibernatePager(Query query,Pager pager)方法直接返回从哪条记录开始取数据,然后取多少条记录,返回的还是Query对象。
public class EfBaseDAO extends HibernateDaoSupport {
public static Log log = LogFactory.getLog(EfBaseDAO.class);
protected void buildHibernatePager(Query query,Pager pager){
pager.setTotalCount(query.list().size());
query.setFirstResult((pager.getCurrentPageNum() - 1)*pager.getItemPerPage());
query.setMaxResults(pager.getItemPerPage());
}
protected void closeSessionAndQuery(Session session,Query query){
if(session != null) session.close();
if(query != null) query = null;
}
}
通过上述将返回一个list对象即List<EfDictionaryGroup> efList = efDictionaryGroupService.findByCondition(groupModel,pager)
在通过JSONResponseHepler.writeJsonForEasyuiGrid(getResponse(), pager, efList)封装pager,eflist,返回JSON数据。
分页功能已经结束,但是上面会出现问题,当你重新查询时,request.getParameter("page")和request.getParameter("rows")取到的是没查询之前的pager数据,而不是重新刷新到第一页。
- 下面是解决办法:
在查询按钮事件中加入这几句,就可以解决查询后,从第一页显示
//解决查询时分页对象不能回到首页
$('#leftGroupGrid').datagrid('options').pageNumber = 1;
$('#leftGroupGrid').datagrid('getPager').pagination({pageNumber: 1});