SSM+EasyUI实现分页功能
一、整体的思路
1.前台:使用 EasyUI的 datagrid控件 来将数据渲染。
2.后台Controller层:接受前台穿过来的参数:当前页码,每次查询的数据条数。
3.后台Dao层:进行 limit 限制查询。
二、详解
1.前台 datagrid:
(1)介绍:datagrid,其实也就是一个数据表格,它可以接受从后台传回的数据,并以表格格式显示数据,并为选择、排序、分组和编辑数据提供了丰富的支持。更多功能可以参考EasyUI的官网。
(2)datagrid中的部分常用属性:
上面的属性待会贴代码的时候会有示例。
2.后台Controller层:
一开始我不知道怎么获取前台页面的页码,和查询条数。后来查询才知道,这是不用操心的。
如果不指定,后台会自己获取当前页码,默认查询的数据条数是10。可以在设置datagrid中设置属性:
pageSize:20, 这样后台就会一下子查询 20条数据了。
3.后台Dao层:
这里直接贴代码吧:
<select id="findByPage" resultType="User">
SELECT * FROM gt_user LIMIT #{page},#{rows}
</select>
先说明一点,resultType我直接写User是因为我在mybatis的xml配置文件中定义过别名了。然后也没有parameterType,这里就是我想说明的,一开始我使用的是 parameterType="java.lang.Integer" ,但是报错了。DEBUG o.s.web.servlet.DispatcherServlet - Failed to complete request: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'page' not found. Available parameters are [arg1, arg0, param1, param2]
这个错误是因为这种写法只能传进去一个参数,而我传了两个。解决的方法应该不止一种,我选择了一个较为简便的,但是不知道规不规范,若有不当,还请指正。我的解决办法就是下面的代码了:
List<User> findByPage(@Param("page") int page, @Param("rows") int rows);
添加了 @Param,然后运行成功。
三、代码
1.前台jsp:
$(function () {
$("#dg").datagrid({
title:"用户信息列表",
url:"${contextPage.request.contextPath}/user/userList.action",
method:"POST",
pagination:true,
pageSize:20,
pageList:[10,20,30],
rownumbers:true,
singleSelect:true,
fit:true,
border:false,
idField:"userId",
fitColumns:true, //去除滚动条
columns:[[
{field:'userId',title:'用户ID',width:200,hidden:true,align:'center'},
{field:'userName',title:'用户名',width:200,align:'center'},
{field:'userEmail',title:'邮箱',width:200,align:'center'},
{field:'userPhone',title:'电话号码',width:200,align:'center'},
{field:'userAdmin',title:'身份',width:200,align:'center'}
]]
})
});
</script>
<body>
<table id="dg"> </table>
</body>
2.Controller:
@RequestMapping("/userList")
@ResponseBody
public Map<String,Object> userList(int page,int rows){
List<User> userList = userService.userList(page,rows);
map.put("total",userService.getCount()); //数据记录数
map.put("rows",userList); //数据集合
return map;
}
3.ServiceImpl(接口没啥我就不在这里贴出来了啊):
@Override
public List<User> userList(int page, int rows) {
page = (page-1)*rows;
return userMapper.findByPage(page,rows);
}
这里想补充一句,因为page是页码数,到数据库中查找的时候,会把这个当做查询的起始点,也就是说,第一页从第一条查询,第二页从第二条查询。数据就会出现偏差。 由数学知识可以很容易的推算出两者的关系:查询起始点 = (当前页码 - 1)*每次查询的记录数。
4.Dao层:
UserMapper.java:
List<User> findByPage(@Param("page") int page, @Param("rows") int rows);
UserMapper.xml
<select id="findByPage" resultType="User">
SELECT * FROM gt_user LIMIT #{page},#{rows}
</select>
四、结果展示:
说明:因为测试的时候,好多是真实数据,所有就打码了,不要想歪了哦。(手动滑稽)
额,好像整个页面都变模糊了,但是不影响。。。
有不正确的地方或者不明白的地方,欢迎留言。