亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

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

2019-11-18 12:55:00
字體:
來源:轉載
供稿:網友

  在網上看了幾個StrUCts分頁,感覺不是很完善,于是根據自己的經驗,寫了一個相對高效簡潔的分頁方法。由于本人水平有限,假如大家有什么更好的想法,歡迎不吝賜教。
  
  一、 開發環境
  
  我的開發環境是:JBuilder x + Weblogic 8.1 + Oracle 9i + Windows 2003 ,假如朋友們的開發環境不一樣亦無妨。
  
  二、開發思路
  
  既然講的是Struts,那自然離不了MVC,分頁顯示也是如此。
  
  1、 建立數據庫和對應的表,本例的表是TCertificate。
  
  2、 建立適當的模型組件,對應你要查詢數據庫中的表。這部分由DAO數據訪問層來實現,假如有的朋友對DAO不熟悉可以查詢一下相關資料。本例由CertificateDAO.java來實現。
  
  3 、建立分頁所需要的模型組件,由javaBean來充當,并與CertificateDAO實現分離。網上介紹的很多方法,都存在著數據與分頁組件藕合的現象,這也是本方法與其它分頁方法的主要不同之處。
  
  4、建立控制器組件,這部分由Struts 中的Action來實現。主要負責將實例化CertificateDAO,只取要顯示的數據記錄,存入ArrayList對象然后返回,并放到request中。而分頁部分則根據分頁條件,單獨進行構造,避免了與DAO混在一起的情況發生。網上其它介紹的一些分頁方法中,基本上都是一次性讀出所有查詢的數據,然后再由分頁相關組件進行構造。這樣,假如數據量大的話,很輕易形成瓶頸。在本例中由于不是一次性地讀出查詢的所有數據,而只是讀出一個頁面要顯示的數據記錄,這就節省了很多不必要的數據傳輸,提高了效率。本例中為CertificateAction.java。
  
  5、建立視圖組件,這部分由jsp來充當,為了不出現java 代碼,我們使用Struts提供的標簽庫,主要負責從request中取出剛剛放入的對象,通過反復調用CertificateAction以及action參數,而實現分頁顯示。本例中為listcertificate.jsp。
  
  6、 建立并配置struts-config.xml。
  
  三、實例代碼
  
  確定好上面的開發思路后,代碼的實現就有單可循了。
  
  1、建數據庫和相應的表。
  
  2、數據邏輯層的相關代碼。
  
  1)、通用的DAO類:CommonDAO.java
  
  這是一個很多DAO都要繼續到的通用DAO類,是我根據實踐總結出來的,為了減少篇幅,這里只顯示和本例相關的代碼。
  
  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;
  /**
  * 說明:取得當前查詢的總記錄數
  */
  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;
  }
  }
  }
  
  這個類主要是通過子類傳進來的先進結果集,取得查詢的記錄總數,并對數據庫連接進行簡單的治理。
  
  2)、對數據庫進行訪問: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();
  /*對游標進行處理,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)是查得所有要顯示的數據,并放入ArrayList中??催^網上有些例子,把數據記錄放入ArrayList的動作過程直接在while循環體里完成,假如字段多的話,會造成方法過于寵大,又不美觀。 這里,數據記錄放入ArrayList的動作過程由rs2VO方法完成,就比較整潔了。另外,if (rs != null && rs.next ()) 配合while ( (countRows++ < limit) && rs.next ()) 是為了程序的健壯性考慮的,稍分析一下不難得出結論。
  
  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;  //翻頁時的起始記錄所在游標
  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(); // 取得總記錄數
  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主要是把數據從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、對應的配置文件struts-config.xml。
  
  java代碼:
  
  代碼:
  --------------------------------------------------------------------------------
  <?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="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、最后當然是最重要的分頁代碼了: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 "";
  }
  }
  }
  
  這部分代碼的實現相當簡潔,但已經足夠完成所需了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美日韩精品丝袜高跟鞋| 国产精品第1页| 国产精品爽爽ⅴa在线观看| 成年无码av片在线| 日韩视频在线免费| 俺去了亚洲欧美日韩| 成人激情在线播放| 亚洲欧美资源在线| 久久久免费高清电视剧观看| 欧美日韩国产二区| 久久精品99无色码中文字幕| 国产a∨精品一区二区三区不卡| 精品高清美女精品国产区| 亚洲欧美一区二区三区久久| 欧美不卡视频一区发布| 国产在线一区二区三区| 精品亚洲va在线va天堂资源站| 国产一区二区久久精品| 欧美成人中文字幕| 久久国产精品久久久久久| 欧美老女人在线视频| 国产视频精品免费播放| 成人国产亚洲精品a区天堂华泰| 国产精品自产拍高潮在线观看| 日韩亚洲一区二区| 久久国产精品影片| 在线日韩av观看| 日韩va亚洲va欧洲va国产| 欧美日韩国产影院| 最近2019年中文视频免费在线观看| 欧美丝袜一区二区三区| 91精品啪aⅴ在线观看国产| 国产自产女人91一区在线观看| 亚洲乱码一区二区| 欧美在线国产精品| 深夜福利亚洲导航| 性欧美暴力猛交69hd| 国产一区私人高清影院| 国产精品久久久久久久电影| 久久久av电影| 国产综合久久久久| 97免费中文视频在线观看| 亚洲女同性videos| 精品久久久久久久久久久久| 欧美日韩国产区| 日韩免费av片在线观看| 国产精品视频色| 自拍视频国产精品| 欧美性感美女h网站在线观看免费| 日韩精品999| 国产精品国产亚洲伊人久久| 性欧美视频videos6一9| 成人信息集中地欧美| 久久久欧美精品| 国产精品久久av| 久久久久久午夜| 精品福利在线观看| 国内精品模特av私拍在线观看| 亚洲最大成人在线| 日本午夜人人精品| 亚洲国产欧美精品| 亚洲视频日韩精品| 亚洲精品99久久久久| 欧美成人黄色小视频| 亚洲韩国欧洲国产日产av| 92国产精品久久久久首页| 亚洲电影在线看| 国产91精品黑色丝袜高跟鞋| 国产91色在线播放| 久久国产精品影片| 欧美多人乱p欧美4p久久| 久久99国产精品久久久久久久久| www.久久久久久.com| 成人免费观看49www在线观看| 欧美电影免费观看大全| 国产成人avxxxxx在线看| 国产99久久精品一区二区 夜夜躁日日躁| 精品女同一区二区三区在线播放| 国产成人精品在线播放| 九九视频这里只有精品| 亚洲欧美精品伊人久久| 国产69精品久久久久9| 蜜臀久久99精品久久久久久宅男| 成人有码在线播放| 国内成人精品一区| 成人美女免费网站视频| 亚洲人成电影网| 亚洲欧洲免费视频| 欧美日韩激情小视频| 最近2019中文字幕一页二页| 欧美一级bbbbb性bbbb喷潮片| 国产伦精品免费视频| 欧美日韩在线视频一区二区| 久久精品2019中文字幕| 亚洲午夜性刺激影院| 日韩欧美在线视频免费观看| 中文字幕在线看视频国产欧美| 精品无人区太爽高潮在线播放| 亚洲成人激情在线| 91在线免费网站| 亚洲人成电影在线播放| 久久影视电视剧凤归四时歌| 亚洲色图色老头| 国产精品av在线播放| 欧美日韩色婷婷| 日韩av免费看网站| 欧美高清视频在线播放| 欧美视频二区36p| 欧美亚洲视频在线看网址| 亚洲免费电影一区| 久久精品国产久精国产一老狼| 最近中文字幕日韩精品| 欧美激情视频在线| 精品国产户外野外| 久青草国产97香蕉在线视频| 亚洲国产精品久久久久秋霞不卡| 成人午夜激情免费视频| 亚洲欧美在线x视频| 亚洲成人激情在线| 91社影院在线观看| 亚洲日韩第一页| 国模叶桐国产精品一区| 亚洲欧洲一区二区三区在线观看| 中文字幕成人在线| 亚洲影影院av| 日韩中文视频免费在线观看| 久久久免费精品| 日韩大胆人体377p| 亚洲黄色免费三级| 国产精品久久久久久久天堂| 欧美激情一级精品国产| 亚洲国产精品视频在线观看| 亚洲aaa激情| 精品国产视频在线| 国产精品9999| 国产欧美日韩中文字幕| 欧美丰满老妇厨房牲生活| 国产脚交av在线一区二区| 日本久久久久久| 成人精品久久av网站| 国产精品久久在线观看| 91在线无精精品一区二区| 亚洲人成电影网| 亚洲欧美中文日韩在线v日本| 深夜福利日韩在线看| 亚洲电影免费观看| 日韩一区二区三区在线播放| 欧美视频在线观看 亚洲欧| 国产精品com| 亚洲一区美女视频在线观看免费| 国产91网红主播在线观看| 欧美国产日韩xxxxx| 日本在线精品视频| 国产精品男人爽免费视频1| 91国产美女视频| 成人激情视频在线观看| 亚洲激情视频在线播放| www.欧美视频| 日韩在线观看网站| 日韩黄色高清视频| 亚洲欧美国产制服动漫| 91深夜福利视频| 日韩精品欧美国产精品忘忧草| 精品国产一区二区三区久久|