ssm+Pagination超容易实现,分页功能
我们实现的效果
一,业务逻辑
1,我们的需求是:现有一张用户表(Admin)表,里面包含:
用户昵称(userName),登录用户名(login),邮箱(email)
注册时间(createTime)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Admin {
private Integer id;
private String login;
private String userPswd;
private String userName;
private String email;
private String createTime;
}
2,@Darta等注解不理解的同学,可以去了解一下lombook插件
3,要求:我们的分页功能不但要对所有数据进行分页,还要对查询的条件进行分页,列如:根据userName(昵称) 和 email(邮箱) 和 id(编号)
4,我们这里借助我们的分页插件(pageHelper),使用Maven导入:
<!-- MyBatis 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
二,编写AdnubMapper和sql语句
1,编写AdminMapper接口
@Mapper
public interface AdminMapper {
List<Admin> selectAdminByKeyword(String keyword);//根据关键词进行分页查询
}
2,直接编写查询的Sql语句,至于分页的话,就让我们的分页插件来帮助我们干了。
<select id="selectAdminByKeyword" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/> from t_admin
<where>
login like CONCAT("%",#{keyword},"%") or
user_name like CONCAT("%",#{keyword},"%") or
email like CONCAT("%",#{keyword},"%")
</where>
</select>
我们编写的Sql语句,既可以根据邮箱,还可以根据昵称,还有用户名查询
三,Service层实现分页逻辑
@Service
public class AdminServiceImpl implements AdminService {
@Autowired
AdminMapper adminMapper;
/**
* 关键字分页查询
* @param keyword 查询的关键词
* @param pageNum 页码
* @param pageSize 每页显示的条数
* @return 分页插件实体类,存储了分页的基本信息,和数据
*/
@Override
public PageInfo<Admin> getAdminPage(String keyword, Integer pageNum, Integer pageSize) {
//开启分页功能
PageHelper.startPage(pageNum,pageSize);
//根据关键词查询数据
List<Admin> adminList = adminMapper.selectAdminByKeyword(keyword);
/// ※辅助代码:打印 adminList 的全类名
Logger logger = LoggerFactory.getLogger(AdminService.class);
logger.debug("adminList 的全类名是:"+adminList.getClass().getName());
//将我们的adminList封装为PageInfo
PageInfo<Admin> adminPageInfo = new PageInfo<>(adminList);
return adminPageInfo;
}
}
四,Controller层
@Controller
public class AdminHandler {
@Autowired
AdminService adminService;
@RequestMapping("/admin/page.htm")
public String getAdminPage(
// 注意:页面上有可能不提供关键词,要进行适配
// 在@RequestParam注解中设置defaultValue属性为空字符串表示浏览器不提 供关键词时,keyword 变量赋值为空字符串
@RequestParam(defaultValue = "",value = "keyword")String keyword,
//浏览器没有提供页数,默认第一页
@RequestParam(defaultValue = "1",value = "pageNum")Integer pageNum,
// 浏览器未提供 pageSize 时,默认每页显示 5 条记录
@RequestParam(value = "pageSize",defaultValue = "5")Integer pageSize,
ModelMap modelMap
){
//查询分页数据
PageInfo<Admin> adminPage = adminService.getAdminPage(keyword, pageNum, pageSize);
//将数据存入模型
modelMap.addAttribute(CrowdConstant.ATTR_NAME_PAGE_INFO, adminPage);
return "admin-page";
}
}
每一行都备注了,就不做过多解释
五,admin_page.jsp页面
页面部分,我们需要导入:利用我们的pagination来实现具体效果
<link rel="stylesheet" href="css/pagination.css">
<script type="text/javascript" src="jquery/jquery.pagination.js"></script>
1.html代码
<div id="Pagination" class="pagination">
<!-- 这里显示分页 -->
</div>
2,Js代码
<script>
$(()=>{
initPagination();
})
//加载分页查插件
function initPagination() {
//获取总记录数
var totalRecord=${requestScope.pageInfo.total};
//声明一个JSON对象来存储pagination要设置的属性
var properties={
num_edge_entries:3, // 边缘页数
num_display_entries:5, // 主体页数
callback:pageSelectCallback, // 指定点击分页的时候跳转页面的方法
items_per_page:${requestScope.pageInfo.pageSize}, // 每次显示页数的数量
current_page:${requestScope.pageInfo.pageNum-1}, //pagination使用pageIndex来管理页码。pageIndex从0开始,PageNum从1开始,所以要-1
prev_text:"上一页", // 上一页按钮显示的文本
next_text:"下一页" // 下一页按钮显示的文本
}
//生成页码行条
$("#Pagination").pagination(totalRecord,properties);
}
// 回调函数的含义:声明出来之后不是自己调用,而是交给系统或者框架调用
//用户点击 1,2,3 这样的页码的时候进行跳转
// pageIndex是pagination传给我们的的那个“从0开始"的页码
function pageSelectCallback(pageIndex,jQuery) {
// 根据pageIndex计算pageNum
var pageNum=pageIndex+1;
console.log(pageNum);
// 跳转页码 在这个地方param类死于getParametter("keywork");
location.href="admin/page.htm?pageNum="+pageNum+"&keyword=${param.keyword}";
//由于每一个页码都是超链接,所以在这个函数后要取消超链接行为
return false;
}
</script>
如果觉得有帮助到你,请留下你的赞,以示鼓励
加粗样式