专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » struts分页:一个高效简洁的Struts分页思路方法 »正文

struts分页:一个高效简洁的Struts分页思路方法

来源: 发布时间:星期四, 2009年1月15日 浏览:98次 评论:0
  在网上看了几个Structs分页感觉不是很完善于是根据自己经验写了个相对高效简洁分页思路方法由于本人水平有限如果大家有什么更好想法欢迎不吝赐教

  、 开发环境

  我开发环境是:JBuilder x + Weblogic 8.1 + Oracle 9i + Windows 2003 如果朋友们开发环境不样亦无妨

   2、开发思路

  既然讲是Struts那自然离不了MVC分页显示也是如此

  1、 建立数据库和对应本例表是TCerticate

  2、 建立适当模型组件对应你要查询数据库中这部分由DAO数据访问层来实现如果有朋友对DAO不熟悉可以查询下相关资料本例由CerticateDAO.java来实现

  3 、建立分页所需要模型组件由javaBean来充当并和CerticateDAO实现分离网上介绍很多思路方法都存在着数据和分页组件藕合现象这也是本思路方法和其它分页思路方法主要区别的处

  4、建立控制器组件这部分由Struts 中Action来实现主要负责将例子化CerticateDAO只取要显示数据记录存入ArrayList对象然后返回并放到request中而分页部分则根据分页条件单独进行构造避免了和DAO混在情况发生网上其它介绍些分页思路方法中基本上都是次性读出所有查询数据然后再由分页相关组件进行构造这样如果数据量大很容易形成瓶颈在本例中由于不是次性地读出查询所有数据而只是读出个页面要显示数据记录这就节省了很多不必要数据传输提高了效率本例中为CerticateAction.java

  5、建立视图组件这部分由jsp来充当为了不出现java 代码我们使用Struts提供标签库主要负责从request中取出刚刚放入对象通过反复CerticateAction以及action参数而实现分页显示本例中为listcerticate.jsp

  6、 建立并配置struts-config.xml

   3、例子代码

  确定好上面开发思路后代码实现就有单可循了

  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 DAO
  {
  protected DataSource ds;
  /**
  * 介绍说明:取得当前查询总记录数
  */
  public getRows
  {
   this.count;
  }
  public void rsHandler (ResultSet rs, off, limit)
  {
  try
  {
  count = 0;
  rs.absolute ( -1) ;
  count = rs.getRow ;
   (off <= 0)
  {
  rs.beforeFirst ;
  }
  
  {
  rs.absolute (off) ;
  }
  }
  catch (Exception e)
  {
  e.prStackTrace ;
  }
  }
  public DAO(DataSource ds) {
  this.ds = ds;
  }
  
  public void DataSource(DataSource ds) {
  this.ds = ds;
  }
  
  protected void close(ResultSet rs) {
   (rs != null) {
  try {
  rs.close;
  } catch (SQLException e) {
  }
  rs = null;
  }
  }
  
  protected void close(PreparedStatement pstmt) {
   (pstmt != null) {
  try {
  pstmt.close;
  } catch (SQLException e) {
  }
  pstmt = null;
  }
  }
  protected void close(Connection conn) {
   (conn != null) {
  try {
  conn.close;
  } catch (SQLException e) {
  e.prStackTrace;
  }
  conn = null;
  }
  }
  
  protected void rollback(Connection conn) {
   (conn != null) {
  try {
  conn.rollback;
  } catch (SQLException e) {
  e.prStackTrace;
  }
  conn = null;
  }
  }
  }


  这个类主要是通过子类传进来先进结果集取得查询记录总数并对数据库连接进行简单管理

  2)、对数据库进行访问:CerticateDAO.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 CerticateDAO extends DAO
  {
  
  public NationDAO(DataSource ds) {
  super(ds);
  }
  
  public List findCerticateList( off, limit) throws SQLException
  {
   countRows = 0 ;
  ArrayList list = null ;
  Connection conn = null;
  PreparedStatement pstmt = null;
  ResultSet rs = null;
  try
  {
  conn = ds.getConnection;
  String sql =
  "SELECT certicateID, certicateCode,certicateName,photoURL,"
  + "description,graduateID FROM TCerticate " ;
  pstmt = conn.prepareStatement(sql);
  rs = pstmt.executeQuery;
  /*对游标进行处理rsHandler 思路方法在父类DAO中*/
  this.rsHandler(rs,off,limit);
   (rs != null && rs.next )
  {
  list = 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.prStackTrace;
  }
  finally {
  close(conn);
  }
   list ;
  }
  
  private CerticateVO rs2VO (ResultSet rs)
  {
  try
  {
  CerticateVO certicateVO = CerticateVO ;
  certicateVO.CerticateID (rs.getInt ("certicateID")) ;
  certicateVO.CerticateCode (rs.getString ("certicateCode")) ;
  certicateVO.CerticateName (rs.getString ("certicateName")) ;
  certicateVO.PhotoURL (rs.getString ("photoURL")) ;
  certicateVO.Description (rs.getString ("description")) ;
  certicateVO.GraduateID (rs.getInt ("graduateID")) ;
   certicateVO ;
  }
  catch (Exception ex)
  {
  ex.prStackTrace ;
   null ;
  }
  }
  }


  findCerticateList( off, limit)是查得所有要显示数据并放入ArrayList中看过网上有些例子把数据记录放入ArrayList动作过程直接在while循环体里完成如果字段多会造成思路方法过于宠大又不美观 这里数据记录放入ArrayList动作过程由rs2VO思路方法完成就比较整洁了另外 (rs != null && rs.next ) 配合while ( (countRows < limit) && rs.next ) 是为了健壮性考虑稍分析下不难得出结论

  3、建立控制器组件:CerticateAction.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.CerticateDAO ;
  
  public CerticateAction
  extends Action
  {
  private final PAGE_LENGTH = 5 ; //每页显示5条记录
  public ActionForward execute (ActionMapping mapping, Actionform form,
  HttpServletRequest request,
  HttpServletResponse response)
  {
  ActionForward myforward = null ;
  String myaction = mapping.getParameter ;
  
   (isCancelled (request))
  {
   mapping.findForward ("failure") ;
  }
   ("".equalsIgnoreCase (myaction))
  {
  myforward = mapping.findForward ("failure") ;
  }
       ("LIST".equalsIgnoreCase (myaction))
  {
  myforward = performList (mapping, form, request, response) ;
  }
  
  {
  myforward = mapping.findForward ("failure") ;
  }
   myforward ;
  }
  
  private ActionForward performList (ActionMapping mapping,
  Actionform actionform,
  HttpServletRequest request,
  HttpServletResponse response)
  {
  try
  {
  DataSource ds = (DataSource) servlet.getServletContext.getAttribute(Action.DATA_SOURCE_KEY);
  
  CerticateDAO  certicateDAO = CerticateDAO (ds) ;
  
   off = 0;  //翻页时起始记录所在游标
   length = PAGE_LENGTH;
  String pageOff = request.getParameter("pager.off");
   (pageOff null || pageOff.equals("")) {
  off = 0;
  } {
  off = Integer.parseInt(pageOff);
  }
  List certicateList = certicateDAO .findCerticateList (off,length) ;
   size = certicateDAO.getRows; // 取得总记录数
  String url = request.getContextPath+"/"+mapping.getPath+".do";
  String pagerHeader = Pager.generate(off, size, length, url); //分页处理
  
  request.Attribute ("pager", pagerHeader) ;
  request.Attribute ("list", certicateList) ;
  }
  catch (Exception e)
  {
  e.prStackTrace;
   mapping.findForward ("error") ;
  }
   mapping.findForward ("success") ;
  }
  }


  CerticateAction.java主要是把数据从DAO中取出并放入个ArrayList 中然后通过配置文件再软件SoftwareViewJSP页

  5、建立视图listcerticate.jsp文件

  jsp代码:

  代码: 

<%@ page contentType="text/html; char=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.list4certicate"/>
  </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="Certicate.select"/> </b></td>
  <td><b><bean:message key="Certicate.certicateID"/> </b></td>
  <td><b><bean:message key="Certicate.certicateCode"/></b></td>
  <td><b><bean:message key="Certicate.certicateName"/></b></td>
  <td><b><bean:message key="Certicate.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"/>" ="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"/>" ="a02">
  Next
  </a>
  </logic:equal>
  
  <logic:notEmpty name="list" scope="request">
  <logic:iterate id="certicate" name="list" type="com.xindeco.business.graduatedata.CerticateVO"scope="request">
  <tr bgcolor="#FFFFFF">
  <td><html:text property="name" value="<bean:write name="certicate" property="certicateID" scope="page"/>"/>
  </td>
  <td> <bean:write name="certicate" property="certicateID" scope="page"/></td>
  <td> <bean:write name="certicate" property="certicateCode" scope="page"/></td>
  <td> <bean:write name="certicate" property="certicateName" scope="page"/></td>
  <td> <bean:write name="certicate" 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="certicateform" type="com.xindeco.presentation.graduatedata.Certicateform" />
  </form-beans>
  <global-forwards>
  <forward name="error" path="/error/error.jsp" />
  </global-forwards>
  <action-mappings>
  <action name="certicateform" parameter="LIST" path="/graduatedata/list" scope="request" type="com.xindeco.presentation.graduatedata.CerticateAction" validate="true">
  <forward name="success" path="/graduatedata/listcerticate.jsp" />
  </action>
  </action-mappings>
  ……
  </struts-config>


  7、最后当然是最重要分页代码了:Pager.java

  java代码:

  代码:

package com.xindeco.common;
  
  import java.util.* ;
  public Pager {
  private MAX_PAGE_INDEX = 10; //页脚显示多少页
  private String HEADER = "Result page";
  
  public String generate( off, length, size, String url) {
   (length > size) {
  String pref;
   (url.indexOf("?") > -1) {
  pref = "&";
  } {
  pref = "?";
  }
  String header = "<font face='Helvetica' size='-1'>"+HEADER+": ";
   (off > 0) {
  header "&<a href=""+url+pref+"pager.off="+(off-size)+"">[<< Prev]</a>n";
  }
   start;
   radius = MAX_PAGE_INDEX/2*size;
   (off < radius) {
  start = 0;
  } (off < length-radius) {
  start = off - radius;
  } {
  start = (length/size-MAX_PAGE_INDEX)*size;
  }
  for( i=start;i<length && i < start + MAX_PAGE_INDEX*size;isize) {
   (i off) {
  header "<b>"+(i/size+1)+"</b>n";
  } {
  header "&<a href=""+url+pref+"pager.off="+i+"">"+(i/size+1)+"</a>n";
  }
  }
  (off < length - size) {
  header "&<a href=""+url+pref+"pager.off="+(()off+()size)+"">[Next >>]</a>n";
  }
  header "</font>";
   header;
  } {
   "";
  }
  }
  }




  这部分代码实现相当简洁但已经足够完成所需了



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: