1.访问index.jsp 页面
    2、idnex.jsp 页面发送查询员工列表请求
    3、EmployeeController来接受请求,查出emp数据
    4、来到list.jsp页面来展示

    URI: /emps

    1.导入mybatis的pageHalper

    1. <!--引入pageHelper分页插件 -->
    2. <dependency>
    3. <groupId>com.github.pagehelper</groupId>
    4. <artifactId>pagehelper</artifactId>
    5. <version>5.0.0</version>
    6. </dependency>

    2.配置插件

    1. <plugins>
    2. <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
    3. </plugins>

    3.进行分页查询

    1. /**
    2. * 查询 emps (分页查询)
    3. * @return
    4. */
    5. @RequestMapping("/emps")
    6. public String getEmps(@RequestParam(value = "pn",defaultValue = "1") Integer pn,
    7. Model model){
    8. // 这不是一个分页查询
    9. // 引入 PageHalper 分页插件
    10. // 在查询之前调用,传入页码,每页的大小
    11. PageHelper.startPage(pn,5);
    12. // startPage 后面紧跟着查询就是一个分页查询
    13. List<Employee> emps = employeeService.getAll();
    14. // 使用 pageInfo 包装查询后的结果,只需要将 pageInfo 交给页面就行
    15. // 封装了详细的分页信息,包括查询出来的数据 传入连续显示的页面
    16. PageInfo page = new PageInfo(emps,5);
    17. model.addAttribute("pageInfo",page);
    18. return "list";
    19. }

    4.spring的单元测试

    1. package com.atguigu.crud.test;
    2. /**
    3. * 使用 Spring 的单元测试,测试crud请求的准确性
    4. * spring4 测试需要servlet3.0
    5. * @author 温笙
    6. * @date 2021/8/31
    7. */
    8. @RunWith(SpringJUnit4ClassRunner.class)
    9. @WebAppConfiguration
    10. @ContextConfiguration(locations = {"classpath:applicationContext.xml","file:src/main/webapp/WEB-INF/dispatcherServlet-servlet.xml"})
    11. public class MVCTest {
    12. //传入springmvc的ioc
    13. @Autowired
    14. WebApplicationContext context;
    15. //虚假的mvc请求,获取处理结果
    16. MockMvc mockMvc;
    17. @Before
    18. public void initMockMvc(){
    19. mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
    20. }
    21. @Test
    22. public void testPage() throws Exception {
    23. // 模拟请求拿到返回值
    24. MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/emps").param("pn", "5"))
    25. .andReturn();
    26. // 请求成功会在请求域中会有pageInfo,可以验证
    27. MockHttpServletRequest request = result.getRequest();
    28. PageInfo pageInfo = (PageInfo) request.getAttribute("pageInfo");
    29. System.out.println("当前页码:"+pageInfo.getPageNum());
    30. System.out.println("总页码:"+pageInfo.getPages());
    31. System.out.println("总记录数:"+pageInfo.getTotal());
    32. System.out.println("在页面需要连续现实的页码:"+pageInfo.getNavigatepageNums());
    33. // 获取emp数据
    34. List<Employee> list = pageInfo.getList();
    35. for (Employee emp : list) {
    36. System.out.println("id:"+emp.getdId()+" "+emp.getEmpName());
    37. }
    38. }
    39. }
    1. <%@ page import="org.apache.taglibs.standard.lang.jstl.test.PageContextImpl" %>
    2. <%@ page import="org.springframework.context.ApplicationContext" %>
    3. <%@ page import="com.github.pagehelper.PageInfo" %>
    4. <%@ page import="com.atguigu.crud.bean.Employee" %>
    5. <%@ page import="java.util.List" %><%--
    6. Created by IntelliJ IDEA.
    7. User: 温笙
    8. Date: 2021/8/30
    9. Time: 18:31
    10. To change this template use File | Settings | File Templates.
    11. --%>
    12. <%@ page language="java" contentType="text/html; charset=UTF-8"
    13. pageEncoding="UTF-8"%>
    14. <%@ page isELIgnored="false" %>
    15. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    16. <html>
    17. <head>
    18. <title>employees</title>
    19. <%
    20. application.setAttribute("PATH",request.getContextPath());
    21. %>
    22. <%-- web 路径
    23. 不以/ 开头的相对路径,找资源,以当前资源的路径为基准,经常容易出问题
    24. 以/ 开头的相对路径:找资源,以服务器的路径为标准;
    25. http://1.117.141.225:3306/ssm(需要加上项目名才能找到)
    26. --%>
    27. <%--引入jq--%>
    28. <script type="text/javascript" src="${PATH}/static/js/jquery-1.12.4.min.js"></script>
    29. <%--引入样式--%>
    30. <link href="${PATH}/static/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">
    31. <script src="${PATH}/static/bootstrap-3.3.7-dist/js/bootstrap.min.js" type="text/javascript"></script>
    32. </head>
    33. <body>
    34. <%
    35. PageInfo<Employee> pageInfo = (PageInfo<Employee>) request.getAttribute("pageInfo");
    36. List<Employee> list = pageInfo.getList();
    37. for (Employee emp : list) {
    38. System.out.println(emp.getDepartment());
    39. }
    40. %>
    41. <%--搭建显示页面--%>
    42. <div class="container">
    43. <%--标题行--%>
    44. <div class="row">
    45. <div class="col-md-12">
    46. <h1>SSM-CRUD</h1>
    47. </div>
    48. </div>
    49. <%--两个按钮--%>
    50. <div class="row">
    51. <div class="col-md-4 col-md-offset-8">
    52. <button class="btn btn-primary">新增</button>
    53. <button class="btn btn-danger">删除</button>
    54. </div>
    55. </div>
    56. <%--显示表格数据--%>
    57. <div class="row">
    58. <div class="col-md-12">
    59. <table class="table table-hover">
    60. <tr>
    61. <th>#</th>
    62. <th>empName</th>
    63. <th>gender</th>
    64. <th>email</th>
    65. <th>deptName</th>
    66. <th>操作</th>
    67. </tr>
    68. <c:forEach items="${pageInfo.list}" var="emp">
    69. <tr>
    70. <th>${emp.empId}</th>
    71. <th>${emp.empName}</th>
    72. <th>${emp.gender=="M" ? "男":"女"}</th>
    73. <th>${emp.email}</th>
    74. <th>${emp.department.deptName}</th>
    75. <th>
    76. <button class="btn btn-primary btn-sm">
    77. <span class="glyphicon glyphicon-pencil"></span>编辑
    78. </button>
    79. <button class="btn btn-danger btn-sm">
    80. <span class="glyphicon glyphicon-trash"></span>删除
    81. </button>
    82. </th>
    83. </tr>
    84. </c:forEach>
    85. </table>
    86. </div>
    87. </div>
    88. <%--显示分页信息--%>
    89. <div class="row">
    90. <%--分页文字--%>
    91. <div class="col-md-6">
    92. 当前${pageInfo.pageNum}页,总${pageInfo.pages}页,总${pageInfo.total}记录
    93. </div>
    94. <%--分页条--%>
    95. <div class="col-md-6">
    96. <nav aria-label="Page navigation">
    97. <ul class="pagination">
    98. <li><a href="${PATH}/emps?pn=1">首页</a></li>
    99. <c:if test="${pageInfo.hasPreviousPage}">
    100. <li>
    101. <a href="${PATH}/emps?pn=${pageInfo.pageNum-1}" aria-label="Previous">
    102. <span aria-hidden="true">&laquo;</span>
    103. </a>
    104. </li>
    105. </c:if>
    106. <c:forEach items="${pageInfo.navigatepageNums}" var="page_Num">
    107. <c:if test="${page_Num == pageInfo.pageNum}">
    108. <li class="active"><a href="#">${page_Num}</a></li>
    109. </c:if>
    110. <c:if test="${page_Num != pageInfo.pageNum}">
    111. <li><a href="${PATH}/emps?pn=${page_Num}">${page_Num}</a></li>
    112. </c:if>
    113. </c:forEach>
    114. <c:if test="${pageInfo.hasNextPage}">
    115. <li>
    116. <a href="${PATH}/emps?pn=${pageInfo.pageNum+1}" aria-label="Previous">
    117. <span aria-hidden="true">&raquo;</span>
    118. </a>
    119. </li>
    120. </c:if>
    121. <li><a href="${PATH}/emps?pn=${pageInfo.pages}">末页</a></li>
    122. </ul>
    123. </nav>
    124. </div>
    125. <%----%>
    126. </div>
    127. </div>
    128. </body>
    129. </html>

    ajax查询
    1.index.jsp 直接发起ajax请求进行员工分页数据报告
    2.服务器将查出的数据,以json字符串返回浏览器
    3.浏览器收到js字符串,可以使用js对json进行解析,使用js通过dom增删改的形式改变页面
    4.返回json,实现客户端的无关性

    1. /**
    2. * 导入jack包
    3. * @param pn
    4. * @param model
    5. * @return
    6. */
    7. @RequestMapping("/emps")
    8. @ResponseBody
    9. public Msg getEmpsByJson(@RequestParam(value = "pn",defaultValue = "1") Integer pn, Model model){
    10. // 这不是一个分页查询
    11. // 引入 PageHalper 分页插件
    12. // 在查询之前调用,传入页码,每页的大小
    13. PageHelper.startPage(pn,5);
    14. // startPage 后面紧跟着查询就是一个分页查询
    15. List<Employee> emps = employeeService.getAll();
    16. // 使用 pageInfo 包装查询后的结果,只需要将 pageInfo 交给页面就行
    17. // 封装了详细的分页信息,包括查询出来的数据 传入连续显示的页面
    18. PageInfo page = new PageInfo(emps,5);
    19. return Msg.success().add("pageInfo",page);
    20. }
    1. package com.atguigu.crud.bean;
    2. /**
    3. * @author 温笙
    4. * @date 2021/8/31
    5. */
    6. import com.fasterxml.jackson.databind.ObjectMapper;
    7. import com.github.pagehelper.PageInfo;
    8. import java.util.HashMap;
    9. import java.util.Map;
    10. /**
    11. * 返回json的通用类
    12. */
    13. public class Msg {
    14. //状态码
    15. private int code;
    16. //提示信息
    17. private String msg;
    18. //用户返回的数据
    19. private Map<String,Object> extend = new HashMap<String,Object>();
    20. public static Msg success(){
    21. Msg result = new Msg();
    22. result.setCode(100);
    23. result.setMsg("处理成功");
    24. return result;
    25. }
    26. public static Msg fail(){
    27. Msg result = new Msg();
    28. result.setCode(200);
    29. result.setMsg("处理失败");
    30. return result;
    31. }
    32. public int getCode() {
    33. return code;
    34. }
    35. public void setCode(int code) {
    36. this.code = code;
    37. }
    38. public String getMsg() {
    39. return msg;
    40. }
    41. public void setMsg(String msg) {
    42. this.msg = msg;
    43. }
    44. public Map<String, Object> getExtend() {
    45. return extend;
    46. }
    47. public void setExtend(Map<String, Object> extend) {
    48. this.extend = extend;
    49. }
    50. public Msg add(String key, Object value) {
    51. this.getExtend().put(key,value);
    52. return this;
    53. }
    54. }

    ajax实现查询数据

    1. <script type="text/javascript">
    2. // 1.页面加载完成之后,直接发送ajax请求,获取分页数据
    3. $(function () {
    4. //去首页
    5. toPage(1);
    6. });
    7. function toPage(pn) {
    8. // 发送 ajax 请求
    9. $.ajax({
    10. url:"${PATH}/emps",
    11. data:"pn="+pn,
    12. type:"get",
    13. success:function (result) {
    14. console.log(result);
    15. // 1.解析显示emp数据
    16. build_emps_table(result);
    17. // 2.解析显示分页信息
    18. build_page_info(result);
    19. // 3.解析显示分页条
    20. build_page_nav(result);
    21. }
    22. });
    23. }
    24. // 1.解析显示emp数据
    25. function build_emps_table(result) {
    26. /*清空table*/
    27. $("#emps_table tbody").empty();
    28. // 从 json 数据中获取 emps
    29. var emps = result.extend.pageInfo.list;
    30. $.each(emps,function (index,item) {
    31. // alert(item.empName);
    32. var empIdTd = $("<td></td>").append(item.empId);
    33. var empNameTd = $("<td></td>").append(item.empName);
    34. var gender = item.gender == "M" ? "男":"女";
    35. var genderTd = $("<td></td>").append(gender);
    36. var emailTd = $("<td></td>").append(item.email);
    37. var deptNameTd = $("<td></td>").append(item.department.deptName);
    38. var editBtn =
    39. $("<button></button>")
    40. .addClass("btn btn-primary btn-sm")
    41. .append($("<span></span>"))
    42. .addClass("glyphicon glyphicon-pencil")
    43. .append("编辑");
    44. var delBtn =
    45. $("<button></button>")
    46. .addClass("btn btn-danger btn-sm")
    47. .append($("<span></span>"))
    48. .addClass("glyphicon glyphicon-trash")
    49. .append("删除");
    50. var btnTd = $("<td></td>").append(editBtn).append(" ").append(delBtn);
    51. //append 方法执行完成以后 还会返回原来的元素
    52. $("<tr></tr>")
    53. .append(empIdTd)
    54. .append(empNameTd)
    55. .append(genderTd)
    56. .append(emailTd)
    57. .append(deptNameTd)
    58. .append(btnTd)
    59. .appendTo("#emps_table tbody");
    60. });
    61. }
    62. // 2.解析显示分页信息
    63. function build_page_info(result) {
    64. $("#page_info").empty();
    65. $("#page_info").append(
    66. "当前"+result.extend.pageInfo.pageNum+
    67. "页,总"+result.extend.pageInfo.pages+
    68. "页,总"+result.extend.pageInfo.total+"记录");
    69. }
    70. // 2.解析显示分页条,点击分页要能进去下一页
    71. function build_page_nav(result) {
    72. $("#page_nav").empty();
    73. var ul = $("<ul></ul>").addClass("pagination");
    74. /*构建元素*/
    75. var firstPageLi = $("<li></li>").append($("<a></a>").append("首页").attr("href","#"));
    76. var prePageLi = $("<li></li>").append($("<a></a>").append("&laquo;"));
    77. if(result.extend.pageInfo.hasPreviousPage == false){
    78. firstPageLi.addClass("disabled");
    79. prePageLi.addClass("disabled");
    80. }else{
    81. //为元素添加点击翻页的事件
    82. firstPageLi.click(function(){
    83. toPage(1);
    84. });
    85. prePageLi.click(function(){
    86. toPage(result.extend.pageInfo.pageNum -1);
    87. });
    88. }
    89. var nextPageLi = $("<li></li>").append($("<a></a>").append("&raquo;"));
    90. var lastPageLi = $("<li></li>").append($("<a></a>").append("末页").attr("href","#"));
    91. if(result.extend.pageInfo.hasNextPage == false){
    92. nextPageLi.addClass("disabled");
    93. lastPageLi.addClass("disabled");
    94. }else{
    95. /*为元素增加点击事件*/
    96. nextPageLi.click(function () {
    97. toPage(result.extend.pageInfo.pageNum+1);
    98. });
    99. lastPageLi.click(function () {
    100. toPage(result.extend.pageInfo.pages);
    101. });
    102. }
    103. /*添加首页和前一页*/
    104. ul.append(firstPageLi).append(prePageLi);
    105. /*遍历给ul添加页码提示*/
    106. $.each(result.extend.pageInfo.navigatepageNums,function (index,item) {
    107. var numLi = $("<li></li>").append($("<a></a>").append(item));
    108. if(result.extend.pageInfo.pageNum == item){
    109. numLi.addClass("active");
    110. }
    111. numLi.click(function () {
    112. toPage(item)
    113. });
    114. ul.append(numLi);
    115. });
    116. ul.append(nextPageLi).append(lastPageLi);
    117. /*把ul添加到nav*/
    118. var nav = $("<nav></nav>").append(ul);
    119. nav.appendTo("#page_nav");
    120. }
    121. </script>