【问题标题】:Is it possible to paginate in jsp with JpaRepository<T, I>是否可以使用 JpaRepository<T, I> 在 jsp 中进行分页
【发布时间】:2019-09-09 12:41:15
【问题描述】:

我是 Spring Boot 新手,

我有一个问题,是否可以用JpaRepository&lt;T, I&gt; 对JSP 中的表格进行分页,我已经在互联网上搜索了两天但没有找到。查询结果主要针对 Thymeleaf,但我不想使用 thymeleaf。我知道如何在 JSP 中使用Jdbctemplate 进行分页,但为此,我必须手动编写查询和页数。我已经写了一个spring boot & JSP代码。

EmployeeRepository:

public interface EmployeeRepository extends JpaRepository<Emp, Integer> {}

员工控制器:

@Controller
public class EmployeeController {

    @Autowired
    private EmployeeRepository repo;

    @GetMapping("/")
    public String showPaginate(Model m, @RequestParam(defaultValue = "0") int page) {
        m.addAttribute("data", repo.findAll(new PageRequest(page, 4)));
        return "index";
    }
}

index.jsp

<table border="2" width="70%" cellpadding="3"
        class="table">
        <thead class="thead-dark">
            <tr align="center">
                <th scope="col">Id</th>
                <th scope="col">Name</th>
                <th scope="col">Designation</th>
                <th scope="col">Edit</th>
                <th scope="col">Delete</th>
            </tr>
        </thead>
        <c:forEach var="emp" items="${list}">
            <tbody>
                <tr align="center">
                    <td>${emp.id}</td>
                    <td>${emp.name}</td>
                    <td>${emp.designation}</td>
                    <td><a href="editemp/${emp.id}" class="btn btn-outline-info">Edit</a></td>
                    <td><a href="deleteemp/${emp.id}" class="btn btn-outline-danger">Delete</a></td>
                </tr>
            </tbody>
        </c:forEach>
    </table>
<hr>
<!-- Pagination code will come here -->

【问题讨论】:

    标签: java spring-boot jsp pagination


    【解决方案1】:

    是的,这是可能的。但首先你必须创建一个PagingAndSortingRepository&lt;T, I&gt; 存储库和控制器的接口,在你的情况下我没有看到一个,你必须添加一个由PagingAndSortingRepository&lt;T, I&gt; 返回的页面、大小、元素、stc 属性,所以你的jsp页面将了解页面的属性等,您可以像${page}一样使用它来显示页码。我指的是这个repository

    员工资料库:

    public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Integer> {}
    

    PagingAndSortingRepository&lt;T, I&gt; 有一个findAll(page) 方法,它根据页面数据传递对象。

    员工道:

    @Service
    public class EmpDao {
    
        @Autowired
        private EmpRepository repo;
    
        public Page<Emp> getPage(Pageable pageable){
            return repo.findAll(pageable);
        }
    

    如果您想要根据页面的对象,那么您必须使用Page&lt;T&gt; 接口,因为页面是对象列表的子列表。它允许获取有关它在包含整个列表中的位置的信息。

    @Controller
    public class EmpController {
    
        @Autowired
        private EmpDao dao;
    
        @RequestMapping("/viewemp")
        public String viewemp(Model m, Pageable pageable){
            Page<Emp> pages=dao.getPage(pageable);
            m.addAttribute("number", pages.getNumber());
            m.addAttribute("totalPages", pages.getTotalPages());
            m.addAttribute("totalElements", pages.getTotalElements());
            m.addAttribute("size", pages.getSize());
            m.addAttribute("data",pages.getContent());
            return "viewemp";
        }
    }
    

    Pageable 是分页信息的抽象接口

    1. getNumber()- 返回当前 Slice 的编号。始终为非负数。
    2. getTotalPages()- 返回总页数。
    3. getTotalElements()- 返回元素的总数。
    4. getSize()- 返回 Slice 的大小。
    5. getContent()- 以列表形式返回页面内容。

    Jsp 页面假设你已经存储了数据。:

    只需将其写在您的表格正文中,即&lt;tbody&gt;

    <tbody id="myTable">
        <c:choose>
            <c:when test="${data.size() > 0 }">
                <c:forEach var="emp" items="${data}">
                    <tr align="center">
                        <td>${emp.id}</td>
                        <td>${emp.name}</td>
                        <td>${emp.designation}</td>
                        <td><a href="editemp/${emp.id}" class="btn btn-outline-info">Edit</a></td>
                        <td><a href="deleteemp/${emp.id}" class="btn btn-outline-danger">Delete</a></td>
                    </tr>
                </c:forEach>
            </c:when>
            <c:otherwise>
                <tr align="center">
                    <td colspan="5">No Users available</td>
                </tr>
            </c:otherwise>
        </c:choose>
    
        <c:if test="${data.size() > 0 }">
            <div class="panel-footer">
                Showing ${number+1} of ${size+1} of ${totalElements}
                <ul class="pagination">
                    <c:forEach begin="0" end="${totalPages-1}" var="page">
                        <li class="page-item">
                            <a href="viewemp?page=${page}&size=${size}" class="page-link">${page+1}</a>
                        </li>
                    </c:forEach>
                </ul>
            </div>
        </c:if>
    
    </tbody>
    

    你很高兴..

    希望对你有帮助..

    【讨论】:

    • JpaRepository 确实扩展了 PagingAndSortingRepository
    【解决方案2】:

    通过这个例子可以确定一些方法。

    public class StudentRepository {
    
        @PersistenceContext
        private EntityManager entityManager;
    
        public List<StudentEntity> listAll()  {
            Query query = entityManager.createQuery("from StudentEntity");
            return query.getResultList();
        }
    }
    

    【讨论】:

      【解决方案3】:

      试试这个:使用 PagingAndSortingRepository 扩展您的 EmployeeRepository。然后把findall()方法类型改成PageRequest findAll(PageRequest pagerequest)。

      public interface EmployeeRepository extends PagingAndSortingRepository<Emp, Integer> {
          PageRequest<Emp> findAll(PageRequest pagerequest)
      }
      

      【讨论】:

      • 那么,我要在jsp中为分页写什么
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多