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搜索分页
最近做搜索分页的时候,发现第一页显示正常,点击到下一页的时候,显示结果变成了搜索全部内容. 仔细查看代码,发现当第一次输入关键词,提交到查询控制器的时候,表单提交的关键字不为空,可是点击到下一页的时候 ...
随机推荐
- BZOJ1050 旅行comf(kruskal)
旅行comf 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大边和最小边 ...
- 解决 swap file “*.swp”already exists!问题
用vim编辑文件实际上是先copy一份临时文件,病映射到内存给你编辑,编辑的是临时文件,当执行:w后才保存临时文件到原文件,执行:q后才删除临时文件. 每次启动检索是否有临时文件,有就询问如何处理, ...
- Connection to https://dl-ssl.google.com refused的解决办法
使用SDK Manager.exe安装Android开发环境的时候会遇到: Fetching https://dl-ssl.google.com/android/repository/addons_l ...
- 详解 Webpack+Babel+React 开发环境的搭建
1.认识Webpack 构建应用前我们先来了解一下Webpack, Webpack是一个模块打包工具,能够把各种文件(例如:ReactJS.Babel.Coffeescript.Less/Sass等) ...
- Spring---AOP与DI的初步理解
依赖注入 依赖注入并没有我们听上去那么复杂,在项目中应用依赖注入,会使代码变的异常简单,更易于理解和测试. 任何一个有实际意义的应用,都是多个类组成,这些类之间相互协作,来实现特定的业务逻辑,通常,每 ...
- wpf 窗口最小化后,触发某事件弹出最小化窗口并置顶
//如果窗口最小化了弹出并置顶----事件触发调用 ShowWindowAsync(new System.Windows.Interop.WindowInteropHelper(CommonHelpe ...
- [javaEE] response实现图片下载
在Servlet中的doGet()方法中 获取FileInputStream对象,new出来,构造参数:String的文件路径 得到文件路径,调用this.getServletContext().ge ...
- 三、cent OS安装配置nginx
简介Tengine是淘宝发起的web服务器项目,简单的讲就是对nginx进行了二次开发并提供了更丰富的功能,官网地址:http://tengine.taobao.org/ 下载nginx这里使用淘宝二 ...
- GIT使用log命令显示中文乱码
背静: 公司项目使用GIT进行代码同步. 问题: 之前代码提交后,有中文备注,但是在使用git log查看代码历史记录的时候发现显示乱码,如下: 后查询相关资料,现将解决办法总结如下: 1.运行Git ...
- 4 springboot 集成swagger2
Swagger:实时生成在线接口文档,方便测试和沟通 官网地址:https://swagger.io/ 引入依赖 <dependency> <groupId>io.spring ...