在Spring MVC和Hibernate应用程序中的JSP页面中实现分页

duk*_*ble 6 spring jsp hibernate spring-mvc twitter-bootstrap

我正在尝试在我的JSP页面中实现分页.我正在使用Spring MVC和Hibernate.java代码部分没问题但我在JSP页面中实现它有困难.我正在使用twitter bootstrap.

这是我到目前为止所做的事情:

<div class="container">
    <table class="table table-hover">
        <th>First Name</th>
        <th>Last Name</th>
        <th>Age</th>
        <c:forEach items="${employees}" var="emp">
        <tr>
            <td>${emp.firstName}</td>
            <td>${emp.lastName}</td>
            <td>${emp.Age}</td>
        </tr>
        </c:forEach>
    </table>

    <div class="pagination">
        <ul>
            <li class="disabled"><a href="#">First</a></li>
            <li class="disabled"><a href="#">Prev</a></li>
            <li class="active"><a href="#">1</a></li>
            <li class="active"><a href="#">2</a></li>
            <li class="active"><a href="#">3</a></li>
            <li class="active"><a href="#">4</a></li>
            <li class="active"><a href="#">5</a></li>
            <li class="active"><a href="#">Next</a></li>
            <li class="active"><a href="#">Last</a></li>
        </ul>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

这是我的控制器中的相关代码:

@RequestMapping(value = "/list", method = RequestMethod.GET)
    public String getEmployees(ModelMap model) {
            **//I believe I should get the page number from the JSP here but how?**
        model.addAttribute("employees", this.employeeService.getEmployees(page));
        return "listing";
}
Run Code Online (Sandbox Code Playgroud)

这是我的Service类中的相关代码:

public List<Employee> getEmployees(int page) {
        return employeeDao.getEmployeeList(page);
}
Run Code Online (Sandbox Code Playgroud)

这是我的DAO类中的相关代码:

private static final int limitResultsPerPage = 3;

public List<Employee> getEmployeeList(int page) {
        Query q = sessionFactory.getCurrentSession().createQuery(
                "from Employee");
        q.setFirstResult(page * limitResultsPerPage); 
        q.setMaxResults(limitResultsPerPage);
        return (List<Employee>) q.list();
}
Run Code Online (Sandbox Code Playgroud)

我显示该表的页面是list.jsp

以下是我应该做什么的假设,但不知道如何(如果我采取错误的方式,请纠正我):

修改我的菜单中指向list.jsp的链接到list.jsp?page = 0,所以每次用户点击链接时,他都会到达第一页.

当用户单击其中一个按钮时,我需要将页码传递给我的控制器,这样我就可以设法通过查询返回正确的"员工".

如您所见,First和Previous按钮被取消激活,因为我当前在第一页上.所以我的问题是,我应该如何处理这些按钮的激活/停用,以及下一个和最后一个按钮?

另外,如何"刷新"列表中的数字?例如,如果用户在第20页,我将不会显示从1到19的按钮?

Vin*_*nie 6

至少回答你的一个问题:

您可以使用RequestParam注释将页面编号和其他参数从JSP传递到控制器,如下所示:

  @RequestMapping(value = "/list", method = RequestMethod.GET)
  public String getEmployees(@RequestParam(value = "page", required = false) Long page, ModelMap model) {
        //now page is available.
    model.addAttribute("employees", this.employeeService.getEmployees(page));
    return "listing";
  }
Run Code Online (Sandbox Code Playgroud)

你的链接看起来像这样:

  list/?page=1
Run Code Online (Sandbox Code Playgroud)

分页是一个相当复杂的过程,但这里有一些想法.您可以在JSP页面上使用JSTL来实现逻辑.例如:

    <c:if test="${page > 1}">
       <li class="active"><a href="#">First</a></li>
    </c:if>
Run Code Online (Sandbox Code Playgroud)

我建议您在Action中对要显示的页数进行一些计算.比如说你总是想要显示十个链接.在第1页上,您将显示页面1 ... 10,在第7页上,您将显示页面2 ... 12,依此类推.在操作中,您可以确定要显示的起始页和结束页.

      int startpage = page - 5 > 0?page - 5:1;
      int endpage = startpage + 10;
Run Code Online (Sandbox Code Playgroud)

在JSP页面上你可以做一个循环:

    <c:forEach begin="${startpage}" end="${endpage}" var="p">
         <a href="#">${p}</a>
    </c:forEach>
Run Code Online (Sandbox Code Playgroud)

等等.