查询
1、思路整理
- 访问 index.jsp 页面
- index.jsp 页面发送出查询员工列表请求
- EmployeeController 来接收请求,查出员工数据
- 来到 list.jsp 页面进行展示
2、分页后台代码实现
在 index.jsp 开头引入 /emps 的请求:
<jsp:forward page="/emps"></jsp:forward>
那么,我们就应该创建一个响应 /emps 请求的控制器:
@Controller
public class EmployeeController {
@Autowired
EmployeeService employeeService;
@RequestMapping("/emps")
private String getEmps(@RequestParam(value = "pn", defaultValue = "1") Integer pn, Model model){
PageHelper.startPage(pn, 5);
List<Employee> emps = employeeService.getAll();
PageInfo<Employee> page = new PageInfo<>(emps, 5);
model.addAttribute("pageInfo", page);
return "list";
}
}
在这里我们使用到了分页查询,所以要导入分页查询的依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
同时创建 Servcie 层的方法:
@Service
public class EmployeeService {
@Autowired
EmployeeMapper employeeMapper;
public List<Employee> getAll() {
return employeeMapper.selectByExampleWithDept(null);
}
}
在 Service 层的方法中调用 dao 层的方法查询数据。
3、使用 Spring 单元测试测试分页查询
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {"classpath:applicationContext.xml", "classpath:dispatcherServlet-servlet.xml"})
public class MVCTest {
@Autowired
WebApplicationContext context;
MockMvc mockMvc;
@Before
public void initMokcMvc(){
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
@Test
public void testPage() throws Exception {
MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/emps").param("pn", "5")).andReturn();
MockHttpServletRequest request = result.getRequest();
PageInfo pi = (PageInfo) request.getAttribute("pageInfo");
System.out.println("当前页码:" + pi.getPageNum());
System.out.println("总页码:" + pi.getPages());
System.out.println("总记录数:" + pi.getTotal());
System.out.println("在页面需要连续显示的页码:" );
int[] nums = pi.getNavigatepageNums();
for (int i :
nums) {
System.out.println(" " + i);
}
List<Employee> list = pi.getList();
for (Employee employee :
list) {
System.out.println("ID:" + employee.getEmpId() + "==>Name:" + employee.getEmpName());
}
}
}
4、搭建 BootStrap 分页页面
<%--
Created by IntelliJ IDEA.
User: Li
Date: 2022/03/02
Time: 13:35
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>员工列表</title>
<%
pageContext.setAttribute("APP_PATH", request.getContextPath());
%>
<%--web路径:
不以/开始的相对路径,找资源,以当前资源的路径为基准,经常出问题。
以/开始的相对路径,找资源,以服务器的根路径为基准(http://localhost:3306):需要加上项目名--%>
<%--引入jquery--%>
<%--<script type="text/javascript" src="${APP_PATH}/static/jquery-3.5.1/jquery-3.5.1.js"></script>
<!-- Bootstrap -->
<link rel="stylesheet" href="${APP_PATH}/static/bootstrap-3.4.1-dist/css/bootstrap.css">
<script src="${APP_PATH}/static/bootstrap-3.4.1-dist/js/bootstrap.js"></script>--%>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css" integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
</head>
<body>
<%--搭建显示页面--%>
<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="clo-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>
<tr>
<th>1</th>
<th>q</th>
<th>1</th>
<th>111</th>
<th>2222</th>
<th>
<button type="button" class="btn btn-primary btn-sm" aria-label="Left Align" >
<span class="glyphicon glyphicon-align-left" aria-hidden="true"></span>
编辑</button>
<button type="button" class="btn btn-danger btn-sm" aria-label="Left Align">
<span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
删除</button>
</th>
</tr>
</table>
</div>
</div>
<%--显示分页信息--%>
<div class="row">
<%--分页文字信息--%>
<div class="col-md-6">
当前记录数:xxx
</div>
<%--分页条信息--%>
<div class="col-md-6">
<nav aria-label="Page navigation">
<ul class="pagination">
<li>
<a href="#">首页</a>
</li>
<li>
<a href="#" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
<li><a href="#">1</a></li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
<li><a href="#">4</a></li>
<li><a href="#">5</a></li>
<li>
<a href="#" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
<li>
<a href="#">末页</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
</body>
</html>
如果无法使用 pageContext.setAttribute("APP_PATH", request.getContextPath()) ,则需要导入下面依赖:
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
如果无法使用 bootstrap 样式,需要改成在线获取。
5、显示分页数据
<%--
Created by IntelliJ IDEA.
User: Li
Date: 2022/03/02
Time: 13:35
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>员工列表</title>
<%
pageContext.setAttribute("APP_PATH", request.getContextPath());
%>
<%--web路径:
不以/开始的相对路径,找资源,以当前资源的路径为基准,经常出问题。
以/开始的相对路径,找资源,以服务器的根路径为基准(http://localhost:3306):需要加上项目名--%>
<%--引入jquery--%>
<%--<script type="text/javascript" src="${APP_PATH}/static/jquery-3.5.1/jquery-3.5.1.js"></script>
<!-- Bootstrap -->
<link rel="stylesheet" href="${APP_PATH}/static/bootstrap-3.4.1-dist/css/bootstrap.css">
<script src="${APP_PATH}/static/bootstrap-3.4.1-dist/js/bootstrap.js"></script>--%>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css" integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
</head>
<body>
<%--搭建显示页面--%>
<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="clo-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 type="button" class="btn btn-primary btn-sm" aria-label="Left Align" >
<span class="glyphicon glyphicon-align-left" aria-hidden="true"></span>
编辑</button>
<button type="button" class="btn btn-danger btn-sm" aria-label="Left Align">
<span class="glyphicon glyphicon-trash" aria-hidden="true"></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="${APP_PATH}/emps?pn=1">首页</a>
</li>
<c:if test="${pageInfo.hasPreviousPage}">
<li>
<a href="${APP_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="${APP_PATH}/emps?pn=${page_Num}">${page_Num}</a></li>
</c:if>
</c:forEach>
<c:if test="${pageInfo.hasNextPage}">
<li>
<a href="${APP_PATH}/emps?pn=${pageInfo.pageNum+1}" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</c:if>
<li>
<a href="${APP_PATH}/emps?pn=${pageInfo.pages}">末页</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
</body>
</html>
6、返回分页的 JSON 数据
查询-ajax
- index.jsp 页面直接发送 ajax 请求进行员工分页数据查询
- 服务器将查询出的数据,以 json 字符串形式返回给浏览器
- 浏览器收到 js 字符串。可以使用 js 对 json 进行解析,使用 js 通过 dom 增删改改变页面
- 返回 json。实现客户端的无关性
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.1</version>
</dependency>
@RequestMapping("/emps")
@ResponseBody
public PageInfo getEmpsWithJson(@RequestParam(value = "pn", defaultValue = "1") Integer pn){
PageHelper.startPage(pn, 5);
List<Employee> emps = employeeService.getAll();
PageInfo<Employee> page = new PageInfo<>(emps, 5);
return page;
}
如果此时浏览器报错 406,应该在 springMVC 的配置文件中开启 mvc 的注解驱动,此时在 HandlerAdaptor 中会自动装配一个消息转换器:MappingJackson2HttpMessageConverter,可以将响应到浏览器的 Java 对象转换为 Json 格式的字符串:
<mvc:annotation-driven />
定义一个通用的返回类:
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 Msg add(String key, Object value){
this.getExtend().put(key, value);
return this;
}
public static Msg fail(){
Msg result = new Msg();
result.setCode(200);
result.setMsg("处理失败!");
return result;
}
......
修改控制器方法:
@RequestMapping("/emps")
@ResponseBody
public Msg getEmpsWithJson(@RequestParam(value = "pn", defaultValue = "1") Integer pn){
PageHelper.startPage(pn, 5);
List<Employee> emps = employeeService.getAll();
PageInfo<Employee> page = new PageInfo<>(emps, 5);
return Msg.success().add("pageInfo", page);
}
7、构建员工列表
采用 ajax 和 jquery 动态构建表格:
<%--
Created by IntelliJ IDEA.
User: Li
Date: 2022/03/02
Time: 13:35
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>员工列表</title>
<%
pageContext.setAttribute("APP_PATH", request.getContextPath());
%>
<%--web路径:
不以/开始的相对路径,找资源,以当前资源的路径为基准,经常出问题。
以/开始的相对路径,找资源,以服务器的根路径为基准(http://localhost:3306):需要加上项目名--%>
<%--引入jquery--%>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css" integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
</head>
<body>
<%--搭建显示页面--%>
<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="clo-md-12">
<table class="table table-hover" id="emps_table">
<thead>
<tr>
<th>#</th>
<th>empName</th>
<th>gender</th>
<th>email</th>
<th>deptName</th>
<th>操作</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
<%--显示分页信息--%>
<div class="row">
<%--分页文字信息--%>
<div class="col-md-6">
当前页,总页,总记录
</div>
<%--分页条信息--%>
<div class="col-md-6">
</div>
</div>
</div>
<script type="text/javascript">
//1、页面加载完之后,直接去发送一个ajax请求,要到分页数据
$(function () {
$.ajax({
url:"${APP_PATH}/emps",
data:"pn=1",
type:"get",
success:function (result) {
//console.log(result);
//1、解析并显示员工信息
build_emps_table(result);
//2、解析并显示分页信息
}
});
});
function build_emps_table(result) {
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 = $("<td></td>").append(item.gender == "M"?"男":"女");
var email = $("<td></td>").append(item.email);
var deptNameId = $("<td></td>").append(item.department.deptName);
/*
<button type="button" class="btn btn-primary btn-sm" aria-label="Left Align" >
<span class="glyphicon glyphicon-align-left" aria-hidden="true"></span>
编辑</button>
*/
var editBtn = $("<button></button>").addClass("btn btn-primary btn-sm").append($("<span></span>").addClass("glyphicon glyphicon-align-left")).append("编辑");
var deleteBtn = $("<button></button>").addClass("btn btn-danger btn-sm").append($("<span></span>").addClass("glyphicon glyphicon-trash")).append("编辑");
var btnTd = $("<td></td>").append(editBtn).append(" ").append(deleteBtn);
//append方法执行完成后还是返回原来的元素
$("<tr></tr>").append(empIdTd)
.append(empNameTd).append(gender).append(email).append(deptNameId)
.append(btnTd)
.appendTo("#emps_table tbody");
});
}
function build_page_nav() {
}
</script>
</body>
</html>
8、构建分页条
<%--
Created by IntelliJ IDEA.
User: Li
Date: 2022/03/02
Time: 13:35
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>员工列表</title>
<%
pageContext.setAttribute("APP_PATH", request.getContextPath());
%>
<%--web路径:
不以/开始的相对路径,找资源,以当前资源的路径为基准,经常出问题。
以/开始的相对路径,找资源,以服务器的根路径为基准(http://localhost:3306):需要加上项目名--%>
<%--引入jquery--%>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css" integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
</head>
<body>
<%--搭建显示页面--%>
<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="clo-md-12">
<table class="table table-hover" id="emps_table">
<thead>
<tr>
<th>#</th>
<th>empName</th>
<th>gender</th>
<th>email</th>
<th>deptName</th>
<th>操作</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
<%--显示分页信息--%>
<div class="row">
<%--分页文字信息--%>
<div class="col-md-6" id="page_info_area">
</div>
<%--分页条信息--%>
<div class="col-md-6" id="page_nav_area">
</div>
</div>
</div>
<script type="text/javascript">
//1、页面加载完之后,直接去发送一个ajax请求,要到分页数据
$(function () {
$.ajax({
url:"${APP_PATH}/emps",
data:"pn=1",
type:"get",
success:function (result) {
//console.log(result);
//1、解析并显示员工信息
build_emps_table(result);
//2、解析并显示分页信息
build_page_info(result);
//2、解析并显示分页条
build_page_nav(result);
}
});
});
//1、解析并显示员工信息
function build_emps_table(result) {
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 = $("<td></td>").append(item.gender == "M"?"男":"女");
var email = $("<td></td>").append(item.email);
var deptNameId = $("<td></td>").append(item.department.deptName);
/*
<button type="button" class="btn btn-primary btn-sm" aria-label="Left Align" >
<span class="glyphicon glyphicon-align-left" aria-hidden="true"></span>
编辑</button>
*/
var editBtn = $("<button></button>").addClass("btn btn-primary btn-sm").append($("<span></span>").addClass("glyphicon glyphicon-align-left")).append("编辑");
var deleteBtn = $("<button></button>").addClass("btn btn-danger btn-sm").append($("<span></span>").addClass("glyphicon glyphicon-trash")).append("编辑");
var btnTd = $("<td></td>").append(editBtn).append(" ").append(deleteBtn);
//append方法执行完成后还是返回原来的元素
$("<tr></tr>").append(empIdTd)
.append(empNameTd).append(gender).append(email).append(deptNameId)
.append(btnTd)
.appendTo("#emps_table tbody");
});
}
//2、解析并显示分页信息
function build_page_info(result) {
$("#page_info_area").append("当前 " + result.extend.pageInfo.pageNum + " 页," +
"总 " + result.extend.pageInfo.pages + " 页," +
"总 " + result.extend.pageInfo.total + " 记录")
}
//3、解析并显示分页条
function build_page_nav(result) {
var ul = $("<ul></ul>").addClass("pagination");
var firstPageLi = $("<li></li>").append($("<a></a>").append("首页").attr("href", "#"));
var prePageLi = $("<li></li>").append($("<a></a>").append("«"));
var nextPageLi = $("<li></li>").append($("<a></a>").append("»"));
var lastPageLi = $("<li></li>").append($("<a></a>").append("末页").attr("href", "#"));
ul.append(firstPageLi).append(prePageLi);
//1,2,3,4,5
$.each(result.extend.pageInfo.navigatepageNums, function (index, item) {
var numLi = $("<li></li>").append($("<a></a>").append(item));
ul.append(numLi);
});
//添加下一页和末页的提示
ul.append(nextPageLi).append(lastPageLi);
//把ul添加到nav元素中
var navEle = $("<nav></nav>").append(ul);
navEle.appendTo("#page_nav_area");
}
</script>
</body>
</html>
9、分页显示完整细节
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="reasonable" value="true"/>
</plugin>
</plugins>
<%--
Created by IntelliJ IDEA.
User: Li
Date: 2022/03/02
Time: 13:35
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>员工列表</title>
<%
pageContext.setAttribute("APP_PATH", request.getContextPath());
%>
<%--web路径:
不以/开始的相对路径,找资源,以当前资源的路径为基准,经常出问题。
以/开始的相对路径,找资源,以服务器的根路径为基准(http://localhost:3306):需要加上项目名--%>
<%--引入jquery--%>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css" integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
</head>
<body>
<%--搭建显示页面--%>
<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="clo-md-12">
<table class="table table-hover" id="emps_table">
<thead>
<tr>
<th>#</th>
<th>empName</th>
<th>gender</th>
<th>email</th>
<th>deptName</th>
<th>操作</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
<%--显示分页信息--%>
<div class="row">
<%--分页文字信息--%>
<div class="col-md-6" id="page_info_area">
</div>
<%--分页条信息--%>
<div class="col-md-6" id="page_nav_area">
</div>
</div>
</div>
<script type="text/javascript">
//1、页面加载完之后,直接去发送一个ajax请求,要到分页数据
$(function () {
//去首页
to_page(1);
});
function to_page(pn) {
$.ajax({
url:"${APP_PATH}/emps",
data:"pn=" + pn,
type:"get",
success:function (result) {
//console.log(result);
//1、解析并显示员工信息
build_emps_table(result);
//2、解析并显示分页信息
build_page_info(result);
//2、解析并显示分页条
build_page_nav(result);
}
});
}
//1、解析并显示员工信息
function build_emps_table(result) {
//清空table表格
$("#emps_table tbody").empty();
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 = $("<td></td>").append(item.gender == "M"?"男":"女");
var email = $("<td></td>").append(item.email);
var deptNameId = $("<td></td>").append(item.department.deptName);
/*
<button type="button" class="btn btn-primary btn-sm" aria-label="Left Align" >
<span class="glyphicon glyphicon-align-left" aria-hidden="true"></span>
编辑</button>
*/
var editBtn = $("<button></button>").addClass("btn btn-primary btn-sm").append($("<span></span>").addClass("glyphicon glyphicon-align-left")).append("编辑");
var deleteBtn = $("<button></button>").addClass("btn btn-danger btn-sm").append($("<span></span>").addClass("glyphicon glyphicon-trash")).append("编辑");
var btnTd = $("<td></td>").append(editBtn).append(" ").append(deleteBtn);
//append方法执行完成后还是返回原来的元素
$("<tr></tr>").append(empIdTd)
.append(empNameTd).append(gender).append(email).append(deptNameId)
.append(btnTd)
.appendTo("#emps_table tbody");
});
}
//2、解析并显示分页信息
function build_page_info(result) {
//清空
$("#page_info_area").empty();
$("#page_info_area").append("当前 " + result.extend.pageInfo.pageNum + " 页," +
"总 " + result.extend.pageInfo.pages + " 页," +
"总 " + result.extend.pageInfo.total + " 记录")
}
//3、解析并显示分页条
function build_page_nav(result) {
//清空
$("#page_nav_area").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 () {
to_page(1);
});
prePageLi.click(function () {
to_page(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 {
//为元素添加点击翻页的事件
lastPageLi.click(function () {
to_page(result.extend.pageInfo.pages);
});
nextPageLi.click(function () {
to_page(result.extend.pageInfo.pageNum+1);
});
}
ul.append(firstPageLi).append(prePageLi);
//1,2,3,4,5
$.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 (){
to_page(item);
});
ul.append(numLi);
});
//添加下一页和末页的提示
ul.append(nextPageLi).append(lastPageLi);
//把ul添加到nav元素中
var navEle = $("<nav></nav>").append(ul);
navEle.appendTo("#page_nav_area");
}
</script>
</body>
</html>
|