解决struts分页显示
作者:李敏强 email: mill_lmq@tom.com
学习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";
}
好了,全部代码我已经贴完了,难免有不妥的地方,如果您有好的意见或者建议请跟我联系,在下将感激不尽!! mill_lmq@tom.com
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器