解决Struts分页显示 作者:李敏强 eMail: [email protected]
学习Struts已经有2个多月了,前几天群里的朋友问我Struts分页显示的问题,觉得好像与在jsp中的差不多,但还是遇到了这样那样的问题,好不容易花了几天时间把问题都搞清楚,觉得还是写点东西跟大家分享一下的好! 至于Struts的语法这里就不多介绍了,不懂的朋友可以先看网上的其他文章。
一 开发环境 Elicpse+Struts Studio+SqlServer2000+Tomcat。
二 开发思路 既然讲的是Struts,那自然离不了MVC,分页显示也是如此。
1 建立适当的模型组件,对应你要查询数据库中的表。这部分由我们熟悉的javaBean来充当。并在其中建立数据库查询方法,该方法需要一个java.sql.Conntection类型的参数,并返回一个ArrayList。在本例中为 Book.java
2 建立分页所需要的模型组件,也是由javaBean来充当,通过由Book中提供的ArrayList来构造。本例中为 PageBean.java.。
3建立控制器组件,这部分由Struts 中的Action来实现。主要负责将实例化Book,并利用返回的ArrayList对象,构造PageBean。以及接收由视图传递而来的action参数。从而在PageBean对象中调用不同的方法,该方法返回Book[] 对象。最后将 Book[]和PageBean放入request中。本例中为PageListAction.java。
4建立视图组件,这部分由jsp来充当,为了不出现java 代码,我们使用Struts提供的标签库,主要负责从request中取出刚刚放入的对象,通过反复调用PageListAction以及action参数,而实现分页显示。本例中为pagetest.jsp. 5 建立并配置struts-config.xml。 6 建立数据库。
三 实例代码 1 Book.java
package bean; import java.sql.*; import java.util.ArrayList; /** * @作者 李敏强 * Struts分页显示数据Bean,对应数据库中Book表 */ public class Book { private String bookname; //书名 private String author; //作者 private String price; //价格 public Book(String name,String author,String price){ this.bookname=name; this.author=author; this.price=price; }
public String getAuthor() { return author; }
public void setAuthor(String author) { this.author = author; }
public String getBookname() { return bookname; }
public void setBookname(String bookname) { this.bookname = bookname; } public String getPrice(){ return this.price; } public void setPrice(String price){ this.price=price; } public static ArrayList getAllBook(Connection connection){ String sql="select * from book"; ArrayList arrayList = new ArrayList(); try{ Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ResultSet resultSet = statement.executeQuery(sql); System.out.println("BookBean 数据查询已完成!"); while(resultSet.next()) { String name = resultSet.getString("name"); String author = resultSet.getString("author"); String price = resultSet.getString("price"); System.out.println("开始数据封装:name="+name+"author="+author+"price="+price); Book book = new Book(name,author,price); arrayList.add(book); } connection.close(); resultSet.close(); }catch(SQLException e) { System.out.println("数据库异常"+e.toString()); }
return arrayList; } }
2 PageBean.java package page; import bean.Book; import java.util.*; /** * @作者 李敏强 * Struts分页显示逻辑Bean */ public class PageBean {
int currentPage=1; //当前页 public int totalPages=0; //总页数 int pageRecorders=5;//每页5条数据 int totalRows=0; //总数据数 int pageStartRow=0;//每页的起始数 int pageEndRow=0; //每页显示数据的终止数 boolean hasNextPage=false; //是否有下一页 boolean hasPreviousPage=false; //是否有前一页 ArrayList arrayList; Iterator it; public PageBean(){} public PageBean(ArrayList arrayList){ this.arrayList=arrayList; totalRows=arrayList.size(); it=arrayList.iterator(); hasPreviousPage=false; currentPage=1; if((totalRows%pageRecorders)==0) { totalPages=totalRows/pageRecorders; } else { totalPages=totalRows/pageRecorders+1; } if(currentPage>=totalPages) { hasNextPage=false; } else { hasNextPage=true; }
if(totalRows<pageRecorders) { this.pageStartRow=0; this.pageEndRow=totalRows; } else { this.pageStartRow=0; this.pageEndRow=pageRecorders; }
}
/** * @return Returns the currentPage. */ public String getCurrentPage() { return this.toString(currentPage); } /** * @param currentPage The currentPage to set. */ public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } /** * @return Returns the pageRecorders. */ public int getPageRecorders() { return pageRecorders; } /** * @param pageRecorders The pageRecorders to set. */ public void setPageRecorders(int pageRecorders) { this.pageRecorders = pageRecorders; } /** * @return Returns the pageEndRow. */ public int getPageEndRow() { return pageEndRow; } /** * @return Returns the pageStartRow. */ public int getPageStartRow() { return pageStartRow; } /** * @return Returns the totalPages. */ public String getTotalPages() { return this.toString(totalPages); } /** * @return Returns the totalRows. */ public String getTotalRows() { return this.toString(totalRows); } /** * @return Returns the hasNextPage. */ public boolean isHasNextPage() { return hasNextPage; } /** * @param hasNextPage The hasNextPage to set. */ public void setHasNextPage(boolean hasNextPage) { this.hasNextPage = hasNextPage; } /** * @return Returns the hasPreviousPage. */ public boolean isHasPreviousPage() { return hasPreviousPage; } /** * @param hasPreviousPage The hasPreviousPage to set. */ public void setHasPreviousPage(boolean hasPreviousPage) { this.hasPreviousPage = hasPreviousPage; } public Book[] getNextPage(){ currentPage=currentPage+1; System.out.println("PageBean.getNextPage()正在执行;"); System.out.println("参数currentPage="+currentPage);
if((currentPage-1)>0) { hasPreviousPage=true; } else { hasPreviousPage=false; } if(currentPage>=totalPages) { hasNextPage=false; } else { hasNextPage=true; } System.out.println("参数hasNextPage="+hasNextPage); System.out.println("准备执行PageBean.getBooks()"); Book[] books=getBooks(); this.description(); return books; }
public Book[] getPreviouspage(){ currentPage=currentPage-1;
if(currentPage==0){currentPage=1;} if(currentPage>=totalPages) { hasNextPage=false; } else { hasNextPage=true; } if((currentPage-1)>0) { hasPreviousPage=true; } else { hasPreviousPage=false; } Book[] books=getBooks(); this.description(); return books; }
public Book[] getBooks(){ System.out.println("pageBean.getBooks()开始执行;"); if(currentPage*pageRecorders<totalRows){//判断是否为最后一页 pageEndRow=currentPage*pageRecorders; pageStartRow=pageEndRow-pageRecorders; } else{ pageEndRow=totalRows; pageStartRow=pageRecorders*(totalPages-1); } Book[] books=new Book[pageEndRow-pageStartRow+1]; System.out.println("pageStartRow="+pageStartRow); System.out.println("pageEndRow="+pageEndRow); int j=0; for(int i=pageStartRow;i<pageEndRow;i++) { Book book=(Book)arrayList.get(i); books[j++]=book; } System.out.println("要显示的页面数据已经封装,具体信息如下:"); this.description(); return books; }
public String toString(int temp) { String str=Integer.toString(temp); return str; }
public void description() {
String description="共有数据数:"+this.getTotalRows()+
"共有页数: "+this.getTotalPages() +
"当前页数为:"+this.getCurrentPage()+ " 是否有前一页: "+this.isHasPreviousPage() +
" 是否有下一页:"+this.isHasNextPage()+
" 开始行数:"+this.getPageStartRow()+
" 终止行数:"+this.getPageEndRow();
System.out.println(description);
} }
3 PageListAction.java package page; import org.apache.struts.action.*; import javax.servlet.http.*; import comm.Constants;
import bean.Book; import java.util.*; import javax.sql.DataSource; /** * @author 李敏强 * Struts分页显示Action */ public class PageListAction extends Action {
public PageListAction(){} ArrayList arrayList=new ArrayList(); PageBean pb; public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String action; action=request.getParameter("action"); if(action==null || action.equals("null")){ //第一次读取数据 try{ DataSource datasource=this.getDataSource(request,Constants.DATASOURCE_KEY); arrayList=Book.getAllBook(datasource.getConnection()); System.out.println("第一步,数据已经成功传递到Action,action="+action); }catch(Exception e){ e.printStackTrace(); System.out.println("数据库连接出现异常"); } pb=new PageBean(arrayList); Book[] books=pb.getBooks(); pb.description(); request.setAttribute("result",books); request.setAttribute("page",pb); } else { if(action=="nextPage" || action.equals("nextPage")) { System.out.println("参数action="+action); System.out.println("函数pb.getNextPage()准备执行"); Book[]books=pb.getNextPage(); request.setAttribute("page",pb); request.setAttribute("result",books); } if(action=="previousPage" || action.equals("previousPage")) { System.out.println("参数action="+action); System.out.println("函数pb.getPreviouspage()准备执行"); Book[] books=pb.getPreviouspage(); request.setAttribute("page",pb); request.setAttribute("result",books); } } return (mapping.findForward("success")); } }
4 pagetest.jsp <%@ 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=gb2312" language="java"%>
<html:html locale="true"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body>
<table border="1"> <tr><th>书名</th><th>作者</th><th>价格</th></tr> <logic:present name="result"> <logic:iterate id="book" name="result" type="bean.Book" > <logic:present name="book"> <tr> <td><bean:write name="book" property="bookname" /></td> <td> <bean:write name="book" property="author" /></td> <td><bean:write name="book" property="price" /></td> </tr> </logic:present> </logic:iterate> </logic:present> </table> <logic:equal name="page" property="hasNextPage" value="true"> <html:link page="/page.do?action=nextPage">nextPage</html:link> </logic:equal> <logic:equal name="page" property="hasPreviousPage" value="true"> <html:link page="/page.do?action=previousPage">PreviousPage</html:link> </logic:equal> 共有数据总数<bean:write name="page" property="totalRows"/>; 共分<bean:write name="page" property="totalPages"/>页,当前是第 <bean:write name="page" property="currentPage"/>页 </body> </html:html>
5 struts-config.xml <?xml version="1.0" encoding="ISO-8859-1" ?>
<!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> <data-sources> <data-source key="dataSource" type="org.apache.commons.dbcp.BasicDataSource"> <set-property property="driverClassName" value="com.microsoft.jdbc.sqlserver.SQLServerDriver"/> <set-property property="url" value="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=eBookStore;SelectMethod=cursor"/> <set-property property="username" value="limq"/> <set-property property="password" value="1"/> <set-property property="maxActive" value="10"/> <set-property property="maxWait" value="5000"/> <set-property property="defaultAutoCommit" value="true"/> <set-property property="defaultReadOnly" value="false"/> </data-source> </data-sources> <form-beans> </form-beans> <global-forwards> </global-forwards> <action-mappings> <action path="/page" type="page.PageListAction" scope="request"> <forward name="success" path="/pagetest.jsp"/> </action> </action-mappings> <controller> </controller> </struts-config>
6 建立eBookStore数据库,以及表book(name,author,parce);其中数据的配置可以根据你的不同情况在struts-config.xml中而定。
7 Constants.java
package comm;
/** * this interface provides the constant string for applicator constant */ public class Constants { /** * name of the User Object in HttpSession */ public static String USER_KEY="user"; /** * dataSource name */ public static String DATASOURCE_KEY="dataSource"; }
好了,全部代码我已经贴完了,难免有不妥的地方,如果您有好的意见或者建议请跟我联系,在下将感激不尽!! [email protected] |