Struts分页方法.docx
- 文档编号:7962980
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:41
- 大小:32.32KB
Struts分页方法.docx
《Struts分页方法.docx》由会员分享,可在线阅读,更多相关《Struts分页方法.docx(41页珍藏版)》请在冰豆网上搜索。
Struts分页方法
2006年04月30日
一个高效简洁的Struts分页方法
一、开发环境
我的开发环境是:
JBuilderx+Weblogic8.1+Oracle9i+Windows2003,如果朋友们的开发环境不一样亦无妨。
二、开发思路
既然讲的是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代码:
代码:
--------------------------------------------------------------------------------
packagecom.xindeco.business;
importjava.io.*;
importjava.sql.*;
importjava.util.*;
importjavax.sql.*;
importjava.lang.IllegalAccessException;
importjava.lang.reflect.InvocationTargetException;
importmons.beanutils.BeanUtils;
publicclassDAO
{
protectedDataSourceds;
/**
*说明:
取得当前查询的总记录数
*/
publicintgetRows()
{
returnthis.count;
}
publicvoidrsHandler(ResultSetrs,intoffset,intlimit)
{
try
{
count=0;
rs.absolute(-1);
count=rs.getRow();
if(offset<=0)
{
rs.beforeFirst();
}
else
{
rs.absolute(offset);
}
}
catch(Exceptione)
{
e.printStackTrace();
}
}
publicDAO(DataSourceds){
this.ds=ds;
}
publicvoidsetDataSource(DataSourceds){
this.ds=ds;
}
protectedvoidclose(ResultSetrs){
if(rs!
=null){
try{
rs.close();
}catch(SQLExceptione){
}
rs=null;
}
}
protectedvoidclose(PreparedStatementpstmt){
if(pstmt!
=null){
try{
pstmt.close();
}catch(SQLExceptione){
}
pstmt=null;
}
}
protectedvoidclose(Connectionconn){
if(conn!
=null){
try{
conn.close();
}catch(SQLExceptione){
e.printStackTrace();
}
conn=null;
}
}
protectedvoidrollback(Connectionconn){
if(conn!
=null){
try{
conn.rollback();
}catch(SQLExceptione){
e.printStackTrace();
}
conn=null;
}
}
}
这个类主要是通过子类传进来的先进结果集,取得查询的记录总数,并对数据库连接进行简单的管理。
2)、对数据库进行访问:
CertificateDAO.java
java代码:
代码:
--------------------------------------------------------------------------------
packagecom.xindeco.business;
importjava.io.*;
importjava.sql.*;
importjava.util.*;
importjavax.sql.*;
importmon.dbconn.DbConn;
publicclassCertificateDAOextendsDAO
{
publicNationDAO(DataSourceds){
super(ds);
}
publicListfindCertificateList(intoffset,intlimit)throwsSQLException
{
intcountRows=0;
ArrayListlist=null;
Connectionconn=null;
PreparedStatementpstmt=null;
ResultSetrs=null;
try
{
conn=ds.getConnection();
Stringsql=
"SELECTcertificateID,certificateCode,certificateName,photoURL,"
+"description,graduateIDFROMTCertificate";
pstmt=conn.prepareStatement(sql);
rs=pstmt.executeQuery();
/*对游标进行处理,rsHandler方法在父类DAO中*/
this.rsHandler(rs,offset,limit);
if(rs!
=null&&rs.next())
{
list=newArrayList();
do
{
countRows++;
list.add(rs2VO(rs));
}
while((countRows++ } close(rs); close(pstmt); }catch(SQLExceptione){ close(rs); close(pstmt); rollback(conn); e.printStackTrace(); } finally{ close(conn); } returnlist; } privateCertificateVOrs2VO(ResultSetrs) { try { CertificateVOcertificateVO=newCertificateVO(); 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")); returncertificateVO; } catch(Exceptionex) { ex.printStackTrace(); returnnull; } } } findCertificateList(intoffset,intlimit)是查得所有要显示的数据,并放入ArrayList中。 看过网上有些例子,把数据记录放入ArrayList的动作过程直接在while循环体里完成,如果字段多的话,会造成方法过于宠大,又不美观。 这里,数据记录放入ArrayList的动作过程由rs2VO方法完成,就比较整洁了。 另外,if(rs! =null&&rs.next())配合while((countRows++ 3、建立控制器组件: CertificateAction.java java代码: 代码: -------------------------------------------------------------------------------- packagecom.xindeco.presentation; importjavax.sql.*; importjava.util.*; importjavax.servlet.http.*; importjavax.servlet.*; importorg.apache.struts.action.*; importorg.apache.struts.util.*; importmon.Pager; importcom.xindeco.business.graduatedata.CertificateDAO; publicclassCertificateAction extendsAction { privatestaticfinalintPAGE_LENGTH=5;//每页显示5条记录 publicActionForwardexecute(ActionMappingmapping,Actionformform, HttpServletRequestrequest, HttpServletResponseresponse) { ActionForwardmyforward=null; Stringmyaction=mapping.getParameter(); if(isCancelled(request)) { returnmapping.findForward("failure"); } if("".equalsIgnoreCase(myaction)) { myforward=mapping.findForward("failure"); } elseif ("LIST".equalsIgnoreCase(myaction)) { myforward=performList(mapping,form,request,response); } else { myforward=mapping.findForward("failure"); } returnmyforward; } privateActionForwardperformList(ActionMappingmapping, Actionformactionform, HttpServletRequestrequest, HttpServletResponseresponse) { try { DataSourceds=(DataSource)servlet.getServletContext().getAttribute(Action.DATA_SOURCE_KEY); CertificateDAO certificateDAO =newCertificateDAO (ds); intoffset=0; //翻页时的起始记录所在游标 intlength=PAGE_LENGTH; StringpageOffset=request.getParameter("pager.offset"); if(pageOffset==null||pageOffset.equals("")){ offset=0; }else{ offset=Integer.parseInt(pageOffset); } ListcertificateList=certificateDAO.findCertificateList(offset,length); intsize=certificateDAO.getRows();// 取得总记录数 Stringurl=request.getContextPath()+"/"+mapping.getPath()+".do"; StringpagerHeader=Pager.generate(offset,size,length,url);//分页处理 request.setAttribute("pager",pagerHeader); request.setAttribute("list",certificateList); } catch(Exceptione) { e.printStackTrace(); returnmapping.findForward("error"); } returnmapping.findForward("success"); } } CertificateAction.java主要是把数据从DAO中取出,并放入一个ArrayList中,然后通过配置文件再软件View的JSP页。 5、建立视图listcertificate.jsp文件。 jsp代码: 代码: -------------------------------------------------------------------------------- <%@pagecontentType="text/html;charset=GBK"%> <%@tagliburi="/WEB-INF/struts-template.tld"prefix="template"%> <%@tagliburi="/WEB-INF/struts-html.tld"prefix="html"%> <%@tagliburi="/WEB-INF/struts-bean.tld"prefix="bean"%> <%@tagliburi="/WEB-INF/struts-logic.tld"prefix="logic"%> && messagekey="label.list4certificate"/>
messagekey="Certificate.select"/>
messagekey="Certificate.certificateID"/>
messagekey="Certificate.certificateCode"/>
messagekey="Certificate.certificateName"/>
messagekey="Certificate.view"/>
writename="pager"property="description"/> equalname="pager"property="hasPrevious"value="true"> viewPage= writename="pager"property="previousPage"/>"class="a02"> Previous equal> equalname="pager"property="hasNext"value="true"> viewPage= writename="pager"property="nextPage"/>"class="a02"> Next equal> notEmptyname="list"scope="request"> iterateid="certificate"name="list"type="com.xindeco.business.graduatedata.CertificateVO"scope="request"> textproperty="name"value=" writename="certificate"property="certificateID"scope="page"/>"/> writename="certificate"property="certificateID"scope="page"/> writename="certificate"property="certificateCode"scope="page"/>
writename="certificate"property="certificateName"scope="page
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Struts 分页 方法
copyright@ 2008-2022 冰点文档网站版权所有
经营许可证编号:鄂ICP备2022015515号-1