`
cprogrammer
  • 浏览: 10433 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论
  • 375: 业务需要积累的,也需要你能坚持。
    ...
  • protti: jkfzero 写道不是说BOSS的网际结算业务流程相当的繁琐 ...
    ...
  • cprogrammer: acd79258 写道正在体验BOSS中。。感觉如下: 以前 ...
    ...
  • yuxie: 人云亦云罢,俺做过BOSS,也做过财务、人力资源一方面的一些软 ...
    ...
  • jkfzero: 不是说BOSS的网际结算业务流程相当的繁琐么?没有人介绍下。 ...
    ...

Struts分页技术

阅读更多
拜读了bibiye的《一个高效简洁的Struts分页方法(原创)》后,根据bibiye的方法,自己修改了一下,也弄了一个struts下的分页,大家见笑了!

我的方法是,根据用户点击导航条上的页号(offset),到DB中读取该页的数据(不是一次全部读出),点到哪页读哪页的数据,JBX + tomcat + oracle下测试通过,数据库用的表是oracle的emp表。

********分页类Pager.java,负责生成分页导航条********

package page;

/**
 * 分页代码
 * <p>Title: 分页</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: BCS</p>
 * @author Alex
 * @version 1.0
 */
public class Pager {
  private int offset;
  private int size;
  private int length;
  private String url;
  private String pageHeader;
  public Pager(int offset, int size, int length, String url, String pageHeader) {
    this.offset = offset;
    this.size = size;
    this.length = length;
    this.url = url;
    this.pageHeader = pageHeader;
  }

  /**
   * 返回分页导航条
   * @param offset int 起始记录的位置
   * @param size int 总记录数
   * @param length int 步长
   * @param url String .do的url
   * @param pageHeader String 导航条的前缀文字提示
   * @return String
   */
  public String getPageNavigation() {
    String pageNavigation = ""; //最终返回的分页导航条
    //记录数超过一页,需要分页
    if (size > length) {
      String pref; //前缀
      if (url.indexOf("?") > -1) {
        //如果url中已经包含了其他的参数,就把offset参数接在后面
        pref = "&";
      }
      else {
        //如果url中没有别的参数
        pref = "?";
      }
      //如果导航条包含header
      if (pageHeader != null && pageHeader.length() > 0) {
        pageNavigation = pageHeader + " : ";
      }
      //如果不是第一页,导航条将包含“<<”(第一页)和“<”(前一页)
      if (offset > 0) {
        pageNavigation += "<a href='" + url + pref + "offset=0'>[<<]</a>\n" +
            "<a href='" + url + pref + "offset=" + (offset - length) +
            "'>[<]</a>\n";
      }
      //导航条中,排头的那一页的offset值
      int startOffset;
      //位于导航条中间的那一页的offset值(半径)
      int radius = constants.MAX_PAGE_INDEX / 2 * length;
      //如果当前的offset值小于半径
      if (offset < radius || this.pageCount() <= constants.MAX_PAGE_INDEX) {
        //那么第一页排头
        startOffset = 0;
      }
      else if (offset < size - radius) {
        startOffset = offset - radius;
      }
      else {
        startOffset = (size / length - constants.MAX_PAGE_INDEX) * length;
      }
      for (int i = startOffset;
           i < size && i < startOffset + constants.MAX_PAGE_INDEX * length;
           i += length) {
        if (i == offset) {
          //当前页号,加粗显示
          pageNavigation += "<b>" + (i / length + 1) + "</b>\n";
        }
        else {
          //其他页号,包含超链接
          pageNavigation += "<a href='" + url + pref + "offset=" + i + "'>" +
              (i / length + 1) + "</a>\n";
        }
      }
      //如果不是最后一页,导航条将包含“>”(下一页)和“>>”(最后一页)
      if (offset < size - length) {
        pageNavigation += "<a href='" + url + pref + "offset=" +
            (offset + length) + "'>[>]</a>\n" +
            "<a href='" + url + pref + "offset=" + lastPageOffset() +
            "'>[>>]</a>\n";
      }
//      System.out.println("radius : " + radius);
//      System.out.println("start offset : " + startOffset);
      return pageNavigation;
    }
    //记录不超过一页,不需要分页
    else {
      return "";
    }
  }

  /**
   * 返回分页后的总页数
   * @param size int 总记录数
   * @param length int 每页的记录数
   * @return int
   */
  public int pageCount() {
    int pagecount = 0;
    if (size % length == 0) {
      pagecount = size / length;
    }
    else {
      pagecount = size / length + 1;
    }
    return pagecount;
  }

  /**
   * 返回最后一页的记录数
   * @param size int 总记录数
   * @param length int 每页的记录数
   * @return int
   */
  public int lastPageSize() {
    int lastpagesize = 0;
    if (size % length == 0) {
      lastpagesize = length;
    }
    else {
      lastpagesize = size % length;
    }
    return lastpagesize;
  }

  /**
   * 返回最后一页的起始记录位置
   * @param size int 总记录数
   * @param length int 每页的记录数
   * @return int
   */
  public int lastPageOffset() {
    return size - lastPageSize();
  }

  public int getOffset() {
    return offset;
  }

  public void setOffset(int offset) {
    this.offset = offset;
  }

  public int getSize() {
    return size;
  }

  public void setSize(int size) {
    this.size = size;
  }

  public int getLength() {
    return length;
  }

  public void setLength(int length) {
    this.length = length;
  }

  public String getUrl() {
    return url;
  }

  public void setUrl(String url) {
    this.url = url;
  }

  public String getPageHeader() {
    return pageHeader;
  }

  public void setPageHeader(String pageHeader) {
    this.pageHeader = pageHeader;
  }
}

********数据处理类empDAO.java,负责访问DB,获取当前页面需要显示的记录********

package page;

import java.sql.*;
import java.util.*;

public class empDAO {
  public empDAO() {
  }

  /**
   * 从offset位置起始,返回length条记录
   * @param offset int 起始的记录位置
   * @param length int 步长
   * @param conn Connection 数据库连接
   * @return ArrayList
   */
  public ArrayList findAllEmp(int offset, int length, Connection conn) throws
      SQLException {
    PreparedStatement ps = null;
    ResultSet rs = null;
    ArrayList emps = new ArrayList();
    empVO empvo = null;
    String strSql = "select empno, ename from emp where rowid not in (select rowid from emp where rownum <= ?) and rownum <= ?";
    try {
      ps = conn.prepareStatement(strSql);
      ps.setInt(1, offset); //起始记录的位置
      ps.setInt(2, length); //步长
      rs = ps.executeQuery();
      while (rs != null && rs.next()) {
        empvo = new empVO();
        empvo.setEmpno(rs.getInt("empno"));
        empvo.setEname(rs.getString("ename"));
        emps.add(empvo);
      }
    }
    catch (SQLException ex) {
      ex.printStackTrace();
      throw ex;
    }
    return emps;
  }

  /**
   * 返回总的记录数
   * @param conn Connection
   * @throws SQLException
   * @return int
   */
  public int getRsTotalCount(Connection conn) throws SQLException {
    PreparedStatement ps = null;
    ResultSet rs = null;
    int rsCount = 0;
    String strSql = "select count(empno) as empCount from emp";
    try {
      ps = conn.prepareStatement(strSql);
      rs = ps.executeQuery();
      if (rs != null && rs.next()) {
        rsCount = rs.getInt("empCount");
      }
    }
    catch (SQLException ex) {
      ex.printStackTrace();
      throw ex;
    }
    return rsCount;
  }
}

********业务类empBO.java,调用empDAO类********

package page;

import java.util.*;

/**
 * BO类
 * <p>Title: 分页</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: BCS</p>
 * @author Alex
 * @version 1.0
 */
public class empBO {
  private DBPool db = DBPool.newInstance();
  private empDAO empdao = new empDAO();

  public empBO() {
  }

  /**
   * 从offset位置起始,返回length条记录
   * @param offset int 起始
   * @param length int 步长
   * @throws Exception
   * @return ArrayList
   */
  public ArrayList findAllEmp(int offset, int length) throws Exception {
    ArrayList emps = new ArrayList();
    try {
      emps = empdao.findAllEmp(offset, length, db.getConnection());
    }
    catch (Exception ex) {
      throw ex;
    }
    finally {
      db.release();
    }
    return emps;
  }

  /**
   * 返回总的记录数
   * @throws Exception
   * @return int
   */
  public int getRsTotalCount() throws Exception {
    int rsCount = 0;
    try {
      rsCount = empdao.getRsTotalCount(db.getConnection());
    }
    catch (Exception ex) {
      throw ex;
    }
    finally {
      db.release();
    }
    return rsCount;
  }
}


********ActionForm类empForm.java********

package page;

import javax.servlet.http.*;

import org.apache.struts.action.*;

public class empForm
    extends ActionForm {
  private int offset; //起始记录的位置//每页显示的记录数
  public ActionErrors validate(ActionMapping actionMapping,
                               HttpServletRequest httpServletRequest) {
    /**@todo: finish this method, this is just the skeleton.*/
    return null;
  }

  public void reset(ActionMapping actionMapping,
                    HttpServletRequest httpServletRequest) {
    this.offset = 0; //记录默认从第一条开始显示
  }

  public int getOffset() {
    return offset;
  }

  public void setOffset(int offset) {
    this.offset = offset;
  }

}

********Action类empAction.java,控制器,调用BO类,Pager类********

package page;

import java.util.*;
import javax.servlet.http.*;

import org.apache.struts.action.*;

/**
 * 分页测试的Action
 * <p>Title: 分页</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: BCS</p>
 * @author Alex
 * @version 1.0
 */
public class empAction
    extends Action {

  public ActionForward execute(ActionMapping actionMapping,
                               ActionForm actionForm,
                               HttpServletRequest httpServletRequest,
                               HttpServletResponse httpServletResponse) {
    empForm empform = (empForm) actionForm;
    return performList(actionMapping, actionForm, httpServletRequest,
                       httpServletResponse);
  }

  private ActionForward performList(ActionMapping actionMapping,
                                    ActionForm actionForm,
                                    HttpServletRequest request,
                                    HttpServletResponse response) {
    try {
      empBO empbo = new empBO();
      //获取外部传进来的起始记录号
      int offset = ( (empForm) actionForm).getOffset();
      //获取每页的记录数
      int pagesize = constants.PAGE_SIZE;
      //获取记录集合,从offset开始,取length条记录
      ArrayList emps = empbo.findAllEmp(offset, pagesize);
      //计算所有记录的条数(总记录数)
      int size = empbo.getRsTotalCount();
      //外部url地址,得到形如: http://localhost:8088/bugMIS/showlist.do 的String
      String url = request.getContextPath() + actionMapping.getPath() + ".do";
      //实例化分页类
      Pager p = new Pager(offset, size, pagesize, url, "Page Navigation");
      //获取分页导航条
      //String pageNavigation = p.getPageNavigation();
      //将url字符串和记录集合,存入request中
      request.setAttribute("pager", p);
      request.setAttribute("emps", emps);
    }
    catch (Exception e) {
      e.printStackTrace();
      return actionMapping.findForward("failure");
    }
    return actionMapping.findForward("success");
  }
}

********数据库连接池类DBPool.java,可以使用tomcat的连接池,也可以不用,这里关闭了********

package page;

import java.sql.*;
import javax.naming.*;
import javax.sql.*;

import org.apache.commons.logging.*;

/**
 * 系统连接池类
 * <p>Title: Gantoo@91.com</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: BCS</p>
 * @author Alex
 * @version 1.0
 */
public class DBPool {
  Log log = LogFactory.getLog("DBPool"); //日志机
  private DBPool() {
  }

  private Connection conn = null;

  /* true:使用连接池
     false:不使用连接池,采用JDBC直接连接 */
  private final static boolean USE_DB_POOL = false;
  private final static String jndi_DataSource = "jdbc/BugMIS_ora";
  private final static String jdbcdriver =
      "oracle.jdbc.driver.OracleDriver";
  private final static String url =
      "jdbc:oracle:thin:@localhost:1521:myo9";
  private final static String user = "scott";
  private final static String pass = "tiger";

  public static DBPool newInstance() {
    return new DBPool();
  }

  /**
   * 切换是否使用连接池
   * */
  public Connection getConnection() {
    if (USE_DB_POOL) {
      conn = getConnectionByDBPool();
    }
    else {
      conn = getConnectionDirect();
    }
    return conn;
  }

  /**
   * 直接采用JDBC连接数据库
   * */
  private Connection getConnectionDirect() {
    try {
      Class.forName(jdbcdriver).newInstance();
      conn = DriverManager.getConnection(url, user, pass);
    }
    catch (SQLException ex) {
      log.error("Error Connection! " + ex.getMessage());
    }
    catch (ClassNotFoundException ex) {
      log.error("Driver Not Found! " + ex.getMessage());
    }
    catch (IllegalAccessException ex) {
      log.error(ex.getMessage());
    }
    catch (InstantiationException ex) {
      log.error(ex.getMessage());
    }
    return conn;
  }

  /**
   * 采用连接池
   * */
  private Connection getConnectionByDBPool() {
    try {
      Context initCtx = new InitialContext();
      Context ctx = (Context) initCtx.lookup("java:/comp/env");
      DataSource ds = (DataSource) ctx.lookup(jndi_DataSource);
      conn = ds.getConnection();
    }
    catch (NamingException ex) {
      log.error("Data Source Not Found! " + ex.getMessage());
      //System.out.println("未找到数据源" + ex.getMessage());
    }
    catch (SQLException ex1) {
      log.error("Error Connection! " + ex1.getMessage());
      //System.out.println("错误的数据连接" + ex1.getMessage());
    }
    return conn;
  }

  /**
   * 释放连接
   * */
  public void release() {
    try {
      if (!conn.isClosed()) {
        conn.close();
      }
    }
    catch (SQLException ex) {
      log.error("Connection Closing Error! " + ex.getMessage());
      //System.out.println("连接关闭失败" + ex.getMessage());
    }
  }
}

********包含常量的类constants.java,常量********

package page;

/**
 * 定义工程中公用的常量
 * <p>Title: 分页</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: BCS</p>
 * @author Alex
 * @version 1.0
 */
public final class constants {
  public static final int MAX_PAGE_INDEX = 5; //页脚显示多少页
  public static final int PAGE_SIZE = 2; //每页的记录数
}


********测试jsp页面index.jsp,为了方便测试,嵌入了java代码,能显示就行********

<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ page contentType="text/html; charset=GBK" import="java.util.*,page.*"%>
<html:html>
<head>
<title></title>
<style type="text/css">
.pt9 {  font: 10pt "宋体"}
body { font: 10pt "宋体" ; margin: 15px}
td {  font-size: 10pt}
a:hover {  font-size: 10pt; color: red; text-decoration: underline}
a:link {  font-size: 10pt; color: blue; text-decoration: underline}
a:active {  font-size: 10pt; color: blue; text-decoration: underline}
a:visited { font-size: 10pt; color: blue; text-decoration: underline }
</style>
</head>
<body bgcolor="#ffffff">

<p><a href="http://localhost:8088/page/showEmp.do?offset=0">Show Me All Of The Emps</a></p>

<logic:present name="emps">
  <%
  ArrayList emps = (ArrayList)request.getAttribute("emps");
  Iterator it = emps.iterator();
  empVO empvo;
  while(it!=null && it.hasNext()){
    empvo = (empVO)it.next();
    out.print(empvo.getEmpno() + "  ");
    out.print(empvo.getEname() + "<br>");
  }
    out.print("当前页有 " + emps.size() + " 条记录<br>");
    out.print("<p>");
  %>
</logic:present>

<logic:present name="pager">
  <%
  Pager pager = (Pager)request.getAttribute("pager");
  out.print(pager.getPageNavigation() + "<p>");
  out.print("共有记录 " + pager.getSize() + " 条<br>");
  out.print("每页有 " + pager.getLength() + " 条记录<br>");
  out.print("共分 " + pager.pageCount() + " 页<br>");
  %>
</logic:present>
</body>
</html:html>

********配置文件struts-config.xml********

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
  <form-beans>
    <form-bean name="empForm" type="page.empForm" />
  </form-beans>
  <action-mappings>
    <action input="/index.jsp" name="empForm" path="/showEmp" scope="request" type="page.empAction" validate="false">
      <forward name="faiure" path="/index.jsp" />
      <forward name="success" path="/index.jsp" />
    </action>
  </action-mappings>
</struts-config>


分享到:
评论
1 楼 leofox 2008-11-26  
我想请问下高手!怎么分页功能是可以完成,但是有个问题想问下您,就是点12345都没问题,但反过来点就有问题了,很慢慢得你不敢相信!不知道是怎么回事!

相关推荐

    struts分页技术

    Struts分页技术是Web应用开发中常用的一种优化手段,主要用于处理大数据量的展示问题,提升用户体验。在大型系统中,如果一次性加载所有数据,不仅会消耗大量服务器资源,也会导致用户界面响应变慢。因此,分页技术...

    struts分页技术的源代码

    Struts分页技术是Web开发中常用的一种优化用户体验的方法,特别是在数据量庞大的情况下,它能够帮助用户逐页浏览数据,而无需一次性加载所有内容,从而提高网页加载速度和交互效率。Struts,作为Apache组织的一个...

    Struts分页.Struts分页.

    Struts框架是Java Web开发中的一个关键组件,它主要用于构建MVC(模型-视图-控制器)架构的应用程序。在大型数据展示时,分页功能是必不可少...因此,学习和掌握Struts分页技术对于Java Web开发者来说是非常有价值的。

    jsp +struts 分页经典

    本项目名为“jsp +struts 分页经典”,显然是一个利用这两种技术实现的分页展示数据的案例。下面我们将深入探讨JSP和Struts框架,以及它们在分页、查询和数据操作中的应用。 首先,JSP是Java平台上的动态网页技术,...

    框架分页--struts-分页

    ### Struts 分页技术详解 #### 一、引言 在现代Web应用开发中,分页功能是非常常见且重要的一个需求。特别是在展示大量数据时,合理的分页不仅可以提高用户体验,还可以减轻服务器压力,提高系统性能。本文将详细...

    struts分页2

    ### Struts分页技术详解 #### 一、引言 在Web开发中,为了提高用户体验并减轻服务器压力,分页显示查询结果是一项非常重要的技术。本文将详细介绍如何在Struts框架中实现查询结果的分页显示,并重点讲解`logic:...

    Struts分页

    ### Struts 分页技术详解 #### 一、概述 在Web开发中,为了提升用户体验以及减轻服务器负担,分页是一项非常实用的技术。Struts作为Java Web应用开发中的一个经典框架,提供了灵活且易于实现的分页功能。本文将...

    Struts完整分页

    通过以上步骤,我们可以构建出一个完整的Struts分页系统。这个过程中,关键是理解Struts的MVC架构以及如何在各层之间传递和处理分页信息。熟练掌握分页技术不仅能够提升用户体验,也有助于优化应用的性能和可维护性...

    Struts2分页源码技术的应用

    在本文中,我们将深入探讨Struts2分页技术的实现原理、应用方法以及与Hibernate框架的结合。 首先,Struts2作为一款基于MVC模式的Java Web框架,它提供了丰富的拦截器(Interceptor)和动作(Action)机制,使得...

    struts分页源代码

    通过研究这个示例,你将能更好地理解和掌握Struts框架下的分页技术,提升你的Java Web开发能力。 总之,"Struts分页源代码"是一个宝贵的教育资源,它提供了实践Struts分页功能的实战案例。通过对源代码的分析和学习...

    ajax+struts分页

    在Ajax+Struts分页中,主要涉及以下几个步骤: 1. **前端页面**:使用JavaScript和HTML构建用户界面。当用户点击分页链接时,会触发Ajax请求,而不是传统的页面跳转。 2. **Ajax请求**:通常使用JavaScript库如...

    struts分页算法的实现

    Struts分页算法是Java Web开发中常用的一种技术,它主要用于处理大数据集合的展示,提高网页的加载速度和用户体验。在Struts框架下,我们通常会结合Servlet、JSP和数据库查询来实现分页功能。以下将详细讲解Struts...

    分页大全(含JDBC分页 struts分页)

    这里我们将深入探讨“分页大全”,包括JDBC分页、Struts分页以及分页标签的使用。 首先,让我们了解什么是分页。在网页或应用中,分页是指将大量数据分割成若干小部分,每次只加载一部分,用户可以逐页浏览,而不是...

    STRUTS2+HIBERNATE详细的分页实现代码详细的分页实现代码

    分页是一种常见的技术手段,用于在数据量较大时提高用户体验。其实现的基本思路是将数据分割成多个小部分,每次只显示其中的一部分数据。用户可以通过翻页操作来查看其他部分的数据。 #### Struts2与Hibernate在...

    struts项目 分页技术

    Struts项目中的分页技术是Web开发中一种重要的优化手段,尤其在处理大量数据时,它能够有效地提高用户体验,避免一次性加载过多数据导致页面响应慢或者浏览器崩溃。本项目专门针对Struts框架,结合SQL Server 2000...

    struts实现分页技术源代码

    ### Struts实现分页技术详解 #### 一、概述 在Web开发中,为了提高用户体验并减轻服务器压力,分页技术被广泛应用于处理大量数据的展示。Struts框架作为Java Web开发中的一个重要组成部分,提供了丰富的功能来实现...

    使用struts实现分页

    9. **Ajax分页**:现代Web应用中,用户可能期望无刷新的分页体验,这可以通过AJAX技术实现。在Struts中,可以创建一个专门处理分页请求的Ajax Action,更新部分页面内容,而不是整个页面。 10. **错误处理与验证**...

    Struts 分页经典代码

    Struts框架是Java Web开发中常用的一个开源框架,它的核心是Model-View-Controller(MVC)设计模式,旨在简化应用程序的开发,提高代码的结构...通过对这些文件的分析,我们可以深入学习并实践Struts框架下的分页技术。

    struts2.0实现数据分页

    因此,数据分页技术应运而生。 **Struts2.0 实现数据分页的原理** 在Struts2中,数据分页通常通过Action类和视图(JSP或Freemarker)配合完成。Action类负责从数据库中获取指定页码的数据,并将这些数据传递给视图...

Global site tag (gtag.js) - Google Analytics