查詢javascript
1.基礎查詢css
分析:訪問項目主頁 index.jsp 時應該跳轉到列表頁html
咱們能夠在index.jsp發出查詢員工列表請求,來到 list.jspjava
使用插件 pageHelper 完成分頁功能——使用pageHelper,給他須要的參數:我要查詢第幾頁,每頁幾條記錄,我要連續顯示幾條?jquery
首先在首頁頁面直接轉發:git
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <<jsp:forward page="/emps"></jsp:forward> <!-- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <link href="static/bootstrap/css/bootstrap.min.css" rel="stylesheet"> 先引入jQuery,再引入js <script type="text/javascript" src="static/bootstrap/js/jquery.min.js"> </script> <script src="static/bootstrap/js/bootstrap.min.js"></script> </head> <body> </body> </html> -->
編寫一下轉發的controller:github
package cn.crud.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import cn.crud.bean.Employee; import cn.crud.service.EmpService; /** * 處理員工的CRUD請求 * @author Administrator * */ @Controller public class EmpController { @Autowired private EmpService empService; /** * 分頁查詢員工數據 * @return */ @RequestMapping("/emps") public String getEmps(@RequestParam(value="pn",defaultValue="1") Integer pn, Model model){ //改造爲一個分頁查詢 //在查詢以前傳入分頁參數:起始頁和每頁記錄數 PageHelper.startPage(pn, 5); //後面緊跟的查詢就是分頁查詢 List<Employee> empList = empService.getAll(); //用PageInfo對結果進行包裝,只須要將PageInfo交給頁面便可,這裏面封裝了詳細的信息,第二個參數爲須要連續顯示的記錄數 PageInfo page = new PageInfo(empList,5); model.addAttribute("page", page); return "list"; } }
//分頁插件pageHelper的使用以及引入等能夠參照官方文檔等,這裏暫時不展開,待另外博客更新web
因爲controller中調用service,咱們生成service:ajax
package cn.crud.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import cn.crud.bean.Employee; import cn.crud.dao.EmployeeMapper; @Service public class EmpService { @Autowired private EmployeeMapper employeeMapper; public List<Employee> getAll() { /** * 沒有查詢條件的查詢全部,帶部門信息 */ return employeeMapper.selectByExampleWithDept(null); } }
//service中調用dao的mapper:spring
在來到頁面以前,咱們先使用spring的單元測試進行測試,測試數據是否正常到達:
package cn.crud.tests; import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; import com.github.pagehelper.PageInfo; import cn.crud.bean.Employee; /** * 使用spring的單元測試來進行模擬發送請求的測試 * @author Administrator * */ @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration(locations={"classpath:applicationContext.xml", "file:src/main/webapp/WEB-INF/dispatcherServlet-servlet.xml"}) public class MVCTest { //springMVC的IOC容器 @Autowired private WebApplicationContext context; //模擬MVC請求 private MockMvc mockMvc; @Before public void setup(){ mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); } @Test public void testPage() throws Exception{ //模擬請求拿到返回值 MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/emps").param("pn", "2")) .andReturn(); //請求域中有pageInfo PageInfo page = (PageInfo) result.getRequest().getAttribute("page"); System.out.println(page.getPageNum()); System.out.println(page.getTotal()); //獲得員工數據 List<Employee> list = page.getList(); for (Employee employee : list) { System.out.println("ID:"+employee.getdId()+" 性別:"+employee.getGender()); } } }
//尤爲須要注意的是spring-test4的版本須要servlet3.0以上的版本,咱們去倉庫中第一個java servlet-api找到3.1的版本替換原來2.5的版本!
界面的搭建:
使用bootstrap的柵格系統快速搭建簡單的界面框架
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>員工列表</title> <% pageContext.setAttribute("path",request.getContextPath()); %> <!-- 推薦以 / 開始的相對路徑(以服務器的根路徑爲相對路徑) --> <link href="${path}/static/bootstrap/css/bootstrap.min.css" rel="stylesheet"> <!-- 先引入jQuery,再引入js --> <script type="text/javascript" src="${path}/static/bootstrap/js/jquery.min.js"> </script> <script src="${path}/static/bootstrap/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <!-- 分爲四大行 --> <!-- 標題 --> <div class="row"> <div class="col-md-12"> <font size="20">SSM-CRUD</font> </div> </div> <!-- 按鈕 --> <div class="row"> <!-- 偏移4列 --> <div class="col-md-4 col-md-offset-8"> <button type="button" class="btn btn-primary ">新增</button> <button type="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>empEmail</th> <th>gender</th> <th>deptName</th> <th>操做</th> </tr> <tr> <td>1</td> <td>aa</td> <td>123@163.com</td> <td>M</td> <td>開發部</td> <td> <button type="button" class="btn btn-info btn-sm"> <span class="glyphicon glyphicon-penci" aria-hidden="true"></span> 編輯</button> <button type="button" class="btn btn-danger btn-sm"> <span class="glyphicon glyphicon-trash" aria-hidden="true"></span> 刪除</button> </td> </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>
//注意不要使用不帶 / 的相對路徑,而是使用帶 / 的路徑
使用maven分類博客中使用插件運行Maven項目:訪問主頁,成功!
接下來利用分頁插件完成分頁信息的查詢,因爲咱們將分頁信息都封裝在pageInfo中,咱們利用這個完成分頁頁面的搭建:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>員工列表</title> <% pageContext.setAttribute("path",request.getContextPath()); %> <!-- 推薦以 / 開始的相對路徑(以服務器的根路徑爲相對路徑) --> <link href="${path}/static/bootstrap/css/bootstrap.min.css" rel="stylesheet"> <!-- 先引入jQuery,再引入js --> <script type="text/javascript" src="${path}/static/bootstrap/js/jquery.min.js"> </script> <script src="${path}/static/bootstrap/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <!-- 分爲四大行 --> <!-- 標題 --> <div class="row"> <div class="col-md-12"> <font size="20">SSM-CRUD</font> </div> </div> <!-- 按鈕 --> <div class="row"> <!-- 偏移4列 --> <div class="col-md-4 col-md-offset-8"> <button type="button" class="btn btn-primary ">新增</button> <button type="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>empEmail</th> <th>gender</th> <th>deptName</th> <th>操做</th> </tr> <c:forEach items="${pageInfo.list }" var="emp"> <tr> <td>${emp.empId}</td> <td>${emp.empName}</td> <td>${emp.email}</td> <!-- 三元運算符展現性別信息 --> <td>${emp.gender=="M"?"男":"女"}</td> <td>${emp.department.deptName}</td> <td> <button type="button" class="btn btn-info btn-sm"> <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> 編輯</button> <button type="button" class="btn btn-danger btn-sm"> <span class="glyphicon glyphicon-trash" aria-hidden="true"></span> 刪除</button> </td> </tr> </c:forEach> </table> </div> </div> <!-- 分頁信息 --> <div class="row"> <!-- 分頁文字信息,其中分頁信息都封裝在pageInfo中 --> <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="Next"> <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>
//注意:
//使用PageHelper.startPage只是針對接下來的一條查詢語句,
//若是又查詢了一次數據,則還須要使用一次PageHelper.startPage
2.AJAX請求
瀏覽器的請求是能夠正確完成相關的功能的,可是若是是安卓IOS等移動客戶端,服務器再發送一個頁面給移動設備解析的話,是比較費力的,交互體驗也不是很好,因而,咱們將請求更改成前臺發AJAX請求,後臺返回JSON數據
分析:首頁index.jsp直接發送ajax請求進行員工分頁信息的查詢
服務器將查詢的數據以JSON格式返回
前臺使用js完成JSON的解析,經過DOM操做完成增刪改查的操做。
回憶springMVC與JSON的交互,須要jackson的包,咱們去中央倉庫找到maven的座標:
咱們找到第一個數據綁定的包:
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.8</version>
</dependency>
以後咱們將分頁信息使用通用的信息類 Msg 進行包裝,方便咱們進行一些返回JSON的操做:
package cn.crud.bean; import java.util.HashMap; import java.util.Map; /** * 通用的返回信息的類 * */ public class Msg { //狀態碼,自定義一些狀態碼對應的狀態 private int code; //提示信息 private String msg; //用戶給瀏覽器的數據,好比說返回的PageInfo信息 private Map<String,Object> map = new HashMap<String,Object>(); /** * 操做成功的靜態方法 * @return */ public static Msg success(){ Msg result = new Msg(); //這裏100表示成功 result.setCode(100); result.setMsg("操做成功"); return result; } /** * 操做失敗的靜態方法 * @return */ public static Msg fail(){ Msg result = new Msg(); //這裏100表示成功 result.setCode(200); result.setMsg("操做失敗"); return result; } /** * 快捷添加信息的方法 * @return */ public Msg add(String key,Object value){ this.getMap().put(key, value); return this; } 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> getMap() { return map; } public void setMap(Map<String, Object> map) { this.map = map; } }
//Msg信息類中包含一些必要的屬性與咱們須要的靜態方法
將controller中的返回分頁信息方法進行改寫,讓他返回msg方便進行ajax的改造:
/** * 分頁信息的AJAX請求 * @ResponseBody能夠將返回的對象轉爲JSON字符串 * 此註解須要引入jackson的包(以及註解驅動的配置等,這裏已經進行配置) * 將返回信息包裝在msg裏 */ @RequestMapping("/emps") @ResponseBody public Msg getEmpsWithJson(@RequestParam(value="pn",defaultValue="1") Integer pn, Model model){ //改造爲一個分頁查詢 //在查詢以前傳入分頁參數:起始頁和每頁記錄數 PageHelper.startPage(pn, 5); //後面緊跟的查詢就是分頁查詢 List<Employee> empList = empService.getAll(); //用PageInfo對結果進行包裝,只須要將PageInfo交給頁面便可,這裏面封裝了詳細的信息,第二個參數爲須要連續顯示的記錄數 PageInfo page = new PageInfo(empList,5); //直接將pageInfo對象進行返回 //將pageInfo放在msg裏進行返回,鏈式操做返回對象自己 return Msg.success().add("pageInfo", page); }
而後,咱們先將index.jsp重命名爲index-old.jsp先放一邊,new 一個index.jsp進行改造:
咱們先用ajax改造表格的生成部分:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>員工列表</title> <% pageContext.setAttribute("path",request.getContextPath()); %> <!-- 推薦以 / 開始的相對路徑(以服務器的根路徑爲相對路徑) --> <link href="${path}/static/bootstrap/css/bootstrap.min.css" rel="stylesheet"> <!-- 先引入jQuery,再引入js --> <script type="text/javascript" src="${path}/static/bootstrap/js/jquery.min.js"> </script> <script src="${path}/static/bootstrap/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <!-- 分爲四大行 --> <!-- 標題 --> <div class="row"> <div class="col-md-12"> <font size="20">SSM-CRUD</font> </div> </div> <!-- 按鈕 --> <div class="row"> <!-- 偏移4列 --> <div class="col-md-4 col-md-offset-8"> <button type="button" class="btn btn-primary ">新增</button> <button type="button" class="btn btn-danger ">刪除</button> </div> </div> <!-- 表格 --> <div class="row"> <div class="col-md-12"> <table class="table table-hover" id="emps_table"> <thead> <tr> <th>#</th> <th>empName</th> <th>empEmail</th> <th>gender</th> <th>deptName</th> <th>操做</th> </tr> </thead> <tbody> </tbody> </table> </div> </div> <!-- 分頁信息 --> <div class="row"> <!-- 分頁文字信息,其中分頁信息都封裝在pageInfo中 --> <div class="col-md-6"> 當前第:頁,總共:頁,總共:條記錄 </div> <!-- 分頁條 --> <div class="col-md-6"> </div> </div> </div> <script type="text/javascript"> //頁面加載完成後直接發送ajax請求,取得分頁數據 $(function(){ $.ajax({ //請求方式 type : "GET", //請求url url : "${path}/emps", //請求要帶的數據 data :"pn=1", //請求成功的回調函數 success : function(result) { //1.解析JSON返回員工數據 build_emps_table(result) //2.解析生成分頁信息 } }); }); //解析員工數據 function build_emps_table(result){ //員工數據 var emps = result.map.pageInfo.list; //使用jQuery遍歷數組,遍歷的是取出來的json數組,能夠經過開發工具查看JSON結構 $.each(emps,function(idx,item){ //使用jQuery生成各列 var empIdTd = $("<td></td>").append(item.empId); var empNameTd = $("<td></td>").append(item.empName); //三目運算符處理性別 var genderTd = $("<td></td>").append(item.gender=="M"?"男":"女"); var emailTd = $("<td></td>").append(item.email); var deptNameTd = $("<td></td>").append(item.department.deptName); //添加操做按鈕,經過jQuery的一些操做(例如CSS的追加CSS操做),完成按鈕的構建 var editBtn = $("<button></button>").addClass("btn btn-info 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); //鏈式操做完成列的添加(鏈式操做因爲jQuery返回的是原元素) $("<tr></tr>").append(empIdTd) .append(empNameTd) .append(genderTd) .append(emailTd) .append(deptNameTd) .append(deptNameTd) .append(btnTd) .appendTo($("#emps_table tbody")); }); } //生成分頁導航信息 function build_pages_nav(result){ } </script> </body> </html>
//這裏須要適當複習一下jQuery
咱們再解析分頁信息和分頁條部分:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>員工列表</title> <% pageContext.setAttribute("path",request.getContextPath()); %> <!-- 推薦以 / 開始的相對路徑(以服務器的根路徑爲相對路徑) --> <link href="${path}/static/bootstrap/css/bootstrap.min.css" rel="stylesheet"> <!-- 先引入jQuery,再引入js --> <script type="text/javascript" src="${path}/static/bootstrap/js/jquery.min.js"> </script> <script src="${path}/static/bootstrap/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <!-- 分爲四大行 --> <!-- 標題 --> <div class="row"> <div class="col-md-12"> <font size="20">SSM-CRUD</font> </div> </div> <!-- 按鈕 --> <div class="row"> <!-- 偏移4列 --> <div class="col-md-4 col-md-offset-8"> <button type="button" class="btn btn-primary ">新增</button> <button type="button" class="btn btn-danger ">刪除</button> </div> </div> <!-- 表格 --> <div class="row"> <div class="col-md-12"> <table class="table table-hover" id="emps_table"> <thead> <tr> <th>#</th> <th>empName</th> <th>empEmail</th> <th>gender</th> <th>deptName</th> <th>操做</th> </tr> </thead> <tbody> </tbody> </table> </div> </div> <!-- 分頁信息 --> <div class="row"> <!-- 分頁文字信息,其中分頁信息都封裝在pageInfo中 --> <div class="col-md-6" id="page_info"> </div> <!-- 分頁條 --> <div class="col-md-6" id="page_nav"> </div> </div> </div> <script type="text/javascript"> //頁面加載完成後直接發送ajax請求,取得分頁數據 $(function(){ $.ajax({ //請求方式 type : "GET", //請求url url : "${path}/emps", //請求要帶的數據 data :"pn=1", //請求成功的回調函數 success : function(result) { //1.解析JSON返回員工數據 build_emps_table(result); //2.解析生成分頁信息(分頁條與分頁導航) build_pages_info(result); build_pages_nav(result); } }); }); //解析員工數據 function build_emps_table(result){ //員工數據 var emps = result.map.pageInfo.list; //使用jQuery遍歷數組,遍歷的是取出來的json數組,能夠經過開發工具查看JSON結構 $.each(emps,function(idx,item){ //使用jQuery生成各列 var empIdTd = $("<td></td>").append(item.empId); var empNameTd = $("<td></td>").append(item.empName); //三目運算符處理性別 var genderTd = $("<td></td>").append(item.gender=="M"?"男":"女"); var emailTd = $("<td></td>").append(item.email); var deptNameTd = $("<td></td>").append(item.department.deptName); //添加操做按鈕,經過jQuery的一些操做(例如CSS的追加CSS操做),完成按鈕的構建 var editBtn = $("<button></button>").addClass("btn btn-info 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); //鏈式操做完成列的添加(鏈式操做因爲jQuery返回的是原元素) $("<tr></tr>").append(empIdTd) .append(empNameTd) .append(genderTd) .append(emailTd) .append(deptNameTd) .append(deptNameTd) .append(btnTd) .appendTo($("#emps_table tbody")); }); } //生成分頁信息 function build_pages_info(result){ //當前頁 var currentPage = result.map.pageInfo.pageNum; //總頁數 var totalPage = result.map.pageInfo.pages; //總記錄數 var totalCount = result.map.pageInfo.total; $("#page_info").append("當前第:"+currentPage+"頁,"+"總共:"+totalPage+"頁,"+"總共:"+totalCount+"條記錄"); } //生成分頁導航信息 function build_pages_nav(result){ //導航條外層的Ul var navUl = $("<ul></ul>").addClass("pagination"); //首頁 var firstPageLi = $("<li></li>").append($("<a></a>").append("首頁").attr("href","#")); //前一頁 var prePageLi = $("<li></li>").append($("<a></a>").append("«")); //判斷是否有首頁 if(result.map.pageInfo.hasPreviousPage == false){ firstPageLi.addClass("disabled"); prePageLi.addClass("disabled"); } //後一頁 var nextPageLi = $("<li></li>").append($("<a></a>").append("»")); //末頁 var lastPageLi = $("<li></li>").append($("<a></a>").append("末頁").attr("href","#")); //判斷是否有末頁 if(result.map.pageInfo.hasNextPage == false){ lastPageLi.addClass("disabled"); nextPageLi.addClass("disabled"); } //添加到ul navUl.append(firstPageLi).append(prePageLi); //遍歷頁碼數 $.each(result.map.pageInfo.navigatepageNums,function(idx,item){ var numLi = $("<li></li>").append($("<a></a>").append(item)); //若是爲當前頁,則高亮顯示,採用增長類的方法完成 if(result.map.pageInfo.pageNum == item){ numLi.addClass("active"); } navUl.append(numLi); }); navUl.append(nextPageLi).append(lastPageLi); var navEle = $("<nav></nav>").append(navUl); $("#page_nav").append(navEle); } </script> </body> </html>
//這樣,加上一些頁面的處理後,整個頁面框架就搭建出來了
接下來咱們進行一些事件的處理,例如導航條的頁碼,是點擊後再發送ajax請求進行查詢顯示的,咱們對頁面再次進行改造:
咱們對頁碼進行單擊事件綁定與相關函數的抽取,完成後的index.jsp頁面以下
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>員工列表</title> <% pageContext.setAttribute("path",request.getContextPath()); %> <!-- 推薦以 / 開始的相對路徑(以服務器的根路徑爲相對路徑) --> <link href="${path}/static/bootstrap/css/bootstrap.min.css" rel="stylesheet"> <!-- 先引入jQuery,再引入js --> <script type="text/javascript" src="${path}/static/bootstrap/js/jquery.min.js"> </script> <script src="${path}/static/bootstrap/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <!-- 分爲四大行 --> <!-- 標題 --> <div class="row"> <div class="col-md-12"> <font size="20">SSM-CRUD</font> </div> </div> <!-- 按鈕 --> <div class="row"> <!-- 偏移4列 --> <div class="col-md-4 col-md-offset-8"> <button type="button" class="btn btn-primary ">新增</button> <button type="button" class="btn btn-danger ">刪除</button> </div> </div> <!-- 表格 --> <div class="row"> <div class="col-md-12"> <table class="table table-hover" id="emps_table"> <thead> <tr> <th>#</th> <th>empName</th> <th>empEmail</th> <th>gender</th> <th>deptName</th> <th>操做</th> </tr> </thead> <tbody> </tbody> </table> </div> </div> <!-- 分頁信息 --> <div class="row"> <!-- 分頁文字信息,其中分頁信息都封裝在pageInfo中 --> <div class="col-md-6" id="page_info"> </div> <!-- 分頁條 --> <div class="col-md-6" id="page_nav"> </div> </div> </div> <script type="text/javascript"> //頁面加載完成後直接發送ajax請求,取得分頁數據 $(function(){ //加載完頁面就經過這個函數發ajax請求 toPage(1); }); //跳轉到某頁的函數 function toPage(pn){ $.ajax({ //請求方式 type : "GET", //請求url url : "${path}/emps", //請求要帶的數據 data :"pn="+pn, //請求成功的回調函數 success : function(result) { //1.解析JSON返回員工數據 build_emps_table(result); //2.解析生成分頁信息(分頁條與分頁導航) build_pages_info(result); build_pages_nav(result); } }); } //解析員工數據 function build_emps_table(result){ //員工數據 var emps = result.map.pageInfo.list; //使用jQuery遍歷數組,遍歷的是取出來的json數組,能夠經過開發工具查看JSON結構 $.each(emps,function(idx,item){ //使用jQuery生成各列 var empIdTd = $("<td></td>").append(item.empId); var empNameTd = $("<td></td>").append(item.empName); //三目運算符處理性別 var genderTd = $("<td></td>").append(item.gender=="M"?"男":"女"); var emailTd = $("<td></td>").append(item.email); var deptNameTd = $("<td></td>").append(item.department.deptName); //添加操做按鈕,經過jQuery的一些操做(例如CSS的追加CSS操做),完成按鈕的構建 var editBtn = $("<button></button>").addClass("btn btn-info 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); //鏈式操做完成列的添加(鏈式操做因爲jQuery返回的是原元素) $("<tr></tr>").append(empIdTd) .append(empNameTd) .append(genderTd) .append(emailTd) .append(deptNameTd) .append(deptNameTd) .append(btnTd) .appendTo($("#emps_table tbody")); }); } //生成分頁信息 function build_pages_info(result){ //當前頁 var currentPage = result.map.pageInfo.pageNum; //總頁數 var totalPage = result.map.pageInfo.pages; //總記錄數 var totalCount = result.map.pageInfo.total; $("#page_info").append("當前第:"+currentPage+"頁,"+"總共:"+totalPage+"頁,"+"總共:"+totalCount+"條記錄"); } //生成分頁導航信息 function build_pages_nav(result){ //導航條外層的Ul var navUl = $("<ul></ul>").addClass("pagination"); //首頁 var firstPageLi = $("<li></li>").append($("<a></a>").append("首頁").attr("href","#")); //前一頁 var prePageLi = $("<li></li>").append($("<a></a>").append("«")); //判斷是否有首頁 if(result.map.pageInfo.hasPreviousPage == false){ firstPageLi.addClass("disabled"); prePageLi.addClass("disabled"); } //後一頁 var nextPageLi = $("<li></li>").append($("<a></a>").append("»")); //末頁 var lastPageLi = $("<li></li>").append($("<a></a>").append("末頁").attr("href","#")); //判斷是否有末頁 if(result.map.pageInfo.hasNextPage == false){ lastPageLi.addClass("disabled"); nextPageLi.addClass("disabled"); } //添加到ul navUl.append(firstPageLi).append(prePageLi); //遍歷頁碼數 $.each(result.map.pageInfo.navigatepageNums,function(idx,item){ var numLi = $("<li></li>").append($("<a></a>").append(item)); //若是當前頁爲正在遍歷的頁,則高亮顯示,採用增長類的方法完成 if(result.map.pageInfo.pageNum == item){ numLi.addClass("active"); } //給每一個頁碼添加單擊綁定事件 numLi.click(function(){ toPage(item); }); navUl.append(numLi); }); navUl.append(nextPageLi).append(lastPageLi); var navEle = $("<nav></nav>").append(navUl); $("#page_nav").append(navEle); } </script> </body> </html>
咱們測試一下,很容易發現問題:
頁面雖然數據正常返回,但因爲是無刷新的返回數據,形成數據的追加而不是替換!咱們再次進行改造:
在全部操做以前進行數據的清空,因而,改造頁面以下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>員工列表</title> <% pageContext.setAttribute("path",request.getContextPath()); %> <!-- 推薦以 / 開始的相對路徑(以服務器的根路徑爲相對路徑) --> <link href="${path}/static/bootstrap/css/bootstrap.min.css" rel="stylesheet"> <!-- 先引入jQuery,再引入js --> <script type="text/javascript" src="${path}/static/bootstrap/js/jquery.min.js"> </script> <script src="${path}/static/bootstrap/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <!-- 分爲四大行 --> <!-- 標題 --> <div class="row"> <div class="col-md-12"> <font size="20">SSM-CRUD</font> </div> </div> <!-- 按鈕 --> <div class="row"> <!-- 偏移4列 --> <div class="col-md-4 col-md-offset-8"> <button type="button" class="btn btn-primary ">新增</button> <button type="button" class="btn btn-danger ">刪除</button> </div> </div> <!-- 表格 --> <div class="row"> <div class="col-md-12"> <table class="table table-hover" id="emps_table"> <thead> <tr> <th>#</th> <th>empName</th> <th>empEmail</th> <th>gender</th> <th>deptName</th> <th>操做</th> </tr> </thead> <tbody> </tbody> </table> </div> </div> <!-- 分頁信息 --> <div class="row"> <!-- 分頁文字信息,其中分頁信息都封裝在pageInfo中 --> <div class="col-md-6" id="page_info"> </div> <!-- 分頁條 --> <div class="col-md-6" id="page_nav"> </div> </div> </div> <script type="text/javascript"> //頁面加載完成後直接發送ajax請求,取得分頁數據 $(function(){ //加載完頁面就經過這個函數發ajax請求 toPage(1); }); //跳轉到某頁的函數 function toPage(pn){ $.ajax({ //請求方式 type : "GET", //請求url url : "${path}/emps", //請求要帶的數據 data :"pn="+pn, //請求成功的回調函數 success : function(result) { //1.解析JSON返回員工數據 build_emps_table(result); //2.解析生成分頁信息(分頁條與分頁導航) build_pages_info(result); build_pages_nav(result); } }); } //解析員工數據 function build_emps_table(result){ //清空表格數據 $("#emps_table tbody").empty(); //員工數據 var emps = result.map.pageInfo.list; //使用jQuery遍歷數組,遍歷的是取出來的json數組,能夠經過開發工具查看JSON結構 $.each(emps,function(idx,item){ //使用jQuery生成各列 var empIdTd = $("<td></td>").append(item.empId); var empNameTd = $("<td></td>").append(item.empName); //三目運算符處理性別 var genderTd = $("<td></td>").append(item.gender=="M"?"男":"女"); var emailTd = $("<td></td>").append(item.email); var deptNameTd = $("<td></td>").append(item.department.deptName); //添加操做按鈕,經過jQuery的一些操做(例如CSS的追加CSS操做),完成按鈕的構建 var editBtn = $("<button></button>").addClass("btn btn-info 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); //鏈式操做完成列的添加(鏈式操做因爲jQuery返回的是原元素) $("<tr></tr>").append(empIdTd) .append(empNameTd) .append(genderTd) .append(emailTd) .append(deptNameTd) .append(deptNameTd) .append(btnTd) .appendTo($("#emps_table tbody")); }); } //生成分頁信息 function build_pages_info(result){ //清空分頁數據 $("#page_info").empty(); //當前頁 var currentPage = result.map.pageInfo.pageNum; //總頁數 var totalPage = result.map.pageInfo.pages; //總記錄數 var totalCount = result.map.pageInfo.total; $("#page_info").append("當前第:"+currentPage+"頁,"+"總共:"+totalPage+"頁,"+"總共:"+totalCount+"條記錄"); } //生成分頁導航信息 function build_pages_nav(result){ //清空分頁導航信息 $("#page_nav").empty(); //導航條外層的Ul var navUl = $("<ul></ul>").addClass("pagination"); //首頁 var firstPageLi = $("<li></li>").append($("<a></a>").append("首頁").attr("href","#")); //前一頁 var prePageLi = $("<li></li>").append($("<a></a>").append("«")); //判斷是否有首頁 if(result.map.pageInfo.hasPreviousPage == false){ firstPageLi.addClass("disabled"); prePageLi.addClass("disabled"); } //添加首頁和前一頁翻頁的單機事件 firstPageLi.click(function(){ toPage(1); }); prePageLi.click(function(){ toPage(result.map.pageInfo.pageNum-1); }); //後一頁 var nextPageLi = $("<li></li>").append($("<a></a>").append("»")); //末頁 var lastPageLi = $("<li></li>").append($("<a></a>").append("末頁").attr("href","#")); //判斷是否有末頁 if(result.map.pageInfo.hasNextPage == false){ lastPageLi.addClass("disabled"); nextPageLi.addClass("disabled"); } //添加末頁和後一頁翻頁的單機事件 lastPageLi.click(function(){ toPage(result.map.pageInfo.pages); }); nextPageLi.click(function(){ toPage(result.map.pageInfo.pageNum+1); }); //添加到ul navUl.append(firstPageLi).append(prePageLi); //遍歷頁碼數 $.each(result.map.pageInfo.navigatepageNums,function(idx,item){ var numLi = $("<li></li>").append($("<a></a>").append(item)); //若是當前頁爲正在遍歷的頁,則高亮顯示,採用增長類的方法完成 if(result.map.pageInfo.pageNum == item){ numLi.addClass("active"); } //給每一個頁碼添加單擊綁定事件 numLi.click(function(){ toPage(item); }); navUl.append(numLi); }); navUl.append(nextPageLi).append(lastPageLi); var navEle = $("<nav></nav>").append(navUl); $("#page_nav").append(navEle); } </script> </body> </html>
爲了頁碼的正常顯示,咱們在插件中配置一個合理化的參數,參數的具體做用請參見文檔:
<!-- 分頁插件的使用 --> <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 配置合理化參數 --> <property name="reasonable" value="true"/> </plugin> </plugins>
咱們把前面的代碼稍微優化一下,若是按鈕禁用了,就不綁定事件了,可用時才綁定事件:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>員工列表</title> <% pageContext.setAttribute("path",request.getContextPath()); %> <!-- 推薦以 / 開始的相對路徑(以服務器的根路徑爲相對路徑) --> <link href="${path}/static/bootstrap/css/bootstrap.min.css" rel="stylesheet"> <!-- 先引入jQuery,再引入js --> <script type="text/javascript" src="${path}/static/bootstrap/js/jquery.min.js"> </script> <script src="${path}/static/bootstrap/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <!-- 分爲四大行 --> <!-- 標題 --> <div class="row"> <div class="col-md-12"> <font size="20">SSM-CRUD</font> </div> </div> <!-- 按鈕 --> <div class="row"> <!-- 偏移4列 --> <div class="col-md-4 col-md-offset-8"> <button type="button" class="btn btn-primary ">新增</button> <button type="button" class="btn btn-danger ">刪除</button> </div> </div> <!-- 表格 --> <div class="row"> <div class="col-md-12"> <table class="table table-hover" id="emps_table"> <thead> <tr> <th>#</th> <th>empName</th> <th>empEmail</th> <th>gender</th> <th>deptName</th> <th>操做</th> </tr> </thead> <tbody> </tbody> </table> </div> </div> <!-- 分頁信息 --> <div class="row"> <!-- 分頁文字信息,其中分頁信息都封裝在pageInfo中 --> <div class="col-md-6" id="page_info"> </div> <!-- 分頁條 --> <div class="col-md-6" id="page_nav"> </div> </div> </div> <script type="text/javascript"> //頁面加載完成後直接發送ajax請求,取得分頁數據 $(function(){ //加載完頁面就經過這個函數發ajax請求 toPage(1); }); //跳轉到某頁的函數 function toPage(pn){ $.ajax({ //請求方式 type : "GET", //請求url url : "${path}/emps", //請求要帶的數據 data :"pn="+pn, //請求成功的回調函數 success : function(result) { //1.解析JSON返回員工數據 build_emps_table(result); //2.解析生成分頁信息(分頁條與分頁導航) build_pages_info(result); build_pages_nav(result); } }); } //解析員工數據 function build_emps_table(result){ //清空表格數據 $("#emps_table tbody").empty(); //員工數據 var emps = result.map.pageInfo.list; //使用jQuery遍歷數組,遍歷的是取出來的json數組,能夠經過開發工具查看JSON結構 $.each(emps,function(idx,item){ //使用jQuery生成各列 var empIdTd = $("<td></td>").append(item.empId); var empNameTd = $("<td></td>").append(item.empName); //三目運算符處理性別 var genderTd = $("<td></td>").append(item.gender=="M"?"男":"女"); var emailTd = $("<td></td>").append(item.email); var deptNameTd = $("<td></td>").append(item.department.deptName); //添加操做按鈕,經過jQuery的一些操做(例如CSS的追加CSS操做),完成按鈕的構建 var editBtn = $("<button></button>").addClass("btn btn-info 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); //鏈式操做完成列的添加(鏈式操做因爲jQuery返回的是原元素) $("<tr></tr>").append(empIdTd) .append(empNameTd) .append(genderTd) .append(emailTd) .append(deptNameTd) .append(deptNameTd) .append(btnTd) .appendTo($("#emps_table tbody")); }); } //生成分頁信息 function build_pages_info(result){ //清空分頁數據 $("#page_info").empty(); //當前頁 var currentPage = result.map.pageInfo.pageNum; //總頁數 var totalPage = result.map.pageInfo.pages; //總記錄數 var totalCount = result.map.pageInfo.total; $("#page_info").append("當前第:"+currentPage+"頁,"+"總共:"+totalPage+"頁,"+"總共:"+totalCount+"條記錄"); } //生成分頁導航信息 function build_pages_nav(result){ //清空分頁導航信息 $("#page_nav").empty(); //導航條外層的Ul var navUl = $("<ul></ul>").addClass("pagination"); //首頁 var firstPageLi = $("<li></li>").append($("<a></a>").append("首頁").attr("href","#")); //前一頁 var prePageLi = $("<li></li>").append($("<a></a>").append("«")); //判斷是否有首頁 if(result.map.pageInfo.hasPreviousPage == false){ firstPageLi.addClass("disabled"); prePageLi.addClass("disabled"); }else{ //添加首頁和前一頁翻頁的單機事件 firstPageLi.click(function(){ toPage(1); }); prePageLi.click(function(){ toPage(result.map.pageInfo.pageNum-1); }); } //後一頁 var nextPageLi = $("<li></li>").append($("<a></a>").append("»")); //末頁 var lastPageLi = $("<li></li>").append($("<a></a>").append("末頁").attr("href","#")); //判斷是否有末頁 if(result.map.pageInfo.hasNextPage == false){ lastPageLi.addClass("disabled"); nextPageLi.addClass("disabled"); }else{ //添加末頁和後一頁翻頁的單機事件 lastPageLi.click(function(){ toPage(result.map.pageInfo.pages); }); nextPageLi.click(function(){ toPage(result.map.pageInfo.pageNum+1); }); } //添加到ul navUl.append(firstPageLi).append(prePageLi); //遍歷頁碼數 $.each(result.map.pageInfo.navigatepageNums,function(idx,item){ var numLi = $("<li></li>").append($("<a></a>").append(item)); //若是當前頁爲正在遍歷的頁,則高亮顯示,採用增長類的方法完成 if(result.map.pageInfo.pageNum == item){ numLi.addClass("active"); } //給每一個頁碼添加單擊綁定事件 numLi.click(function(){ toPage(item); }); navUl.append(numLi); }); navUl.append(nextPageLi).append(lastPageLi); var navEle = $("<nav></nav>").append(navUl); $("#page_nav").append(navEle); } </script> </body> </html>
至此,查詢完成!