SSM框架——实现分页和搜索分页
版权声明:本文为博主原创文章,欢迎转载,请注明地址。
分页是JAVA WEB项目常用的功能,昨天在Spring MVC中实现了简单的分页操作和搜索分页,在此记录一下。使用的框架为(MyBatis+SpringMVC+Spring)。
首先我们需要一个分页的工具类:
1.分页
- import java.io.Serializable;
- /**
- * 分页
- */
- public class Page implements Serializable {
- private static final long serialVersionUID = -3198048449643774660L;
- private int pageNow = 1; // 当前页数
- private int pageSize = 4; // 每页显示记录的条数
- private int totalCount; // 总的记录条数
- private int totalPageCount; // 总的页数
- @SuppressWarnings("unused")
- private int startPos; // 开始位置,从0开始
- @SuppressWarnings("unused")
- private boolean hasFirst;// 是否有首页
- @SuppressWarnings("unused")
- private boolean hasPre;// 是否有前一页
- @SuppressWarnings("unused")
- private boolean hasNext;// 是否有下一页
- @SuppressWarnings("unused")
- private boolean hasLast;// 是否有最后一页
- /**
- * 通过构造函数 传入 总记录数 和 当前页
- * @param totalCount
- * @param pageNow
- */
- public Page(int totalCount, int pageNow) {
- this.totalCount = totalCount;
- this.pageNow = pageNow;
- }
- /**
- * 取得总页数,总页数=总记录数/总页数
- * @return
- */
- 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;
- }
- /**
- * 取得选择记录的初始位置
- * @return
- */
- public int getStartPos() {
- return (pageNow - 1) * pageSize;
- }
- public void setStartPos(int startPos) {
- this.startPos = startPos;
- }
- /**
- * 是否是第一页
- * @return
- */
- public boolean isHasFirst() {
- return (pageNow == 1) ? false : true;
- }
- public void setHasFirst(boolean hasFirst) {
- this.hasFirst = hasFirst;
- }
- /**
- * 是否有首页
- * @return
- */
- public boolean isHasPre() {
- // 如果有首页就有前一页,因为有首页就不是第一页
- return isHasFirst() ? true : false;
- }
- public void setHasPre(boolean hasPre) {
- this.hasPre = hasPre;
- }
- /**
- * 是否有下一页
- * @return
- */
- public boolean isHasNext() {
- // 如果有尾页就有下一页,因为有尾页表明不是最后一页
- return isHasLast() ? true : false;
- }
- public void setHasNext(boolean hasNext) {
- this.hasNext = hasNext;
- }
- /**
- * 是否有尾页
- * @return
- */
- public boolean isHasLast() {
- // 如果不是最后一页就有尾页
- return (pageNow == getTotalCount()) ? false : true;
- }
- public void setHasLast(boolean hasLast) {
- this.hasLast = hasLast;
- }
- }
有了这个工具类后,首先编写MyBatis的XxxxMapper.xml配置文件中的SQL语句,如下:
- <!-- 分页SQL语句 -->
- <select id="selectProductsByPage" resultMap="返回值类型">
- select
- *
- from 表名 WHERE user_id = #{userId,jdbcType=INTEGER} limit #{startPos},#{pageSize}
- </select>
- <!-- 取得记录的总数 -->
- <select id="getProductsCount" resultType="long">
- SELECT COUNT(*) FROM 表名 WHERE user_id = #{userId,jdbcType=INTEGER}
- </select>
此处我们可以看到,2个<select>需要分别传入3个和1个参数,此时在对应的DAO文件IXxxxDao中编写接口来编写对应的方法,方法名和mapper.xml中的id属性值一致:
- /**
- * 使用注解方式传入多个参数,用户产品分页,通过登录用户ID查询
- * @param page
- * @param userId
- * @return startPos},#{pageSize}
- */
- public List<Products> selectProductsByPage(@Param(value="startPos") Integer startPos,@Param(value="pageSize") Integer pageSize,@Param(value="userId") Integer userId);
- /**
- * 取得产品数量信息,通过登录用户ID查询
- * @param userId
- * @return
- */
- public long getProductsCount(@Param(value="userId") Integer userId);
接口定义完成之后需要编写相应的业务接口和实现方法,在接口中定义这样一个方法,然后实现类中覆写一下:
- /**
- * 分页显示商品
- * @param request
- * @param model
- * @param loginUserId
- */
- void showProductsByPage(HttpServletRequest request,Model model,int loginUserId);
接下来实现类中的方法就是要调用DAO层和接受Controller传入的参数,进行业务逻辑的处理,request用来获取前端传入的参数,model用来向JSP页面返回处理结果。
- @Override
- public void showProductsByPage(HttpServletRequest request, Model model,int loginUserId) {
- String pageNow = request.getParameter("pageNow");
- Page page = null;
- List<ProductWithBLOBs> products = new ArrayList<ProductWithBLOBs>();
- int totalCount = (int) productDao.getProductsCount(loginUserId);
- if (pageNow != null) {
- page = new Page(totalCount, Integer.parseInt(pageNow));
- allProducts = this.productDao.selectProductsByPage(page.getStartPos(), page.getPageSize(), loginUserId);
- } else {
- page = new Page(totalCount, 1);
- allProducts = this.productDao.selectProductsByPage(page.getStartPos(), page.getPageSize(), loginUserId);
- }
- model.addAttribute("products", products);
- model.addAttribute("page", page);
- }
接下来是控制器的编写,当用户需要跳转到这个现实产品的页面时,就需要经过这个控制器中相应方法的处理,这个处理过程就是调用业务层的方法来完成,然后返回结果到JSP动态显示,服务器端生成好页面后传给客户端(浏览器)现实,这就是一个MVC过程。
- /**
- * 初始化 “我的产品”列表 JSP页面,具有分页功能
- *
- * @param request
- * @param model
- * @return
- */
- @RequestMapping(value = "映射路径", method = RequestMethod.GET)
- public String showMyProduct(HttpServletRequest request, Model model) {
- // 取得SESSION中的loginUser
- User loginUser = (User) request.getSession().getAttribute("loginUser");
- // 判断SESSION是否失效
- if (loginUser == null || "".equals(loginUser)) {
- return "redirect:/";
- }
- int loginUserId = loginUser.getUserId();
- //此处的productService是注入的IProductService接口的对象
- this.productService.showProductsByPage(request, model, loginUserId);
- return "跳转到的JSP路径";
- }
JSP页面接受部分我就不写了,每个人都一样,也就是结合JSTL和EL来写,(在循环输出的时候也做了判断,如果接受的参数为空,那么输出暂无商品,只有接受的参数不为空的时候,才循环输出,使用<<c:when test="${}">结合<c:otherwise>),这里只给出分页的相关代码:
- <!-- 分页功能 start -->
- <div align="center">
- <font size="2">共 ${page.totalPageCount} 页</font> <font size="2">第
- ${page.pageNow} 页</font> <a href="myProductPage?pageNow=1">首页</a>
- <c:choose>
- <c:when test="${page.pageNow - 1 > 0}">
- <a href="myProductPage?pageNow=${page.pageNow - 1}">上一页</a>
- </c:when>
- <c:when test="${page.pageNow - 1 <= 0}">
- <a href="myProductPage?pageNow=1">上一页</a>
- </c:when>
- </c:choose>
- <c:choose>
- <c:when test="${page.totalPageCount==0}">
- <a href="myProductPage?pageNow=${page.pageNow}">下一页</a>
- </c:when>
- <c:when test="${page.pageNow + 1 < page.totalPageCount}">
- <a href="myProductPage?pageNow=${page.pageNow + 1}">下一页</a>
- </c:when>
- <c:when test="${page.pageNow + 1 >= page.totalPageCount}">
- <a href="myProductPage?pageNow=${page.totalPageCount}">下一页</a>
- </c:when>
- </c:choose>
- <c:choose>
- <c:when test="${page.totalPageCount==0}">
- <a href="myProductPage?pageNow=${page.pageNow}">尾页</a>
- </c:when>
- <c:otherwise>
- <a href="myProductPage?pageNow=${page.totalPageCount}">尾页</a>
- </c:otherwise>
- </c:choose>
- </div>
- <!-- 分页功能 End -->
2.查询分页
关于查询分页,大致过程完全一样,只是第三个参数(上面是loginUserId)需要接受用户输入的参数,这样的话我们需要在控制器中接受用户输入的这个参数(页面中的<input>使用GET方式传参),
然后将其加入到SESSION中,即可完成查询分页(此处由于“下一页”这中超链接的原因,使用了不同的JSP页面处理分页和搜索分页,暂时没找到在一个
JSP页面中完成的方法,出现了重复代码,这里的重复代码就是输出内容的那段代码,可以单独拿出去,然后用一个<include>标签加载到
需要的JSP页面就可以了,这样可以避免代码重复):
这里给出控制器的代码作为参考:
- /**
- * 通过 产品名称 查询产品
- * @param request
- * @param model
- * @return
- */
- @RequestMapping(value = "映射地址", method = RequestMethod.GET)
- public String searchForProducts(HttpServletRequest request, Model model) {
- HttpSession session = request.getSession();
- String param = request.getParameter("param");
- String condition = (String) session.getAttribute("condition");
- //先判断SESSION中的condition是否为空
- if (condition == null) {
- condition = new String();
- session.setAttribute("condition", condition);
- //如果Session中的condition为空,再判断传入的参数是否为空,如果为空就跳转到搜索结果页面
- if (param == null || "".equals(param)) {
- return "private/space/ProductSearchResult";
- }
- }
- //如果SESSION不为空,且传入的搜索条件param不为空,那么将param赋值给condition
- if (param != null && !("".equals(param))) {
- condition = param;
- session.setAttribute("condition", condition);
- }
- //使用session中的condition属性值来作为查询条件
- this.productService.showSearchedProductsByPage(request, model, condition);
- return "跳转的页面";
- }

- 顶
- 11
- 踩
- 0
我的同类文章
J2EE(9)
- •SSM框架——以注解形式实现事务管理2014-07-25阅读4766
- •使用maven创建web项目2014-07-18阅读66879
- •SSM框架——SpringMVC中使用@ResponseBody注解返回值,Ajax取得中文乱码解决方法2014-07-10阅读3504
- •SSM框架——使用MyBatis Generator自动创建代码2014-04-17阅读53820
- •HTTP协议详解2014-02-05阅读834
- •SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)2014-07-19阅读82898
- •网站过滤器Filter2014-07-12阅读1338
- •EL表达式中的数字类型2014-06-04阅读1024
- •JSP中的pagaEncoding和contentType中charset的区别2014-03-16阅读1553
- 猜你在找
- 6楼 qq_28227689 4天前 11:04发表 [回复]

- 大神求源代码,邮箱1905646586@qq.com,跪求啊,谢谢了
- 5楼 qq_32072065 2016-06-17 16:18发表 [回复]

- 利害 1093619789@qq.com
- 4楼 qq_32072065 2016-06-17 14:40发表 [回复]

- 搜索分页
- 2楼 qq_16639791 2016-04-05 08:26发表 [回复]

- 1535231035@qq.com,谢谢
- 1楼 qq_16603207 2015-12-15 16:14发表 [回复]

- 求源码,发到我的邮箱81734911@qq.com 谢谢了
核心技术类目
Hadoop
AWS
移动游戏
Java
Android
iOS
Swift
智能硬件
Docker
OpenStack
VPN
Spark
ERP
IE10
Eclipse
CRM
JavaScript
数据库
Ubuntu
NFC
WAP
jQuery
BI
HTML5
Spring
Apache
.NET
API
HTML
SDK
IIS
Fedora
XML
LBS
Unity
Splashtop
UML
components
Windows Mobile
Rails
QEMU
KDE
Cassandra
CloudStack
FTC
coremail
OPhone
CouchBase
云计算
iOS6
Rackspace
Web App
SpringSide
Maemo
Compuware
大数据
aptech
Perl
Tornado
Ruby
Hibernate
ThinkPHP
HBase
Pure
Solr
Angular
Cloud Foundry
Redis
Scala
Django
Bootstrap
- 文章分类
- 阅读排行
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)(82977)
- MyEclipse+Tomcat+MAVEN+SVN项目完整环境搭建(82756)
- 使用maven创建web项目(66939)
- SSM框架——使用MyBatis Generator自动创建代码(53866)
- Log4j配置详解(14468)
- MyEclipse安装JS代码提示(Spket插件)(12052)
- SSM框架——实现分页和搜索分页(5512)
- Android学习——百度地图开发定位与显示Demo(5343)
- SSM框架——以注解形式实现事务管理(4767)
- 设计模式——装饰模式(Decorator)(4206)
- 评论排行
- 最新评论
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
Sysecho:
学长就是学长,大神就是大神,哈哈。你的代码暴露了你的学校~~~~~ - SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
deng20160807:
怎么没有转载么,楼主 - SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
deng20160807:
不错,学习学习 - SSM框架——实现分页和搜索分页
alining_1:
求源码 ,1501911035@qq.com,谢谢 - SSM框架——实现分页和搜索分页
Alan_DM:
89680252@qq.com - SSM框架——实现分页和搜索分页
Alan_DM:
能不能给个源码谢谢了 - SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
小萝卜头17:
问个问题,dao层查询如何获得一个sqlsession呢,还是你有其他操作方式 - SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
bvgfww2:
大神厉害! 解决了! - SSM框架——实现分页和搜索分页
qq_28227689:
大神求源代码,邮箱1905646586@qq.com,跪求啊,谢谢了 - SSM框架——使用MyBatis Generator自动创建代码
qq_25246661:
不错不错解决了很多问题
SSM框架——实现分页和搜索分页的更多相关文章
- ssm框架查询数据并实现分页功能示例
/** * DataGrid对象 * */ @SuppressWarnings("rawtypes") public class DataGrid { private int to ...
- SSM框架三分钟搞定分页查询
使用的国产第三方jar pagehelper 里面的基本属性值 //当前页 private int pageNum; //每页的数量 private int pageSize; //当前页的数量 ...
- SSM框架手动实现分页逻辑(非PageHelper)
第一种方法:查询出所有数据再分页 分析: 分页时,需要获得前台传来的两个参数,分别为pageNo(第几页数据),pageSize(每页的条数); 根据这两个参数来计算出前端需要的数据是查出数据list ...
- Yii 框架ajax搜索分页
要想实现ajax搜索分页 其实很简单 第一步:在 Yii 框架自带的搜索和分页正常运行的情况下,在视图层
- SSM框架实现分页
SSM框架实现分页 1,.首先创建一个分页的工具类 package cn.page.po; import java.io.Serializable; public class Page impleme ...
- java ssm框架实现分页功能 (oracle)
java web 实现分页功能 使用框架:ssm 数据库:oracle 话说 oracle 的分页查询比 mysql 复杂多了,在这里简单谈一下: 查询 前十条数据: SELECT * FROM( S ...
- 基于asp.net + easyui框架,一步步学习easyui-datagrid——实现分页和搜索(二)
http://blog.csdn.net/jiuqiyuliang/article/details/19967031 目录: 基于asp.net + easyui框架,一步步学习easyui-data ...
- SSM框架下分页的实现(封装page.java和List<?>)
之前写过一篇博客 java分页的实现(后台工具类和前台jsp页面),介绍了分页的原理. 今天整合了Spring和SpringMVC和MyBatis,做了增删改查和分页,之前的逻辑都写在了Servle ...
- php搜索分页
最近做搜索分页的时候,发现第一页显示正常,点击到下一页的时候,显示结果变成了搜索全部内容. 仔细查看代码,发现当第一次输入关键词,提交到查询控制器的时候,表单提交的关键字不为空,可是点击到下一页的时候 ...
随机推荐
- 【Sublime】Sublime插件
alignmentcodecs33convertToUtf8sublimeAstyleFormattersublimeLintersublimeLInter-contrib-clangtagInput ...
- JAVA的NIO的新特性和小Demo,进一步了解NIO
1.为什么要用NIO NIO 的创建目的是为了让 Java 程序员可以实现高速 I/O 而无需编写自定义的本机代码.NIO 将最耗时的 I/O 操作(即填充和提取缓冲区)转移回操作系统,因而可以极大地 ...
- media(适配)
媒体类型 1.all 所有媒体 2.braille 盲文触觉设备 3.embossed 盲文打印机 4.print 手持设备 5.projection 打印预览 ...
- ubuntu关闭时间同步与centos更改时间
环境:ubuntu 源于一次项目需要修改系统时间,但是每次修改后又被同步回网络时间,找了好久发现是这个原因: NTP即Network Time Protocol(网络时间协议),是一个互联网协议,用于 ...
- [中英对照]The Art Of Reporting Bugs | 报bug的艺术
前言:因为最近要给兄弟Team分享一下如何有效地报告bug, 故多做一做功课.下面给出一篇博客的中英文对照翻译. The Art Of Reporting Bugs | 报bug的艺术 My init ...
- Linux笔记-Linux命令初解2
在看linux过程中,文件属性管理是一个难点,因而作为初学者的我来说,我直接将其放在后面来慢慢研究,因而我个人觉得先学习后面一些知识点之后,回过头来将一些你所不懂的去解透,这是极好的意见事情.对了,我 ...
- mysql-5.6.31安装(单实例 Linux)
安装版本:mysql-5.6.31 安装环境:Linux RHEL6.5.x86 安装要求:单实例,端口为默认:3306 (1) 要求安装Mysql数据库版本号及包名为:my ...
- XAMPP环境的搭建
XAMPP是一个强大的集成软件包(什么是集成软件包?就是多个软件打包一起安装了,比如office办公软件包括了word.Excel.PPT) XAMPP包括了Apache,MySQL,PHP,Perl ...
- ASP.NET Button控件的UseSubmitBehavior属性引发的血案
这里先不说标题上的UseSubmitBehavior属性是什么,先说下面这种情况. 通常,在我们写一个表单页面的时候,最下方会有“提交”和“返回”字样的两个按钮.顾名思义,它们的功能大家都知道,但是一 ...
- [javaSE] 异常捕获
异常:程序在运行时出现的不正常现象 Throwable |——Error |——Exception 严重级别:Error类和Exception类 异常的处理:try{}catch{}finally{} ...
目录视图
摘要视图
订阅

