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
@Autowired
WebApplicationContext context;
//虚假的mvc请求,获取处理结果
MockMvc mockMvc;
@Before
public void initMockMvc(){
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
@Test
public 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/30
Time: 18:31
To 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")
@ResponseBody
public 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 数据中获取 emps
var 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>