1.访问index.jsp 页面
2、idnex.jsp 页面发送查询员工列表请求
3、EmployeeController来接受请求,查出emp数据
4、来到list.jsp页面来展示
URI: /emps
1.导入mybatis的pageHalper
<!--引入pageHelper分页插件 --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.0.0</version></dependency>
2.配置插件
<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin></plugins>
3.进行分页查询
/*** 查询 emps (分页查询)* @return*/@RequestMapping("/emps")public String getEmps(@RequestParam(value = "pn",defaultValue = "1") Integer pn,Model model){// 这不是一个分页查询// 引入 PageHalper 分页插件// 在查询之前调用,传入页码,每页的大小PageHelper.startPage(pn,5);// startPage 后面紧跟着查询就是一个分页查询List<Employee> emps = employeeService.getAll();// 使用 pageInfo 包装查询后的结果,只需要将 pageInfo 交给页面就行// 封装了详细的分页信息,包括查询出来的数据 传入连续显示的页面PageInfo page = new PageInfo(emps,5);model.addAttribute("pageInfo",page);return "list";}
4.spring的单元测试
package com.atguigu.crud.test;/*** 使用 Spring 的单元测试,测试crud请求的准确性* spring4 测试需要servlet3.0* @author 温笙* @date 2021/8/31*/@RunWith(SpringJUnit4ClassRunner.class)@WebAppConfiguration@ContextConfiguration(locations = {"classpath:applicationContext.xml","file:src/main/webapp/WEB-INF/dispatcherServlet-servlet.xml"})public class MVCTest {//传入springmvc的ioc@AutowiredWebApplicationContext context;//虚假的mvc请求,获取处理结果MockMvc mockMvc;@Beforepublic void initMockMvc(){mockMvc = MockMvcBuilders.webAppContextSetup(context).build();}@Testpublic void testPage() throws Exception {// 模拟请求拿到返回值MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/emps").param("pn", "5")).andReturn();// 请求成功会在请求域中会有pageInfo,可以验证MockHttpServletRequest request = result.getRequest();PageInfo pageInfo = (PageInfo) request.getAttribute("pageInfo");System.out.println("当前页码:"+pageInfo.getPageNum());System.out.println("总页码:"+pageInfo.getPages());System.out.println("总记录数:"+pageInfo.getTotal());System.out.println("在页面需要连续现实的页码:"+pageInfo.getNavigatepageNums());// 获取emp数据List<Employee> list = pageInfo.getList();for (Employee emp : list) {System.out.println("id:"+emp.getdId()+" "+emp.getEmpName());}}}
<%@ page import="org.apache.taglibs.standard.lang.jstl.test.PageContextImpl" %><%@ page import="org.springframework.context.ApplicationContext" %><%@ page import="com.github.pagehelper.PageInfo" %><%@ page import="com.atguigu.crud.bean.Employee" %><%@ page import="java.util.List" %><%--Created by IntelliJ IDEA.User: 温笙Date: 2021/8/30Time: 18:31To change this template use File | Settings | File Templates.--%><%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@ page isELIgnored="false" %><%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><html><head><title>employees</title><%application.setAttribute("PATH",request.getContextPath());%><%-- web 路径不以/ 开头的相对路径,找资源,以当前资源的路径为基准,经常容易出问题以/ 开头的相对路径:找资源,以服务器的路径为标准;http://1.117.141.225:3306/ssm(需要加上项目名才能找到)--%><%--引入jq--%><script type="text/javascript" src="${PATH}/static/js/jquery-1.12.4.min.js"></script><%--引入样式--%><link href="${PATH}/static/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet"><script src="${PATH}/static/bootstrap-3.3.7-dist/js/bootstrap.min.js" type="text/javascript"></script></head><body><%PageInfo<Employee> pageInfo = (PageInfo<Employee>) request.getAttribute("pageInfo");List<Employee> list = pageInfo.getList();for (Employee emp : list) {System.out.println(emp.getDepartment());}%><%--搭建显示页面--%><div class="container"><%--标题行--%><div class="row"><div class="col-md-12"><h1>SSM-CRUD</h1></div></div><%--两个按钮--%><div class="row"><div class="col-md-4 col-md-offset-8"><button class="btn btn-primary">新增</button><button class="btn btn-danger">删除</button></div></div><%--显示表格数据--%><div class="row"><div class="col-md-12"><table class="table table-hover"><tr><th>#</th><th>empName</th><th>gender</th><th>email</th><th>deptName</th><th>操作</th></tr><c:forEach items="${pageInfo.list}" var="emp"><tr><th>${emp.empId}</th><th>${emp.empName}</th><th>${emp.gender=="M" ? "男":"女"}</th><th>${emp.email}</th><th>${emp.department.deptName}</th><th><button class="btn btn-primary btn-sm"><span class="glyphicon glyphicon-pencil"></span>编辑</button><button class="btn btn-danger btn-sm"><span class="glyphicon glyphicon-trash"></span>删除</button></th></tr></c:forEach></table></div></div><%--显示分页信息--%><div class="row"><%--分页文字--%><div class="col-md-6">当前${pageInfo.pageNum}页,总${pageInfo.pages}页,总${pageInfo.total}记录</div><%--分页条--%><div class="col-md-6"><nav aria-label="Page navigation"><ul class="pagination"><li><a href="${PATH}/emps?pn=1">首页</a></li><c:if test="${pageInfo.hasPreviousPage}"><li><a href="${PATH}/emps?pn=${pageInfo.pageNum-1}" aria-label="Previous"><span aria-hidden="true">«</span></a></li></c:if><c:forEach items="${pageInfo.navigatepageNums}" var="page_Num"><c:if test="${page_Num == pageInfo.pageNum}"><li class="active"><a href="#">${page_Num}</a></li></c:if><c:if test="${page_Num != pageInfo.pageNum}"><li><a href="${PATH}/emps?pn=${page_Num}">${page_Num}</a></li></c:if></c:forEach><c:if test="${pageInfo.hasNextPage}"><li><a href="${PATH}/emps?pn=${pageInfo.pageNum+1}" aria-label="Previous"><span aria-hidden="true">»</span></a></li></c:if><li><a href="${PATH}/emps?pn=${pageInfo.pages}">末页</a></li></ul></nav></div><%----%></div></div></body></html>
ajax查询
1.index.jsp 直接发起ajax请求进行员工分页数据报告
2.服务器将查出的数据,以json字符串返回浏览器
3.浏览器收到js字符串,可以使用js对json进行解析,使用js通过dom增删改的形式改变页面
4.返回json,实现客户端的无关性
/*** 导入jack包* @param pn* @param model* @return*/@RequestMapping("/emps")@ResponseBodypublic Msg getEmpsByJson(@RequestParam(value = "pn",defaultValue = "1") Integer pn, Model model){// 这不是一个分页查询// 引入 PageHalper 分页插件// 在查询之前调用,传入页码,每页的大小PageHelper.startPage(pn,5);// startPage 后面紧跟着查询就是一个分页查询List<Employee> emps = employeeService.getAll();// 使用 pageInfo 包装查询后的结果,只需要将 pageInfo 交给页面就行// 封装了详细的分页信息,包括查询出来的数据 传入连续显示的页面PageInfo page = new PageInfo(emps,5);return Msg.success().add("pageInfo",page);}
package com.atguigu.crud.bean;/*** @author 温笙* @date 2021/8/31*/import com.fasterxml.jackson.databind.ObjectMapper;import com.github.pagehelper.PageInfo;import java.util.HashMap;import java.util.Map;/*** 返回json的通用类*/public class Msg {//状态码private int code;//提示信息private String msg;//用户返回的数据private Map<String,Object> extend = new HashMap<String,Object>();public static Msg success(){Msg result = new Msg();result.setCode(100);result.setMsg("处理成功");return result;}public static Msg fail(){Msg result = new Msg();result.setCode(200);result.setMsg("处理失败");return result;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Map<String, Object> getExtend() {return extend;}public void setExtend(Map<String, Object> extend) {this.extend = extend;}public Msg add(String key, Object value) {this.getExtend().put(key,value);return this;}}
ajax实现查询数据
<script type="text/javascript">// 1.页面加载完成之后,直接发送ajax请求,获取分页数据$(function () {//去首页toPage(1);});function toPage(pn) {// 发送 ajax 请求$.ajax({url:"${PATH}/emps",data:"pn="+pn,type:"get",success:function (result) {console.log(result);// 1.解析显示emp数据build_emps_table(result);// 2.解析显示分页信息build_page_info(result);// 3.解析显示分页条build_page_nav(result);}});}// 1.解析显示emp数据function build_emps_table(result) {/*清空table*/$("#emps_table tbody").empty();// 从 json 数据中获取 empsvar emps = result.extend.pageInfo.list;$.each(emps,function (index,item) {// alert(item.empName);var empIdTd = $("<td></td>").append(item.empId);var empNameTd = $("<td></td>").append(item.empName);var gender = item.gender == "M" ? "男":"女";var genderTd = $("<td></td>").append(gender);var emailTd = $("<td></td>").append(item.email);var deptNameTd = $("<td></td>").append(item.department.deptName);var editBtn =$("<button></button>").addClass("btn btn-primary btn-sm").append($("<span></span>")).addClass("glyphicon glyphicon-pencil").append("编辑");var delBtn =$("<button></button>").addClass("btn btn-danger btn-sm").append($("<span></span>")).addClass("glyphicon glyphicon-trash").append("删除");var btnTd = $("<td></td>").append(editBtn).append(" ").append(delBtn);//append 方法执行完成以后 还会返回原来的元素$("<tr></tr>").append(empIdTd).append(empNameTd).append(genderTd).append(emailTd).append(deptNameTd).append(btnTd).appendTo("#emps_table tbody");});}// 2.解析显示分页信息function build_page_info(result) {$("#page_info").empty();$("#page_info").append("当前"+result.extend.pageInfo.pageNum+"页,总"+result.extend.pageInfo.pages+"页,总"+result.extend.pageInfo.total+"记录");}// 2.解析显示分页条,点击分页要能进去下一页function build_page_nav(result) {$("#page_nav").empty();var ul = $("<ul></ul>").addClass("pagination");/*构建元素*/var firstPageLi = $("<li></li>").append($("<a></a>").append("首页").attr("href","#"));var prePageLi = $("<li></li>").append($("<a></a>").append("«"));if(result.extend.pageInfo.hasPreviousPage == false){firstPageLi.addClass("disabled");prePageLi.addClass("disabled");}else{//为元素添加点击翻页的事件firstPageLi.click(function(){toPage(1);});prePageLi.click(function(){toPage(result.extend.pageInfo.pageNum -1);});}var nextPageLi = $("<li></li>").append($("<a></a>").append("»"));var lastPageLi = $("<li></li>").append($("<a></a>").append("末页").attr("href","#"));if(result.extend.pageInfo.hasNextPage == false){nextPageLi.addClass("disabled");lastPageLi.addClass("disabled");}else{/*为元素增加点击事件*/nextPageLi.click(function () {toPage(result.extend.pageInfo.pageNum+1);});lastPageLi.click(function () {toPage(result.extend.pageInfo.pages);});}/*添加首页和前一页*/ul.append(firstPageLi).append(prePageLi);/*遍历给ul添加页码提示*/$.each(result.extend.pageInfo.navigatepageNums,function (index,item) {var numLi = $("<li></li>").append($("<a></a>").append(item));if(result.extend.pageInfo.pageNum == item){numLi.addClass("active");}numLi.click(function () {toPage(item)});ul.append(numLi);});ul.append(nextPageLi).append(lastPageLi);/*把ul添加到nav*/var nav = $("<nav></nav>").append(ul);nav.appendTo("#page_nav");}</script>
