也可以返回hashtable,只不过此时hashtable中存放的是vector!也就是说,把每条纪录线放入一个vector中,在放入hashtable。
或者你也可把一条纪录放进一个hashtable,在吧hashtable放入已vector,也就是你的想法!

解决方案 »

  1.   

    是的,基于把一条纪录放进一个hashtable,在吧hashtable放入已vector的想法,我做了一下改动,可为何返回的vector的大小为0啊,应该是有记录的呀。返回的记录总数pagecount=17。页的总数为2。那么vector的大小应该是每页显示的记录数大小啊。帮帮挑挑错》》改动的bean 如下:
    package fawBean;
    import java.util.*;
    import java.io.*;
    import java.sql.*;
    import fawBean.*;public class PagesBean
    {
     int intPage; //当前页码
     int intPageSize; //每页记录数
     int intRowCount; //总记录数
     int intPageCount ; //总页码数
     String tablename; //数据表名
     String sqlstr; //sql语句的检索条件
     String sqlparam; //选取参数
     int paramcount;//字段的个数 //取的记录集,返回为hashtable
     public Vector getData()
     {
     Vector returndata=new Vector();
     Hashtable returnrow = new Hashtable();
     Connection conn = null;
     try
     {
     String selectsql;
     Linkdb db=new Linkdb();
    // conn = LocalPool.getConnection(); //连接数据库
     int RowCount = rowcount();
     selectsql = selectstr();
     intPageCount = (RowCount + intPageSize - 1) / intPageSize; //总页码数
     //PreparedStatement pstmt = conn.prepareStatement(selectsql);
     ResultSet rs = db.executeQuery(selectsql);
     if (intPage > RowCount)
     intPage = intPageCount; //输入页码数大于总页码数的处理 if (intPageCount > 0)
     {
     int startrow = (intPage - 1) * intPageSize + 1; //开始显示记录数
     for (int i = 0; i < startrow; i++)
     {
     rs.next();
     } //将记录指针定位到待显示页的第一条记录上 //判断字段数据类型
     //date型 返回 93
     //int型 返回 2
     //String型 返回 12
       //ResultSetMetaData columnType = rs.getMetaData();
       //int t = 0;
       //System.out.println("type=" + columnType.getColumnType(1));
       //if (columnType.getColumnType(1) == 12)
       //{ //输出数据
     int i = 0;  while (i < intPageSize && !rs.isAfterLast())
     {
     for(int j=0;j<paramcount;j++)
     {
     //String ResultSet = rs.getString(1); //获取数据写入hashtable
     returnrow.put(new Integer(j),rs.getString(j));
      }
     rs.next();
     i++; returndata.add(returnrow);
    }
     } }
     catch (SQLException ex)
     {
     System.out.print("错误=");
     ex.printStackTrace(System.out);
     }
     return returndata;
     }//返回总页码数:
    public int getPageCount()
    {
    return intPageCount;
    }
    //返回总行数:
    public int getRowCount()
    {return intRowCount;
    }
    //返回记录总数:public int rowcount()
    {
    Connection conn = null;
    Linkdb db=new Linkdb();
    try
    {
    String countsql; //sql语句计算记录总数
    if (sqlstr == null)
    {
    countsql = new String("select count(*) " + " from " + tablename);
    } else
    {
    countsql =
    new String("select count(*) " + " from " + tablename + "  where  " + sqlstr);
    }
    //conn = LocalPool.getConnection(); //连接数据库
    //PreparedStatement pstmt = conn.prepareStatement(countsql);
    ResultSet rs = db.executeQuery(countsql);
    rs.next();
    intRowCount = rs.getInt(1); //总记录数
    rs.close();
    //pstmt.close();
    //conn = null;} catch (Exception ex)
    {
    System.out.println("错误!");}
    return intRowCount;
    }//返回查询的sql 语句:public String selectstr()
    {
    String sql;
    if (sqlstr == null)
    {
    sql = new String("select " + sqlparam + " from " + tablename);
    } else
    {
    sql =
    new String(
    "select  " + sqlparam + "  from " + tablename + "  where  " + sqlstr);
    }
    return sql;
    }
    //字段个数的设置:
    public void setParamCount(String count)
    {
    this.paramcount=Integer.parseInt(count);
    }
    public int getParamCount()
    {
    return paramcount;
    }//当前页码的取得:public void setPage(String page)
    {
    if (page.trim().length() == 0)//检查输入参数是否为空
    {
    this.intPage = 1;
    } else if (page.trim().length() != 0)
    {
    this.intPage = Integer.parseInt(page);
    }
    if (this.intPage < 1)
    this.intPage = 1;}
    /**
     * 此处插入方法说明。
     * 设定每页显示记录数目(默认为每页显示10条记录)
     * 创建日期:(2001-7-23 10:19:06)
     * @param pagenumber int
     */
    public void setPageSize(String size)
    {
    if (size.trim().length() == 0)//检查输入参数是否为空
    {
    this.intPageSize = 10;
    } else if (size.trim().length() != 0)
    {
    this.intPageSize = Integer.parseInt(size);
    }
    if (this.intPageSize < 1)
    this.intPageSize = 10;}//检索返回字段:
    public void setSqlParam(String param)
    {
    if (param.trim().length() != 0)//检查输入参数是否为空
    {
    this.sqlparam = param.trim();
    }}
    /**
     * 此处插入方法说明。
     * 取得sql语句的检索条件
     * 创建日期:(2001-7-23 10:00:30)
     * @param sqlstr java.lang.String
     */
    public void setSqlstr(String str)
    {
    if (str.trim().length() != 0) //检查输入参数是否为空
    {
    this.sqlstr = str.trim();
    } else
    this.sqlstr = new String(" ");
    }
    /**
     * 此处插入方法说明。
     * 设定检索数据表。
     * 创建日期:(2001-7-24 10:41:51)
     * @param tablename java.lang.String
     */
    public void setTable(String table)
    {if (table.trim().length() != 0) //检查输入参数是否为空
    {
    this.tablename = table.trim();
    }
    }
    }
    前端调用如下:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <%@ page contentType="text/html;charset=GB2312" import="java.util.*,fawBean.PagesBean"%>
    <html>
    <head>
    <title>pages bean</title>
    </head><body><% PagesBean pb = new PagesBean();
    pb.setPageSize("10");
    pb.setTable("speedfaw.fawonline_ticket_train");
    pb.setSqlParam("sfz,zdz");
    pb.setPage("1");
    pb.setParamCount("2");
    String teststring=pb.selectstr();
    out.println(teststring);Vector myvector=pb.getData();
    out.println(myvector.size());
    int rowcount=pb.getRowCount();
    out.println(rowcount);
    int pagecount=pb.getPageCount();
    out.println(pagecount); 
     %>
    </body>
    </html>返回的三个数为0,17,2
      

  2.   

    是的,基于把一条纪录放进一个hashtable,在吧hashtable放入已vector的想法,我做了一下改动,可为何返回的vector的大小为0啊,应该是有记录的呀。返回的记录总数pagecount=17。页的总数为2。那么vector的大小应该是每页显示的记录数大小啊。帮帮挑挑错》》改动的bean 如下:
    package fawBean;
    import java.util.*;
    import java.io.*;
    import java.sql.*;
    import fawBean.*;public class PagesBean
    {
     int intPage; //当前页码
     int intPageSize; //每页记录数
     int intRowCount; //总记录数
     int intPageCount ; //总页码数
     String tablename; //数据表名
     String sqlstr; //sql语句的检索条件
     String sqlparam; //选取参数
     int paramcount;//字段的个数 //取的记录集,返回为hashtable
     public Vector getData()
     {
     Vector returndata=new Vector();
     Hashtable returnrow = new Hashtable();
     Connection conn = null;
     try
     {
     String selectsql;
     Linkdb db=new Linkdb();
    // conn = LocalPool.getConnection(); //连接数据库
     int RowCount = rowcount();
     selectsql = selectstr();
     intPageCount = (RowCount + intPageSize - 1) / intPageSize; //总页码数
     //PreparedStatement pstmt = conn.prepareStatement(selectsql);
     ResultSet rs = db.executeQuery(selectsql);
     if (intPage > RowCount)
     intPage = intPageCount; //输入页码数大于总页码数的处理 if (intPageCount > 0)
     {
     int startrow = (intPage - 1) * intPageSize + 1; //开始显示记录数
     for (int i = 0; i < startrow; i++)
     {
     rs.next();
     } //将记录指针定位到待显示页的第一条记录上 //判断字段数据类型
     //date型 返回 93
     //int型 返回 2
     //String型 返回 12
       //ResultSetMetaData columnType = rs.getMetaData();
       //int t = 0;
       //System.out.println("type=" + columnType.getColumnType(1));
       //if (columnType.getColumnType(1) == 12)
       //{ //输出数据
     int i = 0;  while (i < intPageSize && !rs.isAfterLast())
     {
     for(int j=0;j<paramcount;j++)
     {
     //String ResultSet = rs.getString(1); //获取数据写入hashtable
     returnrow.put(new Integer(j),rs.getString(j));
      }
     rs.next();
     i++; returndata.add(returnrow);
    }
     } }
     catch (SQLException ex)
     {
     System.out.print("错误=");
     ex.printStackTrace(System.out);
     }
     return returndata;
     }//返回总页码数:
    public int getPageCount()
    {
    return intPageCount;
    }
    //返回总行数:
    public int getRowCount()
    {return intRowCount;
    }
    //返回记录总数:public int rowcount()
    {
    Connection conn = null;
    Linkdb db=new Linkdb();
    try
    {
    String countsql; //sql语句计算记录总数
    if (sqlstr == null)
    {
    countsql = new String("select count(*) " + " from " + tablename);
    } else
    {
    countsql =
    new String("select count(*) " + " from " + tablename + "  where  " + sqlstr);
    }
    //conn = LocalPool.getConnection(); //连接数据库
    //PreparedStatement pstmt = conn.prepareStatement(countsql);
    ResultSet rs = db.executeQuery(countsql);
    rs.next();
    intRowCount = rs.getInt(1); //总记录数
    rs.close();
    //pstmt.close();
    //conn = null;} catch (Exception ex)
    {
    System.out.println("错误!");}
    return intRowCount;
    }//返回查询的sql 语句:public String selectstr()
    {
    String sql;
    if (sqlstr == null)
    {
    sql = new String("select " + sqlparam + " from " + tablename);
    } else
    {
    sql =
    new String(
    "select  " + sqlparam + "  from " + tablename + "  where  " + sqlstr);
    }
    return sql;
    }
    //字段个数的设置:
    public void setParamCount(String count)
    {
    this.paramcount=Integer.parseInt(count);
    }
    public int getParamCount()
    {
    return paramcount;
    }//当前页码的取得:public void setPage(String page)
    {
    if (page.trim().length() == 0)//检查输入参数是否为空
    {
    this.intPage = 1;
    } else if (page.trim().length() != 0)
    {
    this.intPage = Integer.parseInt(page);
    }
    if (this.intPage < 1)
    this.intPage = 1;}
    /**
     * 此处插入方法说明。
     * 设定每页显示记录数目(默认为每页显示10条记录)
     * 创建日期:(2001-7-23 10:19:06)
     * @param pagenumber int
     */
    public void setPageSize(String size)
    {
    if (size.trim().length() == 0)//检查输入参数是否为空
    {
    this.intPageSize = 10;
    } else if (size.trim().length() != 0)
    {
    this.intPageSize = Integer.parseInt(size);
    }
    if (this.intPageSize < 1)
    this.intPageSize = 10;}//检索返回字段:
    public void setSqlParam(String param)
    {
    if (param.trim().length() != 0)//检查输入参数是否为空
    {
    this.sqlparam = param.trim();
    }}
    /**
     * 此处插入方法说明。
     * 取得sql语句的检索条件
     * 创建日期:(2001-7-23 10:00:30)
     * @param sqlstr java.lang.String
     */
    public void setSqlstr(String str)
    {
    if (str.trim().length() != 0) //检查输入参数是否为空
    {
    this.sqlstr = str.trim();
    } else
    this.sqlstr = new String(" ");
    }
    /**
     * 此处插入方法说明。
     * 设定检索数据表。
     * 创建日期:(2001-7-24 10:41:51)
     * @param tablename java.lang.String
     */
    public void setTable(String table)
    {if (table.trim().length() != 0) //检查输入参数是否为空
    {
    this.tablename = table.trim();
    }
    }
    }
    前端调用如下:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <%@ page contentType="text/html;charset=GB2312" import="java.util.*,fawBean.PagesBean"%>
    <html>
    <head>
    <title>pages bean</title>
    </head><body><% PagesBean pb = new PagesBean();
    pb.setPageSize("10");
    pb.setTable("speedfaw.fawonline_ticket_train");
    pb.setSqlParam("sfz,zdz");
    pb.setPage("1");
    pb.setParamCount("2");
    String teststring=pb.selectstr();
    out.println(teststring);Vector myvector=pb.getData();
    out.println(myvector.size());
    int rowcount=pb.getRowCount();
    out.println(rowcount);
    int pagecount=pb.getPageCount();
    out.println(pagecount); 
     %>
    </body>
    </html>返回的三个数为0,17,2
      

  3.   

    你试着把hasttable的声明放到while循环中,或者在while循环开始部分clear 
    hashtable的数据(可能是clear把),否则,vector中只有一个hashtable!
      

  4.   

    不对,我想错了,hashtable虽然结果不对,vector还是应该有值的!
    你在bean中打印一下hasttable和vector的size,看到迪有没得到值!
      

  5.   

    你刚才说的我试了,还是不行。哥哥,在bean里怎么打呀,还得做main函数??我要是能在bean 打,我就不在jsp页中做测试了呀。
      

  6.   

    System.out.print("returnDate size is " + returnDate.size());
    回在后台打出信息!
    你用的web服务器是什么?weblogic?tomcat?jrun?
      

  7.   

    服务器控制台。sigh关注这个问题。
      

  8.   

    你的分页bean太罗嗦
    package whc.skyline;/**
     * Title:        分页主程序
     * Description:
     * Copyright:    Copyright (c) 2002
     * Company:
     * @author       skyline
     * @version 1.0
     */
    import java.util.*;
    import java.sql.*;
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import whc.skyline.*;public class Pagi
    {
    ResultSet CountTopicrs=null; //初始化总记录数Rs变量
    ResultSet Pagirs=null; //初始化分页时每页的记录集数Rs变量private int intCountTopic=0; //主题总数,即select选出的、库中所有记录总数
    public int intPageSize; //每页显示主题数,即每页显示的记录总数
    public int intPageCount; //总页数
    public int intPage=0; //当前页数
    private String  Countsql=null,Pagisql=null,str=null,str_where=null;
    private String str_parameter="";
    //public static int pages_n=1; //传分页参数值private String nowPage; //初始化当前页intPage变量,以准确便获取当前页,即获取当前页的具体页号。
    private String HttpFile; //当前的地址栏的文件,即具体jsp文件。Linkdb db = new Linkdb();//连接数据库//接收传分页参数
    public void  setPages(int n)
    {
     intPageSize = n;
    }/*功能:接收参数组织SQL语句
     *str_table :分页显示的表名
     *str_where:分页的where条件
     *httpfile :具体jsp文件
     *pages :获取地址栏传过来的pages参数
     */
    public ResultSet setQuerysql(String str_table,String str_where, String httpfile,String pages)throws SQLException
    {
    ResultSet r=null;
    this.nowPage=pages;
    this.HttpFile=httpfile;//分页文件名
    Countsql="select count(*) from "+str_table+" "+str_where;
    Pagisql="select * from "+str_table+" "+str_where;
    try{
    r=querySql(Countsql,Pagisql);
    }catch(SQLException _ex)
    {System.out.println(_ex);}
    return r;
    }/*功能:接收参数进行首尾页判断
     *Countsql:总记录的Query字符串。[形式为select count(*) from tablename]
     *Pagisql :要分页的Query字符串。[形式为select * from tablename where ...]
     *request :参数传递过程中的变量。[用来控制翻页时的pages变量]
     */
    public ResultSet querySql(String Countsql,String Pagisql)//,HttpServletRequest request
    throws SQLException{
    //获取当前文件名。
    //HttpFile=request.getRequestURI();
    //获取当前页,将数值赋予intPage变量。[分页栏中必须要有pages参数]
    //nowPage=request.getParameter("pages");//由参数HttpServletRequest request传递而来if (nowPage==null)
       { intPage=1; }
    else
      {
       intPage=Integer.parseInt(nowPage);
       if (intPage<1)
          intPage=1;
      }//end else//获取总记录数的结果集。
    CountTopicrs=db.executeQuery(Countsql);
    if (CountTopicrs.next())
    {
    intCountTopic=CountTopicrs.getInt(1); //获取第一个字段的整型
    }
    //获取总页数。
    intPageCount = (intCountTopic+intPageSize-1)/intPageSize;
    //如果当前页大于总页数,则当前页等于总页数。//=最后一页
    if (intPage>intPageCount)
    {
    intPage=intPageCount;
    }
    //关闭总主题数的数据集。
    CountTopicrs.close();//获取执行分页的结果集。
    Pagirs=db.executeQuery(Pagisql);
    return Pagirs;
    }//end querySql function.//获取记录总数。
    public int getCountTopic()
    {
    return intCountTopic;
    }//获取总页数。
    public int getPageCount()
    {
    return intPageCount;
    }//获取当前页数。
    public int getIntPage()
    {
    return intPage;
    }//获取当前页的数据。boodata为True,表示要加入该数据到当前页。
    //这里可能会在JSP调用时影响速度[因为调用时要多一层循环],因此放到JSP中嵌入,待改进。
    //该代码暂时保留。
    // public boolean getData(){
    // boolean boodata=false;
    // if (intPageCount>0)
    // {
    // try
    // {
    // while (Pagirs.next())
    // {
    // i++;
    /// if (i>((intPage-1)*intPageSize) &&(i<=intPage*intPageSize))
    // {
    // boodata=true;
    // }
    // } //endwhile.
    // }//end try.
    // catch(Exception e){
    // System.out.println(e.toString());
    // }
    // } //endif.
    // return boodata;
    // } //end getData();//设置分页参数
    public void setPfoot(String str)
    {
    this.str_parameter+=str;
    }//分页栏函数。
    public String PageFooter() {
    String str = "";
    int next, prev;
    prev=intPage-1;
    next=intPage+1;
    str +="<font style='font-size: 9pt'>总计<font color='red'>"+getCountTopic()+"</font>条记录,"+"【共<font  color='red'>"+getPageCount()+"</font>页】";
    str +="【条"+intPageSize+"/页】 当前第<font color='red'>"+getIntPage()+"</font>页(列出第"+((intPageSize*getIntPage()+1)-intPageSize)+"到第"+(getIntPage()*intPageSize)+"条) &nbsp; &nbsp; ";//getIntPage()*intPageSize
    if(intPage>1)
    str += " <A href=" + HttpFile + "?pages=1"+str_parameter+">第一页</A> ";
    else str += " 第一页 ";if(intPage>1)
    str += " <A href=" + HttpFile + "?pages=" + prev +str_parameter+ ">上一页</A> ";
    else str += " 上一页 ";if(intPage<intPageCount)
    str += " <A href=" + HttpFile + "?pages=" + next +str_parameter+ ">下一页</A> ";
    else str += " 下一页 ";if(intPageCount>1&&intPage!=intPageCount)
    str += " <A href=" + HttpFile + "?pages=" + intPageCount +str_parameter+ ">最后页</A>";
    else str += " 最后页 </font>";
    str +="  转到<INPUT TYPE='text'NAME='go' size='2'>页  <input type='submit' name='Submit' value='go'>";
    return str;
    }
    //关闭数据库连接
    public void closeConn()
    {
    db.closeStmt();
    db.closeConn();
    }} //end.
      

  9.   

    连接数据库
    package whc.skyline;import java.sql.*;
    /**
     * Title:        数据库底层连接
     * Description:
     * Copyright:    Copyright (c) 2002
     * Company:
     * @author       skyline
     * @version 1.0
     */
    public class Linkdb {
    String strDriver="sun.jdbc.odbc.JdbcOdbcDriver";//加载驱动程序
    String strConn="jdbc:odbc:dbserver";
    private Connection conn = null;
    private Statement stmt = null; //执行SQL语句
    ResultSet rs = null;public Linkdb()
    {
    try
    {
      Class.forName(strDriver).newInstance();  //**newInstance()什么意思?**//
    } catch (Exception  e) {
      System.err.println("不能连接数据库!"+e.getMessage());
    }
    }//执行Select语句
    public ResultSet executeQuery(String sql) {
    try {
    conn = DriverManager.getConnection(strConn,"sa","sa");  //建立与数据源之间的连接
    stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
    rs = stmt.executeQuery(sql);  //反回结果集
    }catch(SQLException ex) {
    System.err.println("执行SQL语句出错:" + ex.getMessage());
    }
    return rs;
    }//执行Insert,Update语句
    public void executeUpdate(String sql) {
    try {
    conn = DriverManager.getConnection(strConn,"sa","sa");
    stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);//分页必加参数
    stmt.executeQuery(sql);
    stmt.close();
    conn.close();
    }
    catch(SQLException ex) {
    System.err.println("执行SQL语句出错: " + ex.getMessage());
    }
    }public void closeStmt(){
    try{
    stmt.close();
    }
    catch(SQLException e){
    e.printStackTrace();
    }
    }public void closeConn(){
    try{
    conn.close();
    }
    catch(SQLException e){
    e.printStackTrace();
    }
    }
    }
      

  10.   

    jsp调用如下:
    <%@ page contentType="text/html; charset=gb2312" %>
    <%@ page  import="java.sql.*, whc.skyline.*" %>
    <%
     /**
     * Title:        分页jsp程序
     * Description:  动态分页显示,只需向Pagi.class传入表名及where 查询条件即可
     * Copyright:    Copyright (c) 2002
     * Company:
     * @author       skyline
     * @version 1.0
     */
    %>
    <%
     String nowPage="";
     String str_where="";//设置查询条件,默认值为空
     String footer="";
     String field_1="",field_2="",field_3="",field_4="";
    %>
    <jsp:useBean id="pagi" scope="page" class="whc.skyline.Pagi" />
    <html>
    <head></head>
    <body><table  width="70%" align='center'><tr></td><b>分页显示效果:</b></td></tr></table>
    <table width=70% border='1' cellspacing='0' cellpadding='0' align='center' bordercolorlight='#000000'    bordercolordark='#FFFFFF'>
    <%
    nowPage=request.getParameter("pages");  //获取地址栏传过来的pages参数
    if (nowPage==null||nowPage.equals("null"))
        nowPage="0";    //将当前页的具体页号置为0
    pagi.setPages(5);   //设置分页的每页条数
    ResultSet rs = pagi.setQuerysql("a_test2","str_where","page.jsp",nowPage);
    footer = pagi.PageFooter(); //读分页栏
    //输出表头
    out.print("<tr><td>序号</td><td>姓名</td><td>性别</td><td>邮箱</td></tr>");
    try{
        if (pagi.intPageCount>0)
        {
        int i=0;
        while (rs.next())
        {
        i++;    if (i>((pagi.intPage-1)*pagi.intPageSize) &&(i<=pagi.intPage*pagi.intPageSize))
           {
            field_1=rs.getString(1)+"";
            field_2=rs.getString(2)+"";
            field_3=rs.getString(3)+"";
            field_4=rs.getString(4)+"";
            %>
            <tr><td><%=field_1%></td><td><%=field_2%></td><td><%=field_3%></td><td><%=field_4%></td></tr>
            <%
           }//end if
        } //end while
        } //end if
        rs.close();
      } catch(Exception e)
             {out.println(e.getMessage());}
        finally
             {pagi.closeConn();}
    out.print("</table>");
    out.println("<table border=0 width='70%' cellspacing='0' cellpadding='0' align='center' bordercolorlight='#000000'    bordercolordark='#FFFFFF'><tr><td colspan=4 align=center>"+footer+"</td></tr>");
    %>
    </table>
    </body>
    </html>