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搜索分页
最近做搜索分页的时候,发现第一页显示正常,点击到下一页的时候,显示结果变成了搜索全部内容. 仔细查看代码,发现当第一次输入关键词,提交到查询控制器的时候,表单提交的关键字不为空,可是点击到下一页的时候 ...
随机推荐
- C#调用SQLite报错:无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块
C#调用SQLite数据库,有些情况下会报以下这个错误: 无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块 实际上程序目录中是存在SQLite.Interop.dll这个文 ...
- nodejs学习笔记一( sublime、atom开发环境,http模块,fs模块的初识)
http服务 let server = http.createServer(function(req,res){ }); 监听: server.listen(8080); re ...
- js中json对象数组按对象属性排序
在实际工作经常会出现这样一个问题:后台返回一个数组中有i个json数据,需要我们根据json中某一项进行数组的排序. 例如返回的数据结构大概是这样: { result:[ {id:,name:'中国银 ...
- 基于struts2注解@action的@Result跳转问题——跳转到另一个action
初学ssh 基于注解的方式简单灵活,但是做一个例子的时候,添加用户AddUser 完成后 想页面跳转到 ListUser 这个action, 然后action 成功后 会跳转到list.jsp 显示 ...
- 微信WeUI基础
首先引入样式css和js 虽然基础的其实还有weui.min.css,但是为了一些动态效果,也要引入其他的东西. 基本框架 <!DOCTYPE html> <html lang=&q ...
- SQL Server学习3
SQL Server服务的管理 SQL Server服务 可以提供数据的存储,处理,受控访问,是SQL Server系统最基本的服务 SQL Server Analysis Server服务 为商业智 ...
- unity项目git管理
Unity设置 (关键) Edit -> Project Settings -> Editor -> Version Control Mode 开启 Visible Meta Fil ...
- Mybatis初始
1.Mybatis 的作用 完成基本的sql语句 和 存储过程 高级的对象关系映射(ORM) 框架 封装了几乎所有的 JDBC 代码 参数的手工设置 结果集的遍历 2.Mybatis 框架的主体构成 ...
- MVC官方教程索引
1.MVC教程首页http://www.asp.net/learn/mvc/?lang=cs 2.MVC概况2.1创建一个基于数据库的"电影"web应用http://www.asp ...
- java中接口的定义
使用interface来定义一个接口.接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成.定义接口的基本格式如下: [修饰符] interface 接口名 [ ...