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" rel="external nofollow" rel="external nofollow" >首页</a>
    <c:choose>
      <c:when test="${page.pageNow - 1 > 0}">
        <a href="myProductPage?pageNow=${page.pageNow - 1}" rel="external nofollow" >上一页</a>
      </c:when>
      <c:when test="${page.pageNow - 1 <= 0}">
        <a href="myProductPage?pageNow=1" rel="external nofollow" rel="external nofollow" >上一页</a>
      </c:when>
    </c:choose>
    <c:choose>
      <c:when test="${page.totalPageCount==0}">
        <a href="myProductPage?pageNow=${page.pageNow}" rel="external nofollow" rel="external nofollow" >下一页</a>
      </c:when>
      <c:when test="${page.pageNow + 1 < page.totalPageCount}">
        <a href="myProductPage?pageNow=${page.pageNow + 1}" rel="external nofollow" >下一页</a>
      </c:when>
      <c:when test="${page.pageNow + 1 >= page.totalPageCount}">
        <a href="myProductPage?pageNow=${page.totalPageCount}" rel="external nofollow" rel="external nofollow" >下一页</a>
      </c:when>
    </c:choose>
    <c:choose>
      <c:when test="${page.totalPageCount==0}">
        <a href="myProductPage?pageNow=${page.pageNow}" rel="external nofollow" rel="external nofollow" >尾页</a>
      </c:when>
      <c:otherwise>
        <a href="myProductPage?pageNow=${page.totalPageCount}" rel="external nofollow" rel="external nofollow" >尾页</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 "跳转的页面";
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • ssm实现分页查询的实例

    ssm整合实现分页查询 一.通过limit查询语句实现分页,并展示 1.mapper.xml配置 <select id="selectUsersByPage" parameterType="int" resultMap="UserMap"> SELECT * number from user limit #{page},10 </select> 查询user表,从第page项开始,每次返回10条数据 2.index.jsp

  • SSM使用mybatis分页插件pagehepler实现分页示例

    前几天在这里分享了手写 sql 分页查询实现分页,现在来看看使用 mybatis 分页插件 pagehepler 来实现分页 使用分页插件的原因,简化了sql代码的写法,实现较好的物理分页,比写一段完整的分页sql代码,也能减少了误差性. Mybatis分页插件 demo 项目地址:free-Mybatis_PageHelper_jb51.rar 我这里使用 maven 工程实现: 1.首先导入分页插件的依赖: <dependency> <groupId>com.github.pa

  • java ssm框架实现分页功能的示例代码(oracle)

    java web 实现分页功能,分享给大家,具体如下: 使用框架:ssm 数据库:oracle 话说 oracle 的分页查询比 mysql 复杂多了,在这里简单谈一下: 查询 前十条数据: SELECT * FROM( SELECT ROWNUM WN,RN.* FROM ( SELECT id, title, create_time as createTime, musictor, musictitle FROM krry_blog ORDER BY create_time desc )RN

  • Django 简单实现分页与搜索功能的示例代码

    假设现有需求如下: 需要一个页面分页展示信息,在该页面添加搜索框以提供检索功能. 那么,我们知道,展示信息和检索功能是在同一个页面,也就是共用一个路由. 代码如下: 第一步,写路由:为了清晰,这里只给出主页和展示页面的路由. urls.py: from django.urls import path from . import views from django.conf.urls.static import static from django.conf import settings fro

  • 基于SSM框架实现简单的登录注册的示例代码

    一.环境配置工程目录 在pom.xml添加依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&

  • SSM框架实现分页和搜索分页的示例代码

    分页是Java Web项目常用的功能,昨天在Spring MVC中实现了简单的分页操作和搜索分页,在此记录一下.使用的框架为(MyBatis+SpringMVC+Spring). 首先我们需要一个分页的工具类: 1.分页 import java.io.Serializable; /** * 分页 */ public class Page implements Serializable { private static final long serialVersionUID = -31980484

  • Zend Framework框架实现类似Google搜索分页效果

    本文实例讲述了Zend Framework框架实现类似Google搜索分页效果.分享给大家供大家参考,具体如下: /** * * @param unknown_type $model 表类型 * @param unknown_type $ncontroller 那个控制器提交的controller * @param unknown_type $naction 那个action提交的action */ public function fenyepage2($model,$ncontroller,$

  • ssm框架上传图片保存到本地和数据库示例

    本文介绍了ssm框架上传图片保存到本地和数据库示例,主要使用了Spring+SpringMVC+MyBatis框架,实现了ssm框架上传图片的实例,具体如下: 1.前台部分 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head&g

  • Flask框架运用Ajax实现数据交互的示例代码

    目录 前后端发送字符串 前后端发送JSON数据 发送数据并携带token 收发JSON格式字符串 使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载刷新整个页面,这使得程序能够更快地回应用户的操作,如下笔记将简单介绍使用AJAX如何实现前后端数据通信. 前后端发送字符串 前端代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"

  • GridView高效分页和搜索功能的实现代码

    前言: 公司项目开发,上周的任务是做基础数据的管理.在Sharepoint2010里边内嵌asp.net的aspx页,遇到了各种各样奇葩的问题,因为之前对sharepoint只是有一些了解,但是没有设计到具体的编程工作,这一次算是初次接触吧.其中有一部分基础数据数据量很大,大致有十多万,因为是对基础数据的维护,所以还需要对数据进行列表展示,增删改查什么的,大家都知道Asp.net里边的GridView有自带的分页,但是,那个分页对于少量的数据还好,对于这种数十万的数据量而言,这种分页方式简直就是

  • springmvc 分页查询的简单实现示例代码

    目前较常用的分页实现办法有两种: 1.每次翻页都修改SQL,向SQL传入相关参数去数据库实时查出该页的数据并显示. 2.查出数据库某张表的全部数据,再通过在业务逻辑里面进行处理去取得某些数据并显示. 对于数据量并不大的简单的管理系统而言,第一种实现方法相对来说容易使用较少的代码实现分页这一功能,本文也正是为大家介绍这种方法: 代码片段: 1,Page.java package com.cm.contract.common; import org.apache.commons.lang.Strin

  • 使用ElasticSearch6.0快速实现全文搜索功能的示例代码

    本文不涉及ElasticSearch具体原理,只记录如何快速的导入mysql中的数据进行全文检索. 工作中需要实现一个搜索功能,并且导入现有数据库数据,组长推荐用ElasticSearch实现,网上翻一通教程,都是比较古老的文章了,无奈只能自己摸索,参考ES的文档,总算是把服务搭起来了,记录下,希望有同样需求的朋友可以少走弯路,能按照这篇教程快速的搭建一个可用的ElasticSearch服务. ES的搭建 ES搭建有直接下载zip文件,也有docker容器的方式,相对来说,docker更适合我们

  • vue+iview框架实现左侧动态菜单功能的示例代码

    最近在使用vue-cli3配合iview框架搭建新的项目中用到了iview中的menu菜单,按照官网写法固定不太好,因为一般项目都是从后端动态获取菜单列表,所以我们需要将官网代码稍作修改,代码如下: 注意事项: [1]菜单高亮部分动态绑定路由跳转的页面 Menu组件中有一个active-name反映的是当前高亮区域,因此可以动态的绑定active-name来实现高亮显示.前提是需要将MenuItem绑定的name也设置成页面路由的name [2]动态获取菜单数据,需要更新菜单 this.$nex

随机推荐