查詢資料庫後是返回ResultSet實現中遇到的問題

藍色蝦發表於2002-10-11
看了板橋先生的《查詢資料庫...》這篇文章後覺得Iterator處理方式覺得十分不錯,有意拿來嘗試,可是在事件過程中遇到了困難,難以解決,希望大家給與幫助。先附上所有程式碼。
環境:Struts1.02+tomcat4.1+mysql
class:News(和資料庫中的news表對應)
----------------------------------------

package cn.edu.njut.jp.soso.model;
import com.mysql.jdbc.ResultSet;
import java.sql.SQLException;
import java.io.Reader;
import java.io.BufferedReader;
import java.io.Serializable;
public class News implements Serializable{
  private String newsID;
  private String subject;
  private String url;
  private String creationDate;
  private String sort;
  private String fromSite;

  public void setNewsID(String id){
    this.newsID=id;
  }
  public String getNewsID(){
    return newsID;
  }

  public void setSubject(String subject){
    this.subject=subject;
    //測試程式碼
    System.out.println("新聞標題為:"+subject);
  }
  public String getSubject(){
    return subject;
  }

  public void setUrl(String url){
    url=this.url;
  }
  public String getUrl(){
    return url;
  }

  public void setCreationDate(String date){
    this.creationDate=date;
  }
  public String getCreationDate(){
    return creationDate;
  }

  public void setSort(String sort){
    this.sort=sort;
  }
  public String  getSort(){
    return sort;
  }

  public void setFromSite(String site){
    this.fromSite=site;
  }
  public String getFromSite(){
    return fromSite;
  }
}
<p class="indent">

//---------------------------------------
//-DisplayAllNewsAction
//---------------------------------------

package cn.edu.njut.jp.soso.controller;

import cn.edu.njut.jp.soso.model.DisplayAllNews;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Locale;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.util.MessageResources;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;

import com.mysql.jdbc.ResultSet;

public class DisplayAllNewsAction extends Action {
  Connection connection;

  ResultSet chinaNewsResult;
  ResultSet intelNewsResult;
  ResultSet sportNewsResult;

  /**
   * @param mapping
   * @param form
   * @param request
   * @param response
   * @return
   * @throws IOException
   * @throws ServletException
   */
  public ActionForward perform(ActionMapping mapping,
                               ActionForm form,
                               HttpServletRequest request,
                               HttpServletResponse response)
      throws IOException, ServletException{
    ActionErrors errors = new ActionErrors();
    try {
      DataSource dataSource =servlet.findDataSource(null);
      connection =dataSource.getConnection();
      //測試程式碼
      System.out.println("程式開始!");
      DisplayAllNews displaywelcome=new DisplayAllNews();
      displaywelcome.setConn(connection);
      chinaNewsResult=displaywelcome.getChinaNewsResult();
      intelNewsResult=displaywelcome.getIntelNewsResult();
      sportNewsResult=displaywelcome.getSportNewsResult();

      if (chinaNewsResult == null) {
        saveErrors(request, errors);
        return (new ActionForward("No chinaNewsResult in cn.edu.njut.jp.soso.controller.DisplayAllNewsAction"));
      }
      if (intelNewsResult == null) {
        saveErrors(request, errors);
        return (new ActionForward("No intelNewsResult in cn.edu.njut.jp.soso.controller.DisplayAllNewsAction"));
      }
      if (sportNewsResult == null) {
        saveErrors(request, errors);
        return (new ActionForward("No sportNewsResult in cn.edu.njut.jp.soso.controller.DisplayAllNewsAction"));
      }
      request.setAttribute("chinaNewsResult",chinaNewsResult);
      request.setAttribute("intelNewsResult",intelNewsResult);
      request.setAttribute("sportNewsResult",sportNewsResult);

      //do what you wish with myConnection
    } catch (SQLException sqle) {
      getServlet().log("Connection.process", sqle);
    } finally {
      //enclose this in a finally block to make
      //sure the connection is closed
      if(connection!=null)
        try {
        connection.close();
      } catch (SQLException e) {
        getServlet().log("Connection.close", e);
      }
    }
    return (mapping.findForward("success"));
  }
}
<p class="indent">

//--------------------------------
//--DisplayAllNews
//--------------------------------

package cn.edu.njut.jp.soso.model;

import java.sql.Connection;
import com.mysql.jdbc.ResultSet;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.SQLException;

public class DisplayAllNews {

    Connection conn;
    public void setConn(Connection conn){
      this.conn=conn;
    }

    /**
     * 取得按照加入順序(依靠ID號)倒排的前十條資料
     * @param conn
     * @return
     * @throws SQLException
     */
    public  ResultSet getChinaNewsResult() throws SQLException{

      if(conn==null)
        throw new SQLException("No Connection in getChinaNewsResult()");

      PreparedStatement pstmt = null;
      ResultSet rs = null;
      try {
        // Prepare the query SQL
        pstmt = conn.prepareStatement("select * from news where sort='china' order by creationDate desc");
        rs = (com.mysql.jdbc.ResultSet)pstmt.executeQuery();
        //測試程式碼
        System.out.println("資料庫中有無資料1:"+rs.next());
      }
      finally {
       // if (rs != null)//只有將這些登出後下面的println才為true
        //  rs.close();//這邊一旦close。底下的rs就不能用了
       // if (pstmt != null)//這和板橋先生所說不符合,忘指教
       //   pstmt.close();//
      }
      //測試程式碼
      System.out.println("資料庫中有無資料2:"+rs.next());
      return rs;
    }
  }
<p class="indent">

//--------------------------
//--MyIterator
//--------------------------

package cn.edu.njut.jp.soso.model;

import com.mysql.jdbc.ResultSet;
import java.util.Iterator;
import java.util.NoSuchElementException;

public abstract class MyIterator {
  protected abstract Object resultToObject(ResultSet result) throws Exception;

  public Iterator resultToIterator(ResultSet result) {
   return new ResultSetIterator(result);
 }

 protected class ResultSetIterator implements Iterator {

   private ResultSet resultSet;
   private Object next;

   public ResultSetIterator(ResultSet result) {
     this.resultSet = result;
     //測試程式碼
     System.out.println("在ResultSetIterator(ResultSet result)中!");
   }

   public boolean hasNext() {
     //測試程式碼
     System.out.println("在hasNext()中!");
     try {
       if (next == null) {
         if (!resultSet.next()) {
           //測試程式碼
           System.out.println("返回false!");
           return false;
         }
         next = resultToObject(resultSet);
       }
       //測試程式碼
       System.out.println("返回true!");
       return true;
     } catch (Exception e) {
       return false;
     }
   }

   public Object next() {
     if (!hasNext()) {
       throw new NoSuchElementException();
     }
     Object returnValue = next;
     next = null;
     return returnValue;
   }

   public void remove() {
     throw new UnsupportedOperationException("No remove allowed");
   }
  }
}
<p class="indent">

//--------------
//--繼承MyIterator的NewsIterator
//實現了resultToObject()
//--------------

package cn.edu.njut.jp.soso.model;

import com.mysql.jdbc.ResultSet;

public class NewsIterator extends MyIterator{
  protected  Object resultToObject(ResultSet rs) throws Exception{
    //測試程式碼
    System.out.println("在NewsIterator中!");
    News _news=new News();
    String strValue=null;
    strValue=rs.getString("newsID");
    if(strValue==null)
      throw new Exception("新聞ID為空!");
    _news.setNewsID(strValue);

    strValue=rs.getString("subject");
    if(strValue==null)
      throw new Exception("新聞標題為空!");
    _news.setSubject(strValue);

    strValue=rs.getString("url");
    if(strValue==null)
      throw new Exception("新聞URL為空!");
    _news.setUrl(strValue);

    strValue=rs.getString("creationDate");
    if(strValue==null)
      throw new Exception("新聞建立日期為空!");
    _news.setCreationDate(strValue);

    strValue=rs.getString("sort");
    if(strValue==null)
      throw new Exception("新聞類別為空!");
    _news.setSort(strValue);

    strValue=rs.getString("fromSite");
    if(strValue==null)
      throw new Exception("新聞來自站點為空!");
    _news.setFromSite(strValue);
    return _news;
  }
}
<p class="indent">

//--------index.jsp------

<%@ page contentType="text/html; charset=GB2312" %>
<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<logic:forward name="welcome"/>
<p class="indent">

//--------chinatopnewsinclude.jsp---------------

<%@ page contentType="text/html; charset=GB2312" %>
<%@ page import="cn.edu.njut.jp.soso.model.News" %>
<%@ page import="cn.edu.njut.jp.soso.model.NewsIterator" %>
<%@ page import="com.mysql.jdbc.ResultSet" %>
<%@ page import="java.util.Iterator" %>
<html>
<head>
<title>
chinatopnewsinclude
</title>
<link rel="stylesheet" href="css/font.css" type="text/css">
</head>
<body bgcolor="FFFFFF">
<center>
  <table width="100%" border="0" cellspacing="5" cellpadding="0" class="font">
<%
News news=new News();
NewsIterator newsIterator=new NewsIterator();
Iterator iterator=newsIterator.resultToIterator((ResultSet)request.getAttribute("chinaNewsResult"));
System.out.println("網頁中的:"+iterator.hasNext());
while(iterator.hasNext()){
news=(News)iterator.next();
%>
    <tr>
      <td width="33%">
        <div align="center">新聞標題</div>
      </td>
      <td width="33%">
        <div align="center">日期</div>
      </td>
      <td width="34%">
        <div align="center">來自網站</div>
      </td>
    </tr>
    <tr>
      <td width="33%"><%=news.getSubject()%></td>
      <td width="33%">date</td>
      <td width="34%">from</td>
    </tr>
<%
}

%>
  </table>
</center>
</body>
</html>
<p class="indent">


//-----Struts-congif.xml檔案為

   <global-forwards>
    <forward   name="welcome"                path="/welcome.do"/>
  </global-forwards>


  <action-mappings>

    <!-- Enter into Welcome Page -->
    <action    path="/welcome"
               type="cn.edu.njut.jp.soso.controller.DisplayAllNewsAction">
      <forward name="success"              path="/chinatopnewsinclude.jsp"/>
    </action>

  </action-mappings>
<p class="indent">

出現的問題為:chinatopnewsinclude.jsp沒有列印的新聞,可是我在
News中的System.out.println("新聞標題為:"+subject);卻只能能列印
出兩段新聞標題。資料庫沒有問題,超過兩條記錄。

相關文章