SSM框架下分页的实现(封装page.java和List<?>)
之前写过一篇博客 java分页的实现(后台工具类和前台jsp页面),介绍了分页的原理。
今天整合了Spring和SpringMVC和MyBatis,做了增删改查和分页,之前的逻辑都写在了Servlet里,
如今用了SSM框架,业务逻辑应该放在业务层(service),
这里有一个小问题:实现分页时,我们需要向页面中传两个参数:
- page对象(封装了页码,页容,总页数,总记录数,取得选择记录的初始位置)
- 集合对象(封装了bean类的信息)
也就是说,我们需要从service层获取到两个值,但是一个函数只有返回值(?),如何解决?
(1)第一种:写两个函数不就行了;
(2)第二种:添加引用;
(3)第三种:封装:
① 将 List 封装到 Page 中
② 新建一个类,封装 Page 和 List
个人认为,分开写比较好(3.2),
1、新建一个 LimitPageList 类
public class LimitPageList {
private Page page;
private List<?> list;
public Page getPage() {
return page;
}
public void setPage(Page page) {
this.page = page;
}
public List<?> getList() {
return list;
}
public void setList(List<?> list) {
this.list = list;
}
}
Page工具类
public class Page implements Serializable {
private static final long serialVersionUID = -3198048449643774660L;
private int pageNow = 1; // 当前页数
private int pageSize = 10; // 每页显示记录的条数
private int totalCount; // 总的记录条数
private int totalPageCount; // 总的页数
@SuppressWarnings("unused")
private int startPos; // 开始位置,从0开始
public Page(){}
//通过构造函数 传入 总记录数 和 当前页
public Page(int totalCount, int pageNow) {
this.totalCount = totalCount;
this.pageNow = pageNow;
}
//取得总页数,总页数=总记录数/每页显示记录的条数
public int getTotalPageCount() {
totalPageCount = getTotalCount() / getPageSize();
return (totalCount % pageSize == 0) ? totalPageCount : totalPageCount + 1;
}
public void setTotalPageCount(int totalPageCount) {
this.totalPageCount = totalPageCount;
}
public int getPageNow() {
return pageNow;
}
public void setPageNow(int pageNow) {
this.pageNow = pageNow;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
//取得选择记录的初始位置
public int getStartPos() {
return (pageNow - 1) * pageSize;
}
}
Page
2、在mapper层实现获取分页记录和获取总的记录数的方法,并在 xml 文件中做实现
public interface StudentMapper {
/**
* 获取分页记录
* @param startPos:从数据库中第几行开始获取
* @param pageSize:获取的条数
* @return 返回pageSize条数据的集合,数据足够多
*/
List<Student> selectByPage(@Param(value = "startPos") Integer startPos,
@Param(value = "pageSize") Integer pageSize);
/**
* 获取数据库总的记录数
* @return 返回数据库表的总条数
*/
int getCount();
}
StudentMapper.java
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.bwlu.mapper.StudentMapper" >
<resultMap id="BaseResultMap" type="com.bwlu.bean.Student" >
<id column="stu_id" property="stu_id" jdbcType="INTEGER" />
<result column="stu_name" property="stu_name" jdbcType="VARCHAR" />
<result column="stu_age" property="stu_age" jdbcType="INTEGER" />
<result column="stu_gender" property="stu_gender" jdbcType="INTEGER" />
</resultMap> <!-- 分页SQL语句 -->
<select id="selectByPage" resultMap="BaseResultMap">
select * from student limit #{startPos},#{pageSize}
</select> <!-- 取得记录的总数 -->
<select id="getCount" resultType="java.lang.Integer">
SELECT COUNT(*) FROM student
</select> </mapper>
StudentMapper.xml
3、在service层添加业务逻辑(方法)
@Autowired
private StudentMapper studentMapper;
/**
* 获取分页记录
* @param pageNow:当前页码,若为null值,则为1
* @return 返回page和list集合
*/
public LimitPageList getLimitPageList(Integer pageNow) {
LimitPageList LimitPageStuList = new LimitPageList();
int totalCount=studentMapper.getCount();//获取总的记录数
List<Student> stuList=new ArrayList<Student>();
Page page=null;
if(pageNow!=null){
page=new Page(totalCount, pageNow);
page.setPageSize(4);
stuList=studentMapper.selectByPage(page.getStartPos(), page.getPageSize());//从startPos开始,获取pageSize条数据
}else{
page=new Page(totalCount, 1);//初始化pageNow为1
page.setPageSize(4);
stuList=studentMapper.selectByPage(page.getStartPos(), page.getPageSize());//从startPos开始,获取pageSize条数据
}
LimitPageStuList.setPage(page);
LimitPageStuList.setList(stuList);
return LimitPageStuList;
}
4、controller实现
@Autowired
private StudentService studentService;
@RequestMapping(value="/show",method=RequestMethod.GET)
public String getStuList(Model m,@RequestParam(value="pageNow",required=false) Integer pageNow){
LimitPageList limitPageStuList = studentService.getLimitPageList(pageNow);
Page page = limitPageStuList.getPage();
//强制类型转换
List<Student> stuList = (List<Student>) limitPageStuList.getList();
m.addAttribute("page", page);
m.addAttribute("stuList", stuList);
return "student/showInfo";
}
5、页面实现
<%@page import="com.bwlu.common.Page"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
String rootPath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<link href="<%=rootPath %>public/css/pageBar.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="<%=rootPath %>public/js/jquery-3.2.1.js"></script>
<script type="text/javascript" src="<%=rootPath %>public/js/jquery-3.2.1.min.js"></script>
</head>
<body>
<div class="page_nav">
<c:choose>
<c:when test="${page.totalPageCount <= 10}"><!-- 如果总页数小于10,则全部显示 -->
<c:set var="begin" value="1"></c:set>
<c:set var="end" value="${page.totalPageCount }"></c:set>
</c:when>
<c:when test="${page.pageNow <= 5 }"><!-- 如果总页数小于5,则显示1-10页 -->
<c:set var="begin" value="1"></c:set>
<c:set var="end" value="10"></c:set>
</c:when>
<c:otherwise><!-- 否则,显示前5页和后5页,保证当前页在中间 -->
<c:set var="begin" value="${page.pageNow-5 }"></c:set>
<c:set var="end" value="${page.pageNow+5 }"></c:set>
<c:if test="${end > page.totalPageCount }"><!-- 如果end值小于总的记录数,则显示最后10页 -->
<c:set var="end" value="${page.totalPageCount}"></c:set>
<c:set var="begin" value="${end-10 }"></c:set>
</c:if>
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${page.pageNow != 1 }"><!-- 如果当前页为1,则不显示首页和上一页 -->
<a href="?pageNow=1">首页</a>
<a href="?pageNow=${page.pageNow-1 }">上一页</a>
</c:when>
</c:choose>
<!-- 遍历页码 -->
<c:forEach begin="${begin }" end="${end }" var="index">
<c:choose>
<c:when test="${page.pageNow == index }"><!-- 如果为当前页,则特殊显示 -->
<a style="height:24px; margin:0 3px; border:none; background:#C00;">${index}</a>
</c:when>
<c:otherwise><!-- 否则,普通显示 -->
<a href="?pageNow=${index }">${index }</a>
</c:otherwise>
</c:choose>
</c:forEach>
<c:choose>
<c:when test="${page.pageNow != page.totalPageCount }"><!-- 如果当前页为总的记录数,则不显示末页和下一页 -->
<a href="?pageNow=${page.pageNow+1 }">下一页</a>
<a href="?pageNow=${page.totalPageCount }">末页</a>
</c:when>
</c:choose>
共${page.totalPageCount }页,${page.totalCount }条记录 到第<input
value="${page.pageNow }" name="pn" id="pn_input" />页 <input
id="pn_btn" type="button" value="确定">
<script type="text/javascript">
//为按钮绑定一个单击响应函数
$("#pn_btn").click(function() {
//获取到要跳转的页码
var pageNow = $("#pn_input").val();
//通过修改window.location属性跳转到另一个页面
window.location = "?pageNow=" + pageNow;
});
</script>
</div>
</body>
</html>
page.jsp
SSM框架下分页的实现(封装page.java和List<?>)的更多相关文章
- SSM框架实现分页
SSM框架实现分页 1,.首先创建一个分页的工具类 package cn.page.po; import java.io.Serializable; public class Page impleme ...
- SSM框架——实现分页和搜索分页
登录|注册 在路上 在路上,要懂得积累:在路上,要学会放下:我在路上!Stay hungry,Stay foolish. 目录视图 摘要视图 订阅 [公告]博客系统优化升级 ...
- 关于在SSM框架下使用PageHelper
首先,如果各位在这块配置和代码有什么问题欢迎说出来,我也会尽自己最大的能力帮大家解答 这些代码我都是写在一个小项目里的,项目的github地址为:https://github.com/Albert-B ...
- ssm框架下怎么批量删除数据?
ssm框架下批量删除怎么删除? 1.单击删除按钮选中选项后,跳转到js函数,由函数处理 2. 主要就是前端的操作 js 操作(如何全选?如何把选中的数据传到Controller中) 3.fun()函数 ...
- java ssm框架实现分页功能 (oracle)
java web 实现分页功能 使用框架:ssm 数据库:oracle 话说 oracle 的分页查询比 mysql 复杂多了,在这里简单谈一下: 查询 前十条数据: SELECT * FROM( S ...
- ssm框架下实现文件上传
1.由于ssm框架是使用Maven进行管理的,文件上传所需要的jar包利用pom.xml进行添加,如下所示: <properties> <commons-fileupload.v ...
- Jquery DataTable AJAX跨域请求的解决方法及SSM框架下服务器端返回JSON格式数据的解决方法
如题,用HBuilder开发APP,涉及到用AJAX跨域请求后台数据,刚接触,费了不少时间.幸得高手指点,得以解决. APP需要用TABLE来显示数据,因此采用了JQ 的DataTable. 在实现 ...
- SSM框架下 Failed to load resource: the server responded with a status of 404 (Not Found)错误
这个错误提示的是js的引用路径有错: 1.检查应用路径是否正确(我的问题是路径是正确的但是去到页面就会提示404错误) 引用路径,最好都使用绝对路径 <script type="tex ...
- SSM框架下的redis缓存
基本SSM框架搭建:http://www.cnblogs.com/fuchuanzhipan1209/p/6274358.html 配置文件部分: 第一步:加入jar包 pom.xml <!-- ...
随机推荐
- TFS中工作项的定制-修改面板
上一篇文章我们讲到了<TFS 中工作项的订制-修改工作流>,工作流只要我们设计出来,就可以进行定制修改了.这次通过简单的案例,了解一下,工作项的面板如何定制. 1.软件准备 ...
- LINux网络的NAPI机制详解一
在查看NAPI机制的时候发现一篇介绍NAPI引入初衷的文章写的很好,通俗易懂,就想要分享下,重要的是博主还做了可以在他基础上任意修改,而并不用注明出处的声明,着实令我敬佩,不过还是附上原文链接! ht ...
- ObjectDetection中的一些名词中英文对照
mAP:mean Average Precision,平均精确度 recall rate:召回率 Loss Function Anchro
- Shiro框架简介
Apache Shiro是Java的一个安全框架.对比另一个安全框架Spring Sercurity,它更简单和灵活. Shiro可以帮助我们完成:认证.授权.加密.会话管理.Web集成.缓存等. A ...
- mysql 约束条件 auto_increment 自动增长 创建表时设置自增字段
auto_increment mysql) )auto_increment; Query OK, rows affected (0.01 sec) mysql> show create tabl ...
- 19.如何在vue里面调用其他js
可以通过把js放到服务器,然后再html文件中通过链接的形式引入,这是目前我试过成功的唯一方法
- Lepus_天兔的安装
一.安装平台 Centos 32位 二.依赖软件 依赖软件包:mysql.php.apache集成在xampp中,python,MySQLdb模块安装包在lepus安装包目录中 以下标红软件是必须安装 ...
- Xcode8免证书生产IPA打包文件
免证书生产IPA打包文件 修改Xcode配置文件: 关闭Xcode.然后打开“其他-终端”,就是命令行工具 cd /Applications/Xcode.app/Contents/Develope ...
- luaIDE选择
luaIDE选择 本人测试过各种luaIDE, 包括luaStudio, 不过我还是推荐eclipse+ldt的方式: http://zengrong.net/post/1951.htm 原因如下: ...
- 【JXL】导出Excel
基本设置 // File file = new File("d:\\writetest.xlsx");// WritableWorkbook wwb = Workbook.crea ...