⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 struts.txt.txt

📁 struts分页实现 能独立使用 struts分页实现
💻 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 + -