【问题标题】:Spring MVC pagination - display all page numbersSpring MVC 分页 - 显示所有页码
【发布时间】:2016-05-18 22:10:35
【问题描述】:

数据库用户表很大,完成一条select语句需要15分钟 所以我使用这个查询:

select * from ( 
   select * from user order by userId desc 
) where ROWNUM > offset and ROWNUM <= offset + itemsPerPage;

那么我的 DOA 服务方法看起来像

public List<User> getUserRange(int offset 1, limit itemsPerPage){

            mybatis code
.....}

用户对象

public class User{
  String userName;
  String userDOB;
  String userAddress;
  .....setters and getters
}

我想在一个简单的 JSP 页面中显示它,我的问题是互联网上的大多数示例都需要在单个 select 语句中检索用户列表

但我希望 JSP 页面显示所有页码,当用户单击每个页码时,该页码会传递给 getUserRange() 方法,可以呈现新的用户列表。

我确实在 github 上查看了一些标记库,但运气不佳,如果有人能指出我正确的方向,将不胜感激。

【问题讨论】:

  • 您可以使用 Datatables jquery JS 库并使用它的服务器端加载功能。它提供自动分页并提供 ajax 调用功能。易于实施。
  • Kuldeep 是对的,我只是将他的评论扩展为答案

标签: json jsp spring-mvc


【解决方案1】:

有几个选项:

我这里不包含任何示例,因为您可以在每个库的官方网站上找到

老式方式使用displayTag

<dependency>
  <groupId>displaytag</groupId>
  <artifactId>displaytag</artifactId>
  <version>1.2</version>
</dependency>

这是一个面向JSP的实现,没有使用Json,Jquery-UI等新技术,开发似乎不太活跃

流行的方式 使用 jquery-plugin datatables 有人说这是 Java 堆栈最流行的分页插件之一,目前非常活跃,在我看来提供最全面的功能

    <dependency>
        <groupId>org.webjars</groupId>
        <artifactId>datatables</artifactId>
        <version>1.10.11</version>
    </dependency>

   <dependency>
      <groupId>org.webjars</groupId>
      <artifactId>jquery</artifactId>
      <version>2.2.3</version>
   </dependency>

我的做法使用另一个 jquery-plugin jTable

   <dependency>
    <groupId>org.webjars</groupId>
    <artifactId>jTable</artifactId>
    <version>2.4.0</version>
   </dependency>

   <dependency>
    <groupId>org.webjars</groupId>
    <artifactId>jquery-ui</artifactId>
    <version>1.11.4</version>
   </dependency>

比较: jTable 和 datatables 都基于 json 和 jquery,在发布时 这是很时髦的事情,与老式的展示标签相比,设计更好

我发现 jTable 更容易理解,但数据表在我的开发人员中更受欢迎。我当然不推荐使用任何老式的 displayTag 技术

Webjars 如果你们中有人想知道 webjars 是什么,请查看this 简而言之,它会阻止您手动下载 jquery.js 或其他 JavaScript 库并将其放到 /webapp/WEB-INF/*** 文件夹中。通过使用Maven来管理 你所有的网络依赖。

【讨论】:

    【解决方案2】:

    建议

    在我提出建议之前,我想建议您使用 Spring 数据存储库。只需对此进行一些研究,您会惊讶于它对您的帮助。

    回答您的问题

    • SQL 查询
      您的查询闻起来像 ORACLE 查询,我对此不太擅长,但看起来不错。对于查看这篇文章的类似 MySql 的用户,我将使用以下查询:
      SELECT * FROM user limit ?,?(第一个 ? 是 offset,第二个是大小)
    • 模型(最好有一个携带页面数据的对象
      像这样创建一个分页类:

      class Page{
          private Integer offset; //offset
          private Integer size; //how many items per page
          private Integer currentPageNum; //current page number, 1 based
      
          // default construction prohibited
          private Page(){
          }
      
          Public Page(Integer currentPageNum, Integer size){
          this.currentPageNum = currentPageNum;
          this.size = size;
          this.offset = currentPage * size - size; // important 
          }
          // POJO methods ommitted
      }  
      
    • 在您的控制器中(例如 servlet 或 spring 控制器)**

      • 调用 DAO 的方法 getUsersCount() 以便您知道项目(用户)的总数

        // total is used to find our exactly how many
        // pages are there
        // e.g. prev 1,2,3,4,5,6,7,8 next
        // total is 8 in this case
        Integer total = dao.getUserCount();
        
        Integer size = getSizeFromUserInterface...// jsp, predefined, etc..
        
        // find the page numbers 1,2,3,4,6,.. like above
        Integer maxPageNum = total % size == 0 ? (total / size) : (total / size + 1);
        // if total item count is 40, you have 40 users and
        // every page shows 5 users, you will have 8 pages total
        // according to the code above.
        // now you can generate a Interger List that contains the 8
        // page numbers from 1 through 8
        List<Integer> pageNumList = //trivial ommited 
        
        Integer currentPage = getCurrentPageFromUserInterface...// user click on a page number on your website
        Page page = new Page(currentPage, size);
        
        // call another dao method to retrieve the user 
        // according to the page info gathered above
        List<User> userList = dao.getUserRange(page.getOffSet, page.getSize);
        // save the pageNumList and userList and page in request scope
        // and forward to your jsp view, trivial.
        request.set...
        request.set...
        request.set...
        request.getRequestDispatcher("Your view").forward(request,response);
        
    • 在你的视野中
      您将使用请求范围的对象来显示页面导航栏和用户列表。

    • 初始化
      当第一次请求用户列表页面时,您当然需要一个控制器来设置页面属性的默认值。例如pageNum 为 1

    总结

    这个解决方案并不完整或完美,它还有很大的改进空间,例如将userList作为属性放在Page中,将项目总数作为页面中的静态成员以便于以后操作,但是我认为这个想法会引导你走向正确的方向。

    【讨论】:

      【解决方案3】:

      这里是找出总页数的方法 使用的总行数

      select count(*) as total_rows from table_name;
      

      现在调用下面的方法

      setTotal_pages("10",total_rows);
      

      其中 10 是您要显示的内容总数

      public void setTotal_pages(int display_result,int total_rows) {
      
      
          System.out.println("display_result :"+display_result+" total_rows "+total_rows);
      
          int total_pages_temp = total_rows/display_result;
      
          System.out.println("total_pages_temp "+total_pages_temp);
      
      
          if(total_rows % display_result !=0){
              System.out.println(" in if ");
              total_pages_temp = total_pages_temp+1;
      
          }
          System.out.println("total_pages_temp "+total_pages_temp);
          //return total_pages;
      
          total_pages = total_pages_temp;
      }
      

      现在下面的方法将有助于根据 page_number 假设用户现在点击超链接 page _number 2 将这 2 传递给方法 getStaringLimit

      调用下面的方法 int get start_limit = getStaringLimit('2','10');这会给你限制

      //method using for pagination
          public int getStaringLimit(int page_number,int display_counts){
      
              if(page_number==1){
                  return 0;
              }else{
                  //if p.no=2 then (2-1) = 1 then 1*10(where 10 is the display_counts)
                  //so 10 is the starting limit  in pagenumber 2
                  return (page_number-1)*display_counts;
              }
      
          }
      

      现在您只需运行查询

      select * from table_name limit  start_limit,display_counts;
      

      你会根据页码得到结果

      所以首先你必须调用 setTotal_pages(int display_result,int total_rows) 这将返回页数,然后将值设置为 根据pagenmber的超链接之后你必须调用 getStaringLimit(int page_number,int display_counts) 它将返回 起始限制,以便您可以执行选择查询

       select * from table_name limit     start_limit,display_counts;
      

      我会建议你在用户点击页码时使用 ajax

      【讨论】:

        猜你喜欢
        • 2011-08-08
        • 1970-01-01
        • 1970-01-01
        • 2017-06-28
        • 2015-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多