Spring MVC分页 - 显示所有页码

时间:2016-05-18 22:10:36

标签: json jsp spring-mvc

数据库用户表很庞大,完成一个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页面中显示它,我的问题是互联网上的大多数例子都需要在一个选择语句中检索用户列表

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

我确实在github上查看了一些taglib,没有太多运气,如果有人能指出我正确的方向,将非常感激。

3 个答案:

答案 0 :(得分: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和datatable都基于json和jquery 这是非常新潮的事情,与旧式显示标签相比,设计更好。

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

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

答案 1 :(得分:0)

建议

在我提交提案之前,我想建议您使用 Spring数据存储库。只要对此进行一些研究,你会惊讶于它对你有多大帮助。

回答你的问题

  • SQL查询
    你的查询闻起来像ORACLE查询,我不是很擅长,但它看起来很好。对于看过这篇文章的类似MySql的用户,这里是我将使用的查询:
    SELECT * FROM用户限制?,?(第一个是偏移,第二个是大小
  • 模型(最好有一个带有页面数据的对象 像这样创建一个分页类:

    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或弹簧控制器)**

    • 调用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中作为属性,在页面中将项目的总数作为静态成员,以便于以后操作,但我认为这个想法会引导你走向正确的方向。

答案 2 :(得分:0)

  

这是找出获得的总页数的方法   使用

的总行数
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让用户点击超级链接页面_number 2吧   将此2传递给方法getStaringLimit

     

调用下面的方法int get start_limit =   getStaringLimit(&#39; 2&#39;&#39; 10&#39);这将给你极限

//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;
  

您将根据页码

获得结果      

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

 select * from table_name limit     start_limit,display_counts;

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