近期有個動態分頁的需求,所以就嘗試了一下手寫一個動態分頁,這裏做個簡單的記錄。
需求
後臺動態分頁的實現
項目說明
需要一個已經搭建好的能跑的SSM項目
部分代碼
Page.java
package com.yzpt.entity.page;
import java.io.Serializable;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
/**
* Description: 分頁處理的bean
*
* @author yzp
*
* @date 2019年10月17日
*
*/
@Setter
@Getter
public class Page<T> implements Serializable{
/**
* serialVersionUID
*
*/
private static final long serialVersionUID = 1L;
// 必要變量
private int pageNo; // 當前頁
private int pageSize = 10; // 每頁的數量 默認爲10 查詢數據時的第二個參數
private int size; // 當前頁的數量
private int totalCount; // 總記錄數
private List<T> resultList; // list結果
// 頁面顯示變量
private int firstData; // 查詢數據時的第一個參數
private int startPage; // 首頁
private int endPage; // 末頁
private int previousPage; // 上一頁
private int nextPage; // 下一頁
private int totalPage; // 總頁數
public Page() {
}
public Page(int firstData, int size, int totalCount, int pageSize, List<T> resultList) {
this.firstData = firstData;
this.size = size;
this.totalCount = totalCount;
this.pageSize = pageSize;
this.resultList = resultList;
pageNo = (firstData / pageSize) + 1;
totalPage = (totalCount % pageSize) == 0 ? totalCount / pageSize : (totalCount / pageSize) + 1;
if(totalCount == 0 && size == 0 ) {
pageNo = 1;
totalPage = 1;
}
int pageAreaSize = 4; // 頁碼顯示範圍
startPage = (pageNo - pageAreaSize) < 1 ? 1 : (pageNo - pageAreaSize);
endPage = (pageNo + pageAreaSize) > totalPage ? totalPage : (pageNo + pageAreaSize);
previousPage = (pageNo -1) < 1 ? 1 : (pageNo -1);
nextPage = (pageNo + 1) > totalPage ? totalPage : (pageNo + 1);
}
/**
* Description: 獲取mysql查詢的第一個參數
*
* @param pageNo
* @param pageSize
* @return
*
*/
public static int getFirstData(int pageNo, int pageSize) {
int firstData = (pageNo - 1) * pageSize;
if(firstData < 1)
firstData = 0;
return firstData;
}
}
User.java
package com.yzpt.entity.system;
import lombok.Getter;
import lombok.Setter;
/**
* Description: 用戶類
*
* @author yzp
*
* @date 2019年9月25日
*
*/
@Setter
@Getter
public class User {
private Integer id; // 用戶id
private String userName; // 用戶賬號
private String nickName; // 用戶暱稱
private String password; // 用戶密碼
private String salt; // 加密密碼的鹽
private Integer status; // 用戶狀態,0:創建未認證(比如沒有激活,沒有輸入驗證碼等) --等待驗證的用戶,1:正常狀態,2:用戶被鎖定
private String age; // 用戶年齡
private String sex; // 用戶性別
private String mail; // 用戶郵箱
private String photo; // 用戶頭像
}
UserController.java
package com.yzpt.web;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.yzpt.entity.page.Page;
import com.yzpt.entity.system.User;
import com.yzpt.service.UserService;
/**
* Description: 用戶管理控制層
*
* @author yzp
*
* @date 2019年10月14日
*
*/
@Controller
@RequestMapping("/user")
public class UserController {
private static final Logger logger = LogManager.getLogger(UserController.class);
private UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
/**
* Description: 用戶列表查詢
*
* @param request
* @param response
* @return
*
*/
@RequestMapping(value = "/userList")
@RequiresPermissions("user:view")
public String userInfo(HttpServletRequest request, HttpServletResponse response) {
String result = "";
try {
int pageNo = request.getParameter("pageNo") != null ? Integer.valueOf(request.getParameter("pageNo")) : 1;
int pageSize = 10;
// 查詢所有的用戶
Page<User> page = userService.findByPage(pageNo, pageSize);
User currentUser = (User)SecurityUtils.getSubject().getPrincipal();
request.setAttribute("page", page);
request.setAttribute("currentUser", currentUser);
result = "userInfoList";
} catch (Exception e) {
result = "error";
logger.info("用戶列表查詢失敗 ----- "+e);
}
return result;
}
// 用戶添加
@RequiresPermissions("userInfo:add")
@RequestMapping("/userAdd")
public String userInfoAdd(){
return "userInfoAdd";
}
// 用戶刪除
@RequestMapping("/userDel")
@RequiresPermissions("userInfo:del")
public String userDel(){
return "userInfoDel";
}
}
UserServiceImpl.java
package com.yzpt.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.yzpt.entity.page.Page;
import com.yzpt.entity.system.User;
import com.yzpt.mapper.UserMapper;
import com.yzpt.service.UserService;
/**
* Description: 用戶業務實現層
*
* @author yzp
*
* @date 2019年10月14日
*
*/
@Service
public class UserServiceImpl implements UserService {
private UserMapper userMapper;
@Autowired
public UserServiceImpl(UserMapper userMapper) {
this.userMapper = userMapper;
}
@Override
public Page<User> findByPage(int pageNo, int pageSize) {
int totalCount = userMapper.getTotalCount();
int firstData = Page.getFirstData(pageNo, pageSize);
List<User> list = userMapper.findByPage(firstData, pageSize);
int size = list == null ? 0 : list.size();
return new Page<User>(firstData, size, totalCount, pageSize, list);
}
}
UserMapper.xml
<!-- UserMapping -->
<resultMap id="UserResultMap" type="com.yzpt.entity.system.User">
<id property="id" column="id"></id>
<result property="userName" column="user_name"></result>
<result property="nickName" column="nick_name"></result>
<result property="password" column="password"></result>
<result property="salt" column="salt"></result>
<result property="state" column="state"></result>
<result property="age" column="age"></result>
<result property="sex" column="sex"></result>
<result property="mail" column="mail"></result>
<result property="photo" column="photo"></result>
</resultMap>
<!-- 獲取用戶總數量 -->
<select id="getTotalCount" resultType="int">
select count(*) from t_user
</select>
<!-- 分頁查詢數據 -->
<select id="findByPage" resultMap="UserResultMap">
select * from t_user order by id asc limit #{firstData}, #{pageSize}
</select>
userInfoList.jsp
<div class="pagination">
<div class="myPage header">共${page.totalCount }條記錄</div>
<div class="myPage"><a href="user/userList?pageNo=${page.startPage }">首頁</a></div>
<div class="myPage"><a href="user/userList?pageNo=${page.previousPage }">上一頁</a></div>
<c:forEach begin="${page.startPage }" end="${page.endPage }" var="s">
<c:choose>
<c:when test="${s == page.pageNo }">
<div class="active myPage"><a href="user/userList?pageNo=${s }">${s }</a></div>
</c:when>
<c:otherwise>
<div class="myPage"><a href="user/userList?pageNo=${s }">${s }</a></div>
</c:otherwise>
</c:choose>
</c:forEach>
<div class="myPage"><a href="user/userList?pageNo=${page.nextPage }">下一頁</a></div>
<div class="myPage"><a href="user/userList?pageNo=${page.endPage }">末頁</a></div>
<div class="myPage">共${page.totalPage }頁</div>
</div>
效果圖