看了板桥先生的《查询数据库...》这篇文章后觉得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; } }
|
//---------------------------------------
//-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")); } }
|
//--------------------------------
//--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; } }
|
//--------------------------
//--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"); } } }
|
//--------------
//--继承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; } }
|
//--------index.jsp------
<%@ page contentType="text/html; charset=GB2312" %> <%@ page language="java" %> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> <logic:forward name="welcome"/>
|
//--------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>
|
//-----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>
|
出现的问题为:chinatopnewsinclude.jsp没有打印的新闻,可是我在
News中的System.out.println("新闻标题为:"+subject);却只能能打印
出两段新闻标题。数据库没有问题,超过两条记录。