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 <!-- ...
随机推荐
- 前端开发 - JavaScript - 总结
一.JavaScript的特征 javaScript是一种web前端的描述语言,也是一种基于对象(object)和事件驱动(Event Driven)的.安全性好的脚本语言.它运行在客户端从而减轻服务 ...
- 剑指Offer——表示数值的字符串
题目描述: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3. ...
- perl 常用命令
过滤重复字符 perl -e '$_=<STDIN>; @in = split; if (@in < 100){ @out = grep {! $hash{$_}++ } @in; ...
- LocalActivityManager与ActivityGroup
Helper class for managing multiple running embedded activities in the same process. This class is no ...
- 1. testNG+Maven 环境搭建
一:使用的工具 : TestNG 6.9.10 Maven 3.5 IDEA 二:创建maven项目,在pom.xml添加依赖 <?xml version="1.0" enc ...
- mysql union (all) 后order by的排序失效问题解决
上sql select * FROM ( SELECT SUM(c.overtime_num) AS delay_num, ) rate , '全网' as reaCodeFROM calc_vmap ...
- Oracle中to_number()函数的用法
to_number()函数是oracle中常用的类型转换函数之一,是将一些处理过的按一定格式编排过的字符串变回数值型的格式. 1.to_number()函数可以将char或varchar2类型的str ...
- MySQL协议分析(1)
MySQL协议分析 此阶段的协议分析是在未压缩未加密情况下的协议分析 思路: 结合Oracle官网和自己用wireshark抓的网络数据包进行协议分析 官网说明 mysql包共分为4段,格式如下: 第 ...
- #运算符、不同的指针类型、数组和指针、指针运算、堆、栈、静态区、只读区、下标VS指针
#运算符:用于在预编译期将宏参数转换为字符串 #define CONVERS(x) #x //注:没用双引号包括. 不同类型的指针占用的内存空间大小相同. 局部变量 定义: a[5]; 打印a[ ...
- NAND flash学习所获----(Zac)
Nand Falsh外围电路:peripheral circuit 1.Nand flash里至少有2个state Machine(controller),即2个主控. 一个主控:负责处理前端事情. ...