<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    龍行天下

      政 博
    隨筆 - 23, 文章 - 0, 評論 - 12, 引用 - 0
    數(shù)據(jù)加載中……

    一個高效簡潔的Struts分頁方法

    在網(wǎng)上看了幾個Structs分頁,感覺不是很完善,于是根據(jù)自己的經(jīng)驗,寫了一個相對高效簡潔的分頁方法。由于本人水平有限,如果大家有什么更好的想法,歡迎不吝賜教。
      
      一、 開發(fā)環(huán)境
      
      我的開發(fā)環(huán)境是:JBuilder x + Weblogic 8.1 + Oracle 9i + Windows 2003 ,如果朋友們的開發(fā)環(huán)境不一樣亦無妨。
      
      二、開發(fā)思路
      
      既然講的是Struts,那自然離不了MVC,分頁顯示也是如此。
      
      1、 建立數(shù)據(jù)庫和對應(yīng)的表,本例的表是TCertificate。
      
      2、 建立適當(dāng)?shù)哪P徒M件,對應(yīng)你要查詢數(shù)據(jù)庫中的表。這部分由DAO數(shù)據(jù)訪問層來實現(xiàn),如果有的朋友對DAO不熟悉可以查詢一下相關(guān)資料。本例由CertificateDAO.java來實現(xiàn)。
      
      3 、建立分頁所需要的模型組件,由javaBean來充當(dāng),并與CertificateDAO實現(xiàn)分離。網(wǎng)上介紹的很多方法,都存在著數(shù)據(jù)與分頁組件藕合的現(xiàn)象,這也是本方法與其它分頁方法的主要不同之處。
      
      4、建立控制器組件,這部分由Struts 中的Action來實現(xiàn)。主要負(fù)責(zé)將實例化CertificateDAO,只取要顯示的數(shù)據(jù)記錄,存入ArrayList對象然后返回,并放到 request中。而分頁部分則根據(jù)分頁條件,單獨進(jìn)行構(gòu)造,避免了與DAO混在一起的情況發(fā)生。網(wǎng)上其它介紹的一些分頁方法中,基本上都是一次性讀出所有查詢的數(shù)據(jù),然后再由分頁相關(guān)組件進(jìn)行構(gòu)造。這樣,如果數(shù)據(jù)量大的話,很容易形成瓶頸。在本例中由于不是一次性地讀出查詢的所有數(shù)據(jù),而只是讀出一個頁面要顯示的數(shù)據(jù)記錄,這就節(jié)省了很多不必要的數(shù)據(jù)傳輸,提高了效率。本例中為CertificateAction.java。
      
       5、建立視圖組件,這部分由jsp來充當(dāng),為了不出現(xiàn)java 代碼,我們使用Struts提供的標(biāo)簽庫,主要負(fù)責(zé)從request中取出剛剛放入的對象,通過反復(fù)調(diào)用CertificateAction以及 action參數(shù),而實現(xiàn)分頁顯示。本例中為listcertificate.jsp。
      
      6、 建立并配置struts-config.xml。
      
      三、實例代碼
      
      確定好上面的開發(fā)思路后,代碼的實現(xiàn)就有單可循了。
      
      1、建數(shù)據(jù)庫和相應(yīng)的表。
      
      2、數(shù)據(jù)邏輯層的相關(guān)代碼。
      
      1)、通用的DAO類:CommonDAO.java
      
      這是一個很多DAO都要繼承到的通用DAO類,是我根據(jù)實踐總結(jié)出來的,為了減少篇幅,這里只顯示和本例相關(guān)的代碼。
      
      java代碼:
      
      代碼:
      --------------------------------------------------------------------------------
      package com.xindeco.business ;
      import java.io.*;
      import java.sql.*;
      import java.util.*;
      import javax.sql.*;
      import java.lang.IllegalAccessException;
      import java.lang.reflect.InvocationTargetException;
      import org.apache.commons.beanutils.BeanUtils;
      public class DAO
      {
      protected DataSource ds;
      /**
      * 說明:取得當(dāng)前查詢的總記錄數(shù)
      */
      public int getRows ()
      {
      return this.count;
      }
      public void rsHandler (ResultSet rs, int offset, int limit)
      {
      try
      {
      count = 0;
      rs.absolute ( -1) ;
      count = rs.getRow () ;
      if (offset <= 0)
      {
      rs.beforeFirst () ;
      }
      else
      {
      rs.absolute (offset) ;
      }
      }
      catch (Exception e)
      {
      e.printStackTrace () ;
      }
      }
      public DAO(DataSource ds) {
      this.ds = ds;
      }
      
      public void setDataSource(DataSource ds) {
      this.ds = ds;
      }
      
      protected void close(ResultSet rs) {
      if (rs != null) {
      try {
      rs.close();
      } catch (SQLException e) {
      }
      rs = null;
      }
      }
      
      protected void close(PreparedStatement pstmt) {
      if (pstmt != null) {
      try {
      pstmt.close();
      } catch (SQLException e) {
      }
      pstmt = null;
      }
      }
      protected void close(Connection conn) {
      if (conn != null) {
      try {
      conn.close();
      } catch (SQLException e) {
      e.printStackTrace();
      }
      conn = null;
      }
      }
      
      protected void rollback(Connection conn) {
      if (conn != null) {
      try {
      conn.rollback();
      } catch (SQLException e) {
      e.printStackTrace();
      }
      conn = null;
      }
      }
      }
      
      這個類主要是通過子類傳進(jìn)來的先進(jìn)結(jié)果集,取得查詢的記錄總數(shù),并對數(shù)據(jù)庫連接進(jìn)行簡單的管理。
      
      2)、對數(shù)據(jù)庫進(jìn)行訪問:CertificateDAO.java
      
      java代碼:
      
      代碼:
      --------------------------------------------------------------------------------
      package com.xindeco.business;
      
      import java.io.*;
      import java.sql.*;
      import java.util.*;
      import javax.sql.*;
      
      import com.xindeco.common.dbconn.DbConn;
      
      public class CertificateDAO extends DAO
      {
      
      public NationDAO(DataSource ds) {
      super(ds);
      }
      
      public List findCertificateList(int offset,int limit) throws SQLException
      {
      int countRows = 0 ;
      ArrayList list = null ;
      Connection conn = null;
      PreparedStatement pstmt = null;
      ResultSet rs = null;
      try
      {
      conn = ds.getConnection();
      String sql =
      "SELECT certificateID, certificateCode,certificateName,photoURL,"
      + "description,graduateID FROM TCertificate " ;
      pstmt = conn.prepareStatement(sql);
      rs = pstmt.executeQuery();
      /*對游標(biāo)進(jìn)行處理,rsHandler 方法在父類DAO中*/
      this.rsHandler(rs,offset,limit);
      if (rs != null && rs.next ())
      {
      list = new ArrayList () ;
      do
      {
      countRows++ ;
      list.add (rs2VO (rs)) ;
      }
      while ( (countRows++ < limit) && rs.next ()) ;
      }
      close(rs);
      close(pstmt);
      } catch (SQLException e) {
      close(rs);
      close(pstmt);
      rollback(conn);
      e.printStackTrace();
      }
      finally {
      close(conn);
      }
      return list ;
      }
      
      private CertificateVO rs2VO (ResultSet rs)
      {
      try
      {
      CertificateVO certificateVO = new CertificateVO () ;
      certificateVO.setCertificateID (rs.getInt ("certificateID")) ;
      certificateVO.setCertificateCode (rs.getString ("certificateCode")) ;
      certificateVO.setCertificateName (rs.getString ("certificateName")) ;
      certificateVO.setPhotoURL (rs.getString ("photoURL")) ;
      certificateVO.setDescription (rs.getString ("description")) ;
      certificateVO.setGraduateID (rs.getInt ("graduateID")) ;
      return certificateVO ;
      }
      catch (Exception ex)
      {
      ex.printStackTrace () ;
      return null ;
      }
      }
      }
      
      findCertificateList(int offset,int limit)是查得所有要顯示的數(shù)據(jù),并放入ArrayList中。看過網(wǎng)上有些例子,把數(shù)據(jù)記錄放入ArrayList的動作過程直接在while循環(huán)體里完成,如果字段多的話,會造成方法過于寵大,又不美觀。這里,數(shù)據(jù)記錄放入ArrayList的動作過程由rs2VO方法完成,就比較整潔了。另外,if (rs != null && rs.next ()) 配合while ( (countRows++ < limit) && rs.next ()) 是為了程序的健壯性考慮的,稍分析一下不難得出結(jié)論。
      
      3、建立控制器組件:CertificateAction.java
      
      java代碼:
      
      代碼:
      --------------------------------------------------------------------------------
      package com.xindeco.presentation;
      
      import javax.sql.* ;
      import java.util.* ;
      
      import javax.servlet.http.* ;
      import javax.servlet.* ;
      
      import org.apache.struts.action.* ;
      import org.apache.struts.util.* ;
      
      import com.xindeco.common.Pager;
      import com.xindeco.business.graduatedata.CertificateDAO ;
      
      public class CertificateAction
      extends Action
      {
      private static final int PAGE_LENGTH = 5 ; //每頁顯示5條記錄
      public ActionForward execute (ActionMapping mapping, Actionform form,
      HttpServletRequest request,
      HttpServletResponse response)
      {
      ActionForward myforward = null ;
      String myaction = mapping.getParameter () ;
      
      if (isCancelled (request))
      {
      return mapping.findForward ("failure") ;
      }
      if ("".equalsIgnoreCase (myaction))
      {
      myforward = mapping.findForward ("failure") ;
      }
      else if    ("LIST".equalsIgnoreCase (myaction))
      {
      myforward = performList (mapping, form, request, response) ;
      }
      else
      {
      myforward = mapping.findForward ("failure") ;
      }
      return myforward ;
      }
      
      private ActionForward performList (ActionMapping mapping,
      Actionform actionform,
      HttpServletRequest request,
      HttpServletResponse response)
      {
      try
      {
      DataSource ds = (DataSource) servlet.getServletContext().getAttribute(Action.DATA_SOURCE_KEY);
      
      CertificateDAO  certificateDAO = new CertificateDAO (ds) ;
      
      int offset = 0;  //翻頁時的起始記錄所在游標(biāo)
      int length = PAGE_LENGTH;
      String pageOffset = request.getParameter("pager.offset");
      if (pageOffset == null || pageOffset.equals("")) {
      offset = 0;
      } else {
      offset = Integer.parseInt(pageOffset);
      }
      List certificateList = certificateDAO .findCertificateList (offset,length) ;
      int size = certificateDAO.getRows(); // 取得總記錄數(shù)
      String url = request.getContextPath()+"/"+mapping.getPath()+".do";
      String pagerHeader = Pager.generate(offset, size, length, url); //分頁處理
      
      request.setAttribute ("pager", pagerHeader) ;
      request.setAttribute ("list", certificateList) ;
      }
      catch (Exception e)
      {
      e.printStackTrace();
      return mapping.findForward ("error") ;
      }
      return mapping.findForward ("success") ;
      }
      }
      
      CertificateAction.java主要是把數(shù)據(jù)從DAO中取出,并放入一個ArrayList 中,然后通過配置文件再軟件View的JSP頁。
      
      5、建立視圖listcertificate.jsp文件。
      
      jsp代碼:
      
      代碼:
      --------------------------------------------------------------------------------
      
      <%@ page contentType="text/html; charset=GBK" %>
      <%@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" %>
      <%@ 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" %>
      
      <table bgcolor="#666666" cellpadding="1" cellspacing="0" border="0" width="500">
      <tr>
      <td>
      <table cellpadding="0" cellspacing="0" border="0" width="500">
      <tr>
      <td bgcolor="#fecc51">&</td>
      </tr>
      </table>
      </td>
      </tr>
      <tr>
      <td>
      <table cellpadding="0" cellspacing="0" border="0" width="500">
      <tr>
      <td bgcolor="#d6e0ed">
      &&<bean:message key="label.list4certificate"/>
      </td>
      </tr>
      <tr bgcolor="#FFFFFF">
      <td width="5%"></td><td width="19%"></td><td width="76%"></td>
      </tr>
      <tr>
      <td>
      <table bgcolor="#f2f2f2" width="500" cellspacing="0" border="0">
      <tr bgcolor="#bacce1">
      <td><b><bean:message key="Certificate.select"/> </b></td>
      <td><b><bean:message key="Certificate.certificateID"/> </b></td>
      <td><b><bean:message key="Certificate.certificateCode"/></b></td>
      <td><b><bean:message key="Certificate.certificateName"/></b></td>
      <td><b><bean:message key="Certificate.view"/></b></td>
      </tr>
      
      <bean:write name="pager" property="description"/>
      <logic:equal name="pager" property="hasPrevious" value="true">
      <a href="/graduatedata/list.do?viewPage=<bean:write name="pager" property="previousPage"/>" class="a02">
      Previous
      </a>
      </logic:equal>
      <logic:equal name="pager" property="hasNext" value="true">
      <a href="/graduatedata/list.do?viewPage=<bean:write name="pager" property="nextPage"/>" class="a02">
      Next
      </a>
      </logic:equal>
      
      <logic:notEmpty name="list" scope="request">
      <logic:iterate id="certificate" name="list" type="com.xindeco.business.graduatedata.CertificateVO"scope="request">
      <tr bgcolor="#FFFFFF">
      <td><html:text property="name" value="<bean:write name="certificate" property="certificateID" scope="page"/>"/>
      </td>
      <td> <bean:write name="certificate" property="certificateID" scope="page"/></td>
      <td> <bean:write name="certificate" property="certificateCode" scope="page"/></td>
      <td> <bean:write name="certificate" property="certificateName" scope="page"/></td>
      <td> <bean:write name="certificate" property="photoURL" scope="page"/></td>
      </tr>
      </logic:iterate>
      </logic:notEmpty>
      </table>
      </td>
      </tr>
      </table>
      </td>
      </tr>
      </table>
      
      6、對應(yīng)的配置文件struts-config.xml。
      
      java代碼:
      
      代碼:
      --------------------------------------------------------------------------------
      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "  <struts-config>
      <form-beans>
      <form-bean name="certificateform" type="com.xindeco.presentation.graduatedata.Certificateform" />
      </form-beans>
      <global-forwards>
      <forward name="error" path="/error/error.jsp" />
      </global-forwards>
      <action-mappings>
      <action name="certificateform" parameter="LIST" path="/graduatedata/list" scope="request" type="com.xindeco.presentation.graduatedata.CertificateAction" validate="true">
      <forward name="success" path="/graduatedata/listcertificate.jsp" />
      </action>
      </action-mappings>
      ……
      </struts-config>
      
      7、最后當(dāng)然是最重要的分頁代碼了:Pager.java
      
      java代碼:
      
      代碼:
      --------------------------------------------------------------------------------
      package com.xindeco.common;
      
      import java.util.* ;
      public class Pager {
      private static int MAX_PAGE_INDEX = 10; //頁腳顯示多少頁
      private static String HEADER = "Result page";
      
      public static String generate(int offset, int length, int size, String url) {
      if (length > size) {
      String pref;
      if (url.indexOf("?") > -1) {
      pref = "&";
      } else {
      pref = "?";
      }
      String header = "<font face='Helvetica' size='-1'>"+HEADER+": ";
      if (offset > 0) {
      header += "&<a href=\""+url+pref+"pager.offset="+(offset-size)+"\">[<< Prev]</a>\n";
      }
      int start;
      int radius = MAX_PAGE_INDEX/2*size;
      if (offset < radius) {
      start = 0;
      } else if(offset < length-radius) {
      start = offset - radius;
      } else {
      start = (length/size-MAX_PAGE_INDEX)*size;
      }
      for(int i=start;i<length && i < start + MAX_PAGE_INDEX*size;i+=size) {
      if (i == offset) {
      header += "<b>"+(i/size+1)+"</b>\n";
      } else {
      header += "&<a href=\""+url+pref+"pager.offset="+i+"\">"+(i/size+1)+"</a>\n";
      }
      }
      if(offset < length - size) {
      header += "&<a href=\""+url+pref+"pager.offset="+((int)offset+(int)size)+"\">[Next >>]</a>\n";
      }
      header += "</font>";
      return header;
      } else {
      return "";
      }
      }
      }
      
      這部分代碼的實現(xiàn)相當(dāng)簡潔,但已經(jīng)足夠完成所需了。

    posted on 2006-05-03 20:04 feingto 閱讀(321) 評論(0)  編輯  收藏 所屬分類: Java Web

    主站蜘蛛池模板: 亚洲成av人片在线观看无码不卡| 免费又黄又爽的视频| 久久久亚洲精品无码| 三级黄色免费观看| 久久久久久久亚洲精品| 国产一级a毛一级a看免费人娇| 亚洲视频人成在线播放| 中国videos性高清免费| 国产l精品国产亚洲区在线观看| 久久永久免费人妻精品| 亚洲一区二区影院| 成人免费视频77777| 亚洲欧美日韩国产成人| 国产hs免费高清在线观看| 一级毛片免费在线观看网站| 亚洲人成伊人成综合网久久久| 久久不见久久见免费影院www日本| 亚洲国产精品无码一线岛国| 91热久久免费精品99| avtt天堂网手机版亚洲| 免费国产精品视频| 在线免费视频你懂的| 久久久久亚洲AV无码专区体验| 青青青国产在线观看免费网站| 亚洲老熟女五十路老熟女bbw| 亚洲精品麻豆av| 84pao强力永久免费高清| 亚洲午夜精品一区二区麻豆| mm1313亚洲精品无码又大又粗| 免费国产污网站在线观看| 亚洲婷婷综合色高清在线| 成年人免费视频观看| 国产精品亚洲va在线观看| 亚洲精品无码久久久久| 免费看污成人午夜网站| 亚洲AV无码专区在线观看成人| 亚洲综合区小说区激情区| 1000部拍拍拍18免费网站| 国产亚洲综合视频| 久久亚洲美女精品国产精品| 国产精品va无码免费麻豆|