查詢資料庫後是返回ResultSet實現中遇到的問題
看了板橋先生的《查詢資料庫...》這篇文章後覺得Iterator處理方式覺得十分不錯,有意拿來嘗試,可是在事件過程中遇到了困難,難以解決,希望大家給與幫助。先附上所有程式碼。
環境:Struts1.02+tomcat4.1+mysql
class:News(和資料庫中的news表對應)
----------------------------------------
//---------------------------------------
//-DisplayAllNewsAction
//---------------------------------------
//--------------------------------
//--DisplayAllNews
//--------------------------------
//--------------------------
//--MyIterator
//--------------------------
//--------------
//--繼承MyIterator的NewsIterator
//實現了resultToObject()
//--------------
//--------index.jsp------
//--------chinatopnewsinclude.jsp---------------
//-----Struts-congif.xml檔案為
出現的問題為:chinatopnewsinclude.jsp沒有列印的新聞,可是我在
News中的System.out.println("新聞標題為:"+subject);卻只能能列印
出兩段新聞標題。資料庫沒有問題,超過兩條記錄。
環境: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);卻只能能列印
出兩段新聞標題。資料庫沒有問題,超過兩條記錄。
相關文章
- JDBC用ResultSet訪問大量資料時會遇到的問題JDBC
- 關於Room資料庫,拼寫模糊查詢語句遇到的問題OOM資料庫
- Excel資料庫轉MySQL,實現查詢Excel資料庫MySql
- 解析MSSQL跨資料庫查詢的實現方法SQL資料庫
- 使用cglib實現資料庫框架的級聯查詢CGLib資料庫框架
- weex中UISegmentControl實現及遇到的問題UI
- 如何使用 Milvus 向量資料庫實現實時查詢資料庫
- SSH:hiberate實現資料的查詢(單查詢和全查詢)
- MongoDB資料庫中查詢資料(下)MongoDB資料庫
- 資料庫中單表查詢資料庫
- SQL server資料庫with as子句與遞迴查詢的實現SQLServer資料庫遞迴
- Oracle資料庫中的分頁查詢Oracle資料庫
- 千萬級資料庫使用索引查詢速度更慢的疑惑-資料回表問題資料庫索引
- 在MongoDB資料庫中查詢資料(上)MongoDB資料庫
- SQL Server實戰四:查詢資料庫的資料SQLServer資料庫
- Springboot整合mybatis實現多資料來源所遇到的問題Spring BootMyBatis
- efcore 跨表查詢,實現一個介面內查詢兩個不同資料庫裡各自的表資料資料庫
- 記一次資料庫查詢超時優化問題資料庫優化
- 遇到403 Forbidden ,伺服器端查詢後結果是http get查詢字串中包含非法字元ORB伺服器HTTP字串字元
- 資料庫高階查詢之子查詢資料庫
- 資料庫高io問題調查資料庫
- Jemter查詢資料庫資料庫
- 求助:資料庫查詢資料庫
- ThinkPHP 資料庫查詢PHP資料庫
- 資料庫排序查詢資料庫排序
- 查詢資料庫大小資料庫
- mysql 5.7後使用sys資料庫下的表查詢資料庫效能狀況MySql資料庫
- 資料庫查詢慢的原因資料庫
- [20231017]使用dbms_xplan.display_awr查詢遇到的問題.txt
- 查詢資料庫的資料量的大小資料庫
- MYSQL資料庫複雜查詢練習題(難度適中)MySql資料庫
- 遇到一個 foreach() 的問題,就是資料庫有存在資料後就跳過不在寫入, 然後發現用 continue 並沒用資料庫
- 資料庫基礎查詢--單表查詢資料庫
- java中資料庫查詢,搭配簡單的圖形介面進行查詢Java資料庫
- 用conda安裝庫時遇到環境查詢失敗問題解決方案
- 監控資料庫連線遇到的一個小問題資料庫
- 實際專案中遇到的問題
- Prometheus時序資料庫-資料的查詢Prometheus資料庫
- Oracle資料庫中遇到的坑Oracle資料庫