一、DTO定义
1、定义基础DTO(BasePageDTO),包含分页相关信息:
package com.ppt.dto;
import javax.xml.bind.annotation.XmlTransient;
public class BasePageDTO {
@XmlTransient
protected Integer totalRecord;//总的记录数
protected Integer page = 1;//页码
protected Integer pageSize;//一页的大小
public Integer getPage() {
if(page == null || page < 0) {
page = 0;
}
return page;
}
public void setPage(Integer page) {
this.page = page;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getTotalRecord() {
return totalRecord;
}
public void setTotalRecord(Integer totalRecord) {
this.totalRecord = totalRecord;
}
}
2、定义普通DTO(UserDTO)继承BasePageDTO,可以去得当前页和页记录大小信息
package com.ppt.dto;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="user")
public class UserDTO extends BasePageDTO{
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "UserDTO [id=" + id + ", username=" + username + ", password="
+ password + "]";
}
}
3、定义抽象泛型基础DTO(PageDTO),定义更丰富的分页相关信息
package com.ppt.dto;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import org.springframework.data.domain.Page;
import org.springside.modules.mapper.BeanMapper;
import com.google.common.collect.Lists;
@XmlRootElement
public abstract class PageDTO<T> {
private int number;
private int size;
private int totalPages;
private int numberOfElements;
private long totalElements;
private boolean hasPreviousPage;
private boolean isFirstPage;
private boolean hasNextPage;
private boolean isLastPage;
private boolean hasContent;
public PageDTO(){};
public PageDTO(Page<? extends Object> page) {
List<T>rows = Lists.newArrayList();
if(page != null)
for(Object k: page.getContent()) {
rows.add(BeanMapper.map(k, getDesClz()));
}
this.setRows(rows);
this.number = page.getNumber();
this.size = page.getSize();
this.totalPages = page.getTotalPages();
this.numberOfElements = page.getNumberOfElements();
this.totalElements = page.getTotalElements();
this.hasPreviousPage = page.hasPreviousPage();
this.isFirstPage = page.isFirstPage();
this.hasNextPage = page.hasNextPage();
this.isLastPage = page.isLastPage();
this.hasContent = page.hasContent();
}
@XmlTransient
public abstract Class<T> getDesClz();
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int getTotalPages() {
return totalPages;
}
public void setTotalPages(int totalPages) {
this.totalPages = totalPages;
}
public int getNumberOfElements() {
return numberOfElements;
}
public void setNumberOfElements(int numberOfElements) {
this.numberOfElements = numberOfElements;
}
public long getTotalElements() {
return totalElements;
}
public void setTotalElements(long totalElements) {
this.totalElements = totalElements;
}
public boolean getHasPreviousPage() {
return hasPreviousPage;
}
public void setHasPreviousPage(boolean hasPreviousPage) {
this.hasPreviousPage = hasPreviousPage;
}
public boolean getIsFirstPage() {
return isFirstPage;
}
public void setIsFirstPage(boolean isFirstPage) {
this.isFirstPage = isFirstPage;
}
public boolean getHasNextPage() {
return hasNextPage;
}
public void setHasNextPage(boolean hasNextPage) {
this.hasNextPage = hasNextPage;
}
public boolean getIsLastPage() {
return isLastPage;
}
public void setIsLastPage(boolean isLastPage) {
this.isLastPage = isLastPage;
}
@XmlTransient
public abstract List<T> getRows();
public abstract void setRows(List<T> rows);
public boolean getHasContent() {
return hasContent;
}
public void setHasContent(boolean hasContent) {
this.hasContent = hasContent;
}
}
4、定义分页返回DTO(UserPageDTO),具体到某个类的DTO
package com.ppt.dto;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import org.springframework.data.domain.Page;
@XmlRootElement(name="Page")
public class UserPageDTO extends PageDTO<UserDTO> {
private List<UserDTO> rows;
public UserPageDTO() {}
public UserPageDTO(Page<? extends Object> pageable) {
super(pageable);
}
@Override
@XmlTransient
public Class<UserDTO> getDesClz() {
return UserDTO.class;
}
@Override
@XmlElementWrapper(name = "Users")
@XmlElement(name="user")
public List<UserDTO> getRows() {
if(rows == null) {
rows = new ArrayList<UserDTO>();
}
return rows;
}
@Override
public void setRows(List<UserDTO> rows) {
this.rows = rows;
}
}
二、service类
public UserPageDTO getUserPage(UserDTO dto) {
Map<String, String> map = new HashMap<String, String>();
map.put("username", dto.getUsername());
map.put("password", dto.getPassword());
RowBounds rowBounds = new RowBounds(dto.getPage(),dto.getPageSize());
List<UserDTO> list = userMapperDao.getUserPage(map, rowBounds);
Pageable pageRequest = new PageRequest(dto.getPage(),dto.getPageSize());
PageImpl<UserDTO> pageImpl = new PageImpl<UserDTO>(list,pageRequest,list.get(0).getTotalRecord());
UserPageDTO page = new UserPageDTO(pageImpl);
return page;
}
三、继承action类(BaseAction)
1、继承action
package com.ppt.action;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Sort;
import org.springside.modules.mapper.BeanMapper;
import com.opensymphony.xwork2.ActionSupport;
import com.ppt.dto.PageDTO;
@SuppressWarnings("serial")
public class BaseAction<T> extends ActionSupport {
private Logger log = Logger.getLogger(BaseAction.class);
protected Page<T> pageData;
protected final int PAGE_SIZE = 2;
protected int page = 0;
protected String sortType;
public Page<T> getDataPage() {
return pageData;
}
public String getSortType() {
return sortType;
}
public void setSortType(String sortType) {
this.sortType = sortType;
}
public int getPage() {
return page;
}
public void setPage(String page) {
if(page == null || "".equals(page.trim())) {
page = "1";
}
this.page = Integer.parseInt(page);
}
protected <M> Page<M> getPage(final PageDTO<? extends Object> pageDTO, final Class<? extends M> clz) {
if(pageDTO == null) {
return new PageImpl<M>(new ArrayList<M>());
}
Page<M> page = new DataPage<M>(pageDTO, clz);
return page;
}
class DataPage<M> implements Page<M>{
private PageDTO<? extends Object> pageDTO;
private Class<? extends M> clz;
private DataPage(PageDTO<? extends Object> pageDTO, Class<? extends M> clz) {
this.pageDTO = pageDTO;
this.clz = clz;
}
public int getNumber() {
return pageDTO.getNumber();
}
public int getSize() {
return pageDTO.getSize();
}
public int getTotalPages() {
return pageDTO.getTotalPages();
}
public int getNumberOfElements() {
return pageDTO.getNumberOfElements();
}
public long getTotalElements() {
return pageDTO.getTotalElements();
}
public boolean hasPreviousPage() {
return pageDTO.getHasPreviousPage();
}
public boolean isFirstPage() {
return pageDTO.getIsFirstPage();
}
public boolean hasNextPage() {
return pageDTO.getHasNextPage();
}
public boolean isLastPage() {
return pageDTO.getIsLastPage();
}
public Iterator<M> iterator() {
return getContent().iterator();
}
public List<M> getContent() {
List<M> list = new ArrayList<M>();
for(Object obj : pageDTO.getRows()) {
list.add(BeanMapper.map(obj, clz));
}
return list;
}
public boolean hasContent() {
return pageDTO.getHasContent();
}
public Sort getSort() {
return null;
}
}
}
2、具体的action类,继承基础BaseAction类
package com.ppt.action.user;
import java.util.Date;
import jxl.common.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.beans.factory.annotation.Autowired;
import com.ppt.action.BaseAction;
import com.ppt.dto.UserDTO;
import com.ppt.dto.UserPageDTO;
import com.ppt.service.UserService;
@SuppressWarnings("serial")
@Namespace("/user")
public class UserAction extends BaseAction<UserDTO>{
private Logger log = Logger.getLogger(UserAction.class);
@Autowired
private UserService userService;
private String username;
private String password;
@Action(value="doLogin", results={@Result(name="success", location="userList.jsp")})
public String getUserList() {
log.info("getUserList");
try {
UserDTO dto = new UserDTO();
dto.setPage(this.getPage());
dto.setPageSize(PAGE_SIZE);
UserPageDTO page = userService.getUserPage(dto);
pageData = getPage(page, UserDTO.class);
log.info("success");
} catch (Exception e) {
e.printStackTrace();
}
return "success";
}
@Action(value="logout", results={@Result(name="success", location="login.jsp")})
public String logout() {
log.info("退出登录:" + new Date().toString());
return "success";
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
四、页面分页代码:
1、tag标签(pagination.tag)
<%@tag pageEncoding="UTF-8"%>
<%@ attribute name="dataPage" type="org.springframework.data.domain.Page" required="true"%>
<%@ attribute name="paginationSize" type="java.lang.Integer" required="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
int current = dataPage.getNumber() + 1;
int begin = Math.max(1, current - paginationSize/2);
int end = Math.min(begin + (paginationSize - 1), dataPage.getTotalPages());
long totalCount = dataPage.getTotalElements();
request.setAttribute("totalCount", totalCount);
request.setAttribute("current", current);
request.setAttribute("begin", begin);
request.setAttribute("end", end);
request.setAttribute("total", dataPage.getTotalPages());
%>
<div class="pagination">
<ul>
<% if(dataPage.hasPreviousPage()) {%>
<li><a href="#" οnclick="getPage(1)">首页</a></li>
<li><a href="#" οnclick="getPage(${current-1})">上一页</a></li>
<%} else { %>
<li class="disabled"><a href="#">首页</a></li>
<li class="disabled"><a href="#">上一页</a></li>
<%} %>
<c:forEach var="i" begin="${begin}" end="${end}">
<c:choose>
<c:when test="${i == current}">
<li class="active"><a href="#">${i}</a></li>
</c:when>
<c:otherwise>
<li><a href="#" οnclick="getPage(${i})">${i}</a></li>
</c:otherwise>
</c:choose>
</c:forEach>
<% if (dataPage.hasNextPage()){%>
<li><a href="#" οnclick="getPage(${current+1})">下一页</a></li>
<li><a href="#" οnclick="getPage(${total})">尾页</a></li>
<%} else {%>
<li class="disabled"><a href="#">下一页</a></li>
<li class="disabled"><a href="#">尾页</a></li>
<%} %>
<li style="line-height:28px;"> 共 ${totalCount} 条记录</li>
</ul>
</div>
<html>
<head>
<script type="text/javascript">
function getPage(v){
var page = parseInt(v) - 1;
document.getElementById("page").value=page;
document.getElementById("queryForm").submit();
}
</script>
</head>
</html>
2、分页代码:(pagination.jsp)
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
<center>
<tags:pagination dataPage="${dataPage}" paginationSize="9"/>
</center>
3、显示的jsp页面
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!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>login</title>
<style type="text/css">
.tr{background:url(bg1.gif) #5A86D6;height:25px;text-align:center; font-weight:bold;}
.td{background:#F7F7FF;text-align:center;}
.td1{background:#F7F7FF;text-align:left;}
.td2{background:#F7F7FF;text-align:right;}
</style>
</head>
<body>
<%@include file="../common/leftMenu.jsp"%>
<form action="../user/doLogin.action" method="post" id="queryForm">
<input type="hidden" id="page" name="page" />
<table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#E2E2E2">
<thead>
<tr>
<th class="td">id</th>
<th class="td">用户名</th>
<th class="td">密码</th>
</tr>
</thead>
<tbody>
<s:iterator value="dataPage.content" id="obj">
<tr>
<td class="td">${obj.id}</td>
<td class="td">${obj.username}</td>
<td class="td">${obj.password}</td>
</tr>
</s:iterator>
</tbody>
</table>
<%@ include file="../common/pagination.jsp" %>
</form>
</body>
</html>
over 请结合我的另一博文看:Mysql+Mybatis+spring 后台分页 ,http://blog.csdn.net/ppt0501/article/details/13502581