📄 struts.txt.txt
字号:
页面实体类为Page.java,代码如下所示:
package org.shirdrn.page;
import java.util.List;
public class Page {
private int pageSize; // 每页显示的记录数
private int totalPage; // 页数
private int rowCount; // 总记录数
private int currentPage; // 当前页
private int prePage; // 上一页
private int nextPage; // 下一页
private boolean hasNextPage; // 是否有下一页
private boolean hasPreviousPage; // 是否有前一页
private List list;
public Page(){ // 实例化一个Page对象时,初始化页面显示记录数
this.pageSize = 5;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public int getNextPage() {
return nextPage;
}
public void setNextPage(int nextPage) {
this.nextPage = nextPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPrePage() {
return prePage;
}
public void setPrePage(int prePage) {
this.prePage = prePage;
}
public int getRowCount() {
return rowCount;
}
public void setRowCount(int rowCount) {
this.rowCount = rowCount;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public boolean isHasNextPage() {
return hasNextPage;
}
public void setHasNextPage(boolean hasNextPage) {
this.hasNextPage = hasNextPage;
}
public boolean isHasPreviousPage() {
return hasPreviousPage;
}
public void setHasPreviousPage(boolean hasPreviousPage) {
this.hasPreviousPage = hasPreviousPage;
}
}
分页逻辑的实现类为PageUtil.java,代码如下所示:
package org.shirdrn.page;
import org.hibernate.Query;
import org.hibernate.Session;
import org.shirdrn.hibernate.HibernateSessionFactory;
public class PageUtil {
private Page page; // 分页逻辑处理的对象是页面实体
private int start; // start是点击“上一页”或“下一页”传递进来的页码
private String hql; // 检索的HQL语句
public PageUtil(int start,String sql){
// 实例化一个PageUtil对象。在这里调用了除了最后一个方法getPage()以外的,该PageUtil类的所有实现方法,具体实现可以看下面的方法实现
// 注意:必须保证其中方法的顺序如下所示
page = new Page(); // 初始化一个Page,即指定了pageSize=5,这个可以到Page类中自定义
this.start = start;
this.hql = sql;
setRowCount(); // 设置page的属性rowCount值,即该次查询的总记录数
setTotalPage(); // 设置总页数
setCurrentPage(); // 设置当前页
setPrePage(); // 设置上一页
setNextPage(); // 设置下一页
setPreOrNextBoolean(); // 设置是否有“上一页”或者是否有下一页的boolean型标识
}
public void setPreOrNextBoolean(){ // 设置是否有“上一页”或者是否有下一页的boolean型标识
if(page.getCurrentPage()<=1){ // 第一页时,没有上一页,则上一页链接失效
page.setHasPreviousPage(false);
}
else{
page.setHasPreviousPage(true);
}
if(page.getCurrentPage()>=page.getTotalPage()){ // 最后一页时,没有下一页,则下一页链接失效
page.setHasNextPage(false);
}
else{
page.setHasNextPage(true);
}
}
public void setCurrentPage(){ // 设置当前页
if(start<1){
page.setCurrentPage(1);
}
if(start>page.getTotalPage()){
page.setCurrentPage(page.getTotalPage());
}
page.setCurrentPage(start);
}
public void setPrePage(){ // 设置上一页
page.setPrePage(page.getCurrentPage()-1);
}
public void setNextPage(){
page.setNextPage(page.getCurrentPage()+1);
}
public void setTotalPage(){ // 设置总页数
int rowCount = getRowCount();
int pageSize = page.getPageSize();
if(rowCount>pageSize){
if(rowCount%pageSize == 0){
page.setTotalPage(rowCount/pageSize);
}
else{
page.setTotalPage(1+(rowCount/pageSize));
}
}
else{
page.setTotalPage(1);
}
}
public void setRowCount(){ // 设置page的属性rowCount值,即该次查询的总记录数
page.setRowCount(getRowCount());
}
public int getRowCount(){ // 获取总记录数
Session session = HibernateSessionFactory.getSession();
Query query = session.createQuery(hql); // 执行检索
int size = query.list().size();
session.close();
return size;
}
public int getStartIndex(){ // 当传递进来一个页码,根据这个页码设置执行后台检索的起始索引
int startIndex = 0;
if(start<0){
startIndex = 0;
}
else{
if(start>page.getTotalPage()){
startIndex = page.getPageSize()*(page.getTotalPage()-1);
}
else{
startIndex = page.getPageSize()*(start-1);
}
}
return startIndex;
}
public Page getPage(){ // 这个方法不是在初始化PageUtil时调用的,而是初始化之后调用,返回一个页(主要是一个页所要显示的记录列表query.list())
Session session = HibernateSessionFactory.getSession();
Query query = session.createQuery(hql);
query.setFetchSize(10);
query.setFirstResult(getStartIndex());
query.setMaxResults(page.getPageSize());
page.setList(query.list());
session.close();
return page;
}
}
页面listPersons.jsp代码的编写如下所示:
<%@ page contentType="text/html;charset=utf-8"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html:html locale="true">
<head>
<base href="<%=basePath%>">
<title>查询记录列表</title>
<style type="text/css">
body{
background:#000000;
font-size:12px;
color:yellow;
}
a:link{
color:yellow;
text-decoration:none;
}
a:hover{
color:red;
text-decoration:none;
}
a:visited{
color:yellow;
text-decoration:none;
}
</style>
</head>
<body>
<table width="60%" align="center" bgcolor="green" border="1">
<tr>
<th colspan="10">人员查询列表</th>
</tr>
<tr align="center">
<td width="20%"><b>ID</b></td>
<td width="20%"><b>姓名</b></td>
<td width="20%"><b>性别</b></td>
<td width="20%"><b>年龄</b></td>
<td width="20%"><b>住址</b></td>
</tr>
<logic:present name="persons">
<logic:iterate id="person" name="persons" type="org.shirdrn.entity.Person">
<logic:present name="person">
<tr align="center">
<td width="20%" height="10"><bean:write name="person" property="id"/></td>
<td width="20%" height="10"><bean:write name="person" property="name"/></td>
<td width="20%" height="10"><bean:write name="person" property="gender"/></td>
<td width="20%" height="10"><bean:write name="person" property="age"/></td>
<td width="20%" height="10"><bean:write name="person" property="addr"/></td>
</tr>
</logic:present>
</logic:iterate>
</logic:present>
</table>
<table align="center" width="60%" bgcolor="green" border="1">
<tr>
<td align="center" colspan="10">
<logic:present name="myPage">
<html:link page="/page.do?page=1">首页</html:link>
<logic:equal name="myPage" property="hasPreviousPage" value="false">上一页</logic:equal>
<logic:equal name="myPage" property="hasPreviousPage" value="true">
<a href="<%=path%>/page.do?page=<bean:write name="myPage" property="prePage"/>">上一页</a>
</logic:equal>
每页<bean:write name="myPage" property="pageSize"/>条记录
共<bean:write name="myPage" property="rowCount"/>条记录
当前第(<bean:write name="myPage" property="currentPage"/>/<bean:write name="myPage" property="totalPage"/>)页
<logic:equal name="myPage" property="hasNextPage" value="false">下一页</logic:equal>
<logic:equal name="myPage" property="hasNextPage" value="true">
<a href="<%=path%>/page.do?page=<bean:write name="myPage" property="nextPage"/>">下一页</a>
</logic:equal>
<a href="<%=path%>/page.do?page=<bean:write name='myPage' property='totalPage'/>">末页</a>
</logic:present>
</td>
</tr>
</table>
</body>
</html:html>
其中,每次点击“首页”、“上一页”、“下一页”、“末页”链接的时候,都去请求Action,将页码传到Action中,根据传递进去的页码来处理下次显示的记录的查询。
Action的实现为PageAction,代码如下所示:
package org.shirdrn.struts.action;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.shirdrn.page.Page;
import org.shirdrn.page.PageUtil;
public class PageAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
String page = request.getParameter("page");
String hql = "from Person";
int start = (new Integer(page)).intValue();
PageUtil pu = new PageUtil(start,hql);
Page myPage = pu.getPage();
List persons = pu.getPage().getList();
HttpSession session = request.getSession();
session.setAttribute("myPage", myPage);
session.setAttribute("persons", persons);
return mapping.findForward("list_persons");
}
}
测试时,直接在浏览器地址栏中键入链接:
http://localhost:8080/HibernateStrutsPage/page.do?page=1
测试页面的效果如下所示:
第一页的时候,“上一页”链接是无效的,即在页面listPersons.jsp中执行代码:
<logic:equal name="myPage" property="hasPreviousPage" value="false">上一页</logic:equal>
最后一页的时候,“下一页”的链接是无效的,即在页面listPersons.jsp中执行代码:
<logic:equal name="myPage" property="hasNextPage" value="false">下一页</logic:equal>
否则,如既不是第一页,又不是左后一页,则执行下面的代码显示“上一页”和“下一页”,而且链接是有效的,可以请求Action执行查询获取相应页显示的记录:
<logic:equal name="myPage" property="hasPreviousPage" value="true">
<a href="<%=path%>/page.do?page=<bean:write name="myPage" property="prePage"/>">上一页</a>
</logic:equal>
<logic:equal name="myPage" property="hasNextPage" value="true">
<a href="<%=path%>/page.do?page=<bean:write name="myPage" property="nextPage"/>">下一页</a>
</logic:equal>
而首页和末页在页面显示的任何时候,都是有效的:
<html:link page="/page.do?page=1">首页</html:link>
</logic:equal>
<a href="<%=path%>/page.do?page=<bean:write name='myPage' property='totalPage'/>">末页</a>
</logic:present>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -