本篇文章,我们来讲分页显示。
分页一直都是做web开发流程中不可或缺的部分。
且,本篇文章也是《S2SH整合以及图片上传》这一系列文章的最后一篇,所有关于S2SH的基本操作都已经在本套系列文章中讲述完毕。
话不多说,下面来看具体操作。
第一步,我们需要在index.jsp页面中添加一个选项:
代码如下:
<a href="${pageContext.request.contextPath}/person/personPage!listByPage">分页显示人员</a>
第二步,我们需要在src目录下新建一个工具包,其中用来存储分页类的实体类PageShow:
PageShow类的代码如下:
package com.ssh.util;
public class PageShow {
// 此类用于分页
private int pageNow;// 当前页
private int totalSize;// 总条数
private int totalPage;// 总页数
private int pageSize = 10;// 每页显示条数
private boolean hasPre;// 是否有上一页
private boolean hasNext;// 是否有下一页
private boolean hasFirst;// 是否有首页
private boolean hasLast;// 是否有尾页
public PageShow(int pageNow, int totalSize) {
// 构造方法
this.setPageNow(pageNow);
this.setTotalSize(totalSize);
}
public PageShow(int pageNow, int totalSize, int pageSize) {// 可动态改变每页条数
// 构造方法
this.setPageNow(pageNow);
this.setTotalSize(totalSize);
this.pageSize = pageSize;
}
public void setPageNow(int pageNow) {// 得到当前页
this.pageNow = pageNow;
}
public int getPageNow() {
return pageNow;
}
public void setTotalSize(int totalSize) {// 总条数
this.totalSize = totalSize;
}
public int getTotalSize() {
return totalSize;
}
public void setPageSize(int pageSize) {// 每页显示条数
this.pageSize = pageSize;
}
public int getPageSize() {
return pageSize;
}
public int getTotalPage() {// 总页数 = 总条数/每页显示条数
totalPage = this.getTotalSize() / this.getPageSize();
if (this.getTotalSize() % this.getPageSize() != 0) {
totalPage++; // 若余数为不0 则要多加一页
}
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public boolean isHasPre() {// 是否有上一页 除第一页以外都有上一页 说明有首页的就有上一页
if (this.isHasFirst()) {
return true;
} else
return false;
}
public void setHasPre(boolean hasPre) {
this.hasPre = hasPre;
}
public boolean isHasNext() {// 是否有下一页 除最后一页以外都有下一页 说明有尾页的就有下一页
if (this.isHasLast()) {
return true;
} else
return false;
}
public void setHasNext(boolean hasNext) {
this.hasNext = hasNext;
}
public boolean isHasFirst() {// 是否有首页 除第一页以外都有首页
if (this.pageNow == 1)// 是第一页就没有首页
return false;
else
return true;
}
public void setHasFirst(boolean hasFirst) {
this.hasFirst = hasFirst;
}
public boolean isHasLast() {// 是否有尾页 除最后一页以外都有尾页
if (pageNow == this.getTotalPage()) {// 最后一页
return false;
} else
return true;
}
public void setHasLast(boolean hasLast) {
this.hasLast = hasLast;
}
}
第三步,我们在PersonDao接口中添加如下方法:
代码如下:
// 查询所有用户 分页
public List<Person> findAllPerson(int pageNow, int pageSize);
// 所有用户个数
public int findPersonSize();
第四步,我们需要在PersonDaoImpl类中实现该方法:
// 查询所有用户 分页
@SuppressWarnings("unchecked")
@Override
public List<Person> findAllPerson(int pageNow, int pageSize) {
String hql = "from Person";
Query query = sessionFactory.getCurrentSession().createQuery(hql);//执行查询操作
query.setFirstResult((pageNow - 1) * pageSize);
query.setMaxResults(pageSize);
List<Person> personList = query.list();
if (personList.size() > 0) {
return personList;
}
return null;
}
// 所有用户个数
@Override
public int findPersonSize() {
String hql = "from Person";
int size = sessionFactory.getCurrentSession().createQuery(hql).list().size();
return size;
}
第五步,在PersonService接口中添加如下方法:
代码如下:
// 查询所有用户 分页
public List<Person> findAllPerson(int pageNow, int pageSize);
// 所有用户个数
public int findPersonSize();
第六步,我们需要在PersonServiceImpl类中实现该方法:
// 查询所有用户 分页
@Override
public List<Person> findAllPerson(int pageNow, int pageSize) {
List<Person> personList = this.personDao.findAllPerson(pageNow, pageSize);
return personList;
}
// 所有用户个数
@Override
public int findPersonSize() {
return this.personDao.findPersonSize();
}
第七步,这里是分页显示,我们特别的,新建一个Action来处理它PersonPageAction:
package com.ssh.action;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.ssh.po.Person;
import com.ssh.service.PersonService;
import com.ssh.util.PageShow;
public class PersonPageAction extends ActionSupport{
private static final long serialVersionUID = 1L;
@Resource
private PersonService personService;
private int pageNow = 1;// 动态改变 页面取得
private int pageSize = 2;// 固定不变
public int getPageNow() {
return pageNow;
}
public void setPageNow(int pageNow) {
this.pageNow = pageNow;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
//分页
@SuppressWarnings({ "rawtypes", "unchecked" })
public String listByPage() {
List<Person> personList = personService.findAllPerson(pageNow, pageSize);
if (personList.size()!=0) {// 用户列表
Map session = ActionContext.getContext().getSession();
Map request = (Map) ActionContext.getContext().get("request");
session.put("personList", personList);// 保存在session
PageShow page = new PageShow(pageNow, personService.findPersonSize(), pageSize);// 实例化分页对象
request.put("page", page);// 保存到request
return SUCCESS;
}
return ERROR;
}
}
第八步,我们需要在struts.xml中配置一个action,如下:
代码如下:
<action name="personPage" class="personPageAction">
<result name="success">/listByPage.jsp</result>
</action>
第九步,因为我们的struts中的action交给了spring来管理,所以我们需要在applicationContext.xml中配置一下新建的PersonPageAction:
代码如下:
<bean id="personPageAction" class="com.ssh.action.PersonPageAction" scope="prototype" />
第十步,我们新建一个用来分页显示的listByPage.jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>List Person Page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h2>S2SH整合以及图片上传</h2>
<h2>显示人员</h2>
<table border="1">
<tr>
<td>用户id</td>
<td>用户姓名</td>
<td>用户图片路径</td>
<td>删除用户</td>
<td>修改用户</td>
</tr>
<c:forEach items="${personList}" var="person">
<tr>
<td>${person.id}</td>
<td>${person.name}</td>
<td>${person.imgurl}</td>
<td>
<a href="${pageContext.request.contextPath}/person/person!delete?id=${person.id }&imgurl=${person.imgurl}">删除用户</a>
</td>
<td>
<a href="${pageContext.request.contextPath}/person/person!goUpdate?id=${person.id }">修改用户</a>
</td>
</tr>
</c:forEach>
<s:set name="page" value="#request.page"></s:set>
<tr>
<td colspan="9">当前是第<s:property value="#page.pageNow" />页,共<s:property
value="#page.totalPage" />页
<s:if test="#page.hasFirst">
<a href="${pageContext.request.contextPath}/person/personPage!listByPage?pageNow=1">首页</a>
</s:if> <s:if test="#page.hasPre">
<a href="${pageContext.request.contextPath}/person/personPage!listByPage?pageNow=<s:property value="#page.pageNow-1"/> "
>上一页</a>
</s:if> <s:if test="#page.hasNext">
<a href="${pageContext.request.contextPath}/person/personPage!listByPage?pageNow=<s:property value="#page.pageNow+1" />"
>下一页</a>
</s:if> <s:if test="#page.hasLast">
<a href="${pageContext.request.contextPath}/person/personPage!listByPage?pageNow=<s:property value="#page.totalPage"/>"
>尾页</a>
</s:if></td>
</tr>
</table>
<hr />
<c:forEach items="${personList}" var="person">
<dl>
<dt>
<img src="${pageContext.request.contextPath}/${person.imgurl}" alt="图片无法显示" height="200" width="300"/>
</dt>
<dd>
<ul>
<li>
<p>${person.id}</p>
</li>
<li>
<p>${person.name}</p>
</li>
</ul>
</dd>
</dl>
</c:forEach>
</body>
</html>
第十一步,测试:
至此,分页显示完成!