Java & JSF1.2におけるデータ表示の問題

このQ&Aのポイント
  • JavaとJSFを勉強中のプログラマが、クエリー結果をJSFのDataTableに表示する処理の問題に直面しています。
  • クエリーの結果は8件のデータを返しているにもかかわらず、DataTableに表示されません。
  • ArrayListでは正常に表示されるが、ResultSetでは表示されないため、解決策を教えて欲しいとしています。
回答を見る
  • ベストアンサー

java & JSF1.2 についての質問です。

java & JSF1.2 についての質問です。 私は、JavaとJSFを勉強中のプログラマです。C,C++,C#,php,SQL 等の技術的知識は多少あります。 しかし、Java と JSF については初心者です。 <質問概要> JSFの勉強のために、簡単な電子掲示板プログラムを開発しているのですが、 クエリー(SQL)の結果を JSF の <h:dataTable> に関連付けて表示する処理がうまく動きません。 クエリーの結果は8レコードのデータを返しているのに、<h:dataTable>には一件も表示されないのです。エラーも出ません。 <開発環境> OS:WindowsXP SP3 JDK 1.5.0 Apache Tomcat v6.0 JSF 1.2(Apache Myfaces JSF Core-1.2 API 1.2.9) <問題のソースコード> [BbsBeanMain.java] Bean のソースコード public Connection con = null; public Statement state = null; private ResultSet rsList; public ResultSet getRsList() { this.setRsList(); return this.rsList; } public void setRsList() { try{ Class.forName("com.mysql.jdbc.Driver"); this.con = DriverManager.getConnection("jdbc:mysql://localhost/bbs", "root", "mtdvd1208"); this.state = this.con.createStatement(); String strSQL; strSQL = "select Thread_ID, Thread_Title, Thread_Date from T1_Thread "; strSQL += "order by Thread_Date desc "; this.rsList = this.state.executeQuery(strSQL); } catch(Exception ex){ System.out.println("Error BbsBeanMain.setRsList ex=" + ex); } } [main.jsp] JSP のソースコード <h:dataTable id="ttbl1" value="#{BbsBeanMain.rsList }" var="rs" headerClass="ttbltr" columnClasses="ttblcol1,ttblcol2" > <h:column> <f:facet name="header"> <h:outputText value="スレッド" /> </f:facet> <h:form id="threadnamefrm"> <h:inputHidden id="threadid" binding="#{BbsBeanMain.ihThreadID }" value="#{rs.Thread_ID }" /> <h:commandLink action="#{BbsBeanMain.mDispThread }"> <h:outputText id="id1" value="#{rs.Thread_Title }" /> </h:commandLink> </h:form> </h:column> </h:dataTable> <h:messages /> <ソースコード解説>  上記 ResultSet オブジェクトの内容を、ArrayList に乗せ変えてやると正常に表示します。  私が知りたいのは、なぜ ArrayList で動くものが、ResultSet では動かないのか?という点です。  ヒントだけでも結構です。何か知っている方がいらっしゃれば、教えてください。  お願いします。  質問文の最大文字数が少なすぎて、正常に動作する ArrayList 版のソースコードが載せられないのが残念です。

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • drg75
  • ベストアンサー率34% (98/288)
回答No.1

h:dataTableタグはコレクション(List,配列など)のデータを 表にして表示するUIコンポーネントですからリスト型の物でないと 表示できないかと思います。

参考URL:
http://www.wakhok.ac.jp/~tomoharu/jsf2004/text/index_c7.html#doc1_id795
kimoto8
質問者

補足

残念ながら、自分で答えを見つけてしまいました。 ある意味、この回答は正しいと思われます。 JSFの実装には、いくつか種類があるそうです。 私は一つしかないと思って Myfaces という実装を使用していました。 しかし、現在JSF実装のデファクトスタンダードは、「Mojarra(マハーラ)」という実装だそうです。  Myfaces は、いくつか不具合もあり速度も遅いなど問題のある実装だそうです。 商用のアプリケーションサーバのJSFもほとんど Mojarra だそうです。  私の「ResultSet で、<h:dataTable>表示できない」問題も、「もしかしたら Myfacesの不具合かも知れない」と思い、JSF実装を Mojarra に入れ替えてみました。  すると、案の定 ResultSet で <h:dataTable> 表示ができるようになりました。  原因は、Myfaces の不具合でした。  これからJSFを勉強する人は、JSF実装には Mojarra を使用することをお勧めします。  私のように無駄な苦労をしない為に。 回答者の回答の「リスト型の物でないと表示できない」という回答もMyfaces においては正しいのです。 しかし、Mojarra においては当てはまりません。  とりあえず、原因がわかったので、この回答をベストアンサーに選んで終了したいと思います。

関連するQ&A

  • JSFについて

    JSFを使おうとしてるのですが <%@page contentType="text/html; charset=Shift_JIS"%> <%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <html> <head> <title>jsfsample1</title> </head> <body bgcolor="#ffffff"> <h1>JSF サンプル</h1> <f:view> <h:form> <h:outputText value="ようこそJSFへ" /> <h:inputText /> <h:commandButton value="click"/> </h:form> </f:view> </body> </html> 上記の10行目<f:view>でエラーが出るのですが何ででしょうか?? ライブラリやweb.xmlは本を見て所定の場所にコピーしました。

    • ベストアンサー
    • Java
  • JSFでJavaScriptを使用するには?

    JSF初心者の為、頓珍漢な質問で恐縮です。 以下のようなJSFタグを使用したJSPがあるとします。 <%@ page contentType="text/html;charset=Shift_JIS" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <html> <head> </head> <body> <f:view> <h:form> <h:inputText id="number" value="#{myBean.message}"/> <h:commandButton action="#{myBean.doHoge}" value="送信"/> </h:form> </f:view> </body> </html> このJSPに、以下の処理をJavaScriptで実装したいと思っています。 「送信ボタンのOnClickイベントでinputTextに入力された文字をJavaScriptのAlert()関数でポップアップ表示する。」 JSFタグがなければなんてことのない処理ですが、JSFタグを使用している状況でどのようにJavaScriptを使用していいものなのかがよくわかりません。 上記の処理はどのように実装すればいいのでようか? JSFでJavaScriptを使用する方法について参考になるサイトがあれば教えてください。

    • ベストアンサー
    • Java
  • JSFを使ったJSPについて

    お世話になります。JSFの使い方についてご教授ください。 JSFタグ使って書いたjspが吐いたHTMLのソースを見ると、文字が全て株のようにユニコードのコードポイント(?)になっているのですが、これはこういうものですか? Javascriptで書いた入力値の検証関数にも「社員ID」と値をベタ書きしておいたら、「社員IDを入力してください。」というダイアログになってしまいました。 どなたか JSFタグ使って書いたjspが吐いたHTMLのソースの文字を株のようにしない方法 あるいは 上記のJavascriptのメッセージを「社員IDを入力してください。」ときちんと読めるようにする方法 を、ご教授ください。どうぞよろしくお願いします。

  • 【JSF】一つのテキストボックスの値を、複数のJAVAに渡す方法

    イメージとしては <h:inputText value="#{A.id}"/> の#{A.id}の部分に さらに、#{B.id}も指定したいのですが 出来ますでしょうか? やりたい事は テキストボックスに指定されたキーワードを Aボタンを押すとA.javaにテキストボックスの値を渡し Bボタンを押すとB.javaにテキストボックスの値を渡したいのです。 現状では、AかBのどちらか一方にしか値を渡すことが出来なくて困っています。 出来なければ、同等の処理を行うにはどの様にしたら宜しいでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • Java
  • JavaでのSQL文の実行について

    JavaでのSQL文の実行について Class.forName("org.gjt.mm.mysql.Driver"); con = DriverManager.getConnection("jdbc:mysql://localhost/testdb?useUnicode=true&characterEncoding=UTF-8", "id", "pw"); stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); sql = new StringBuffer(); sql.append("set @i:=0;select id,@i:=@i+1 as 'num',name,kana from table order by kana"); rs = stmt.executeQuery(sql.toString()); ResultSetMetaData rsmd = null; rsmd = rs.getMetaData(); tbl = new ArrayList<ArrayList>(); //検索結果 取得 if(rs.next()){ ・ ・ ・ ・ といった形でSQL文を実行してるのですが、うまくいきません。 MySQLのバージョンは5.1です。MySQL上でこのSQLを実行するとしっかり結果は取得できたので、Javaプログラムの書き方に問題があると思うのですが、上記のように一度で二つのSQL文を実行することはできないのでしょうか。単一のSQLの実行は正常にできています。ユーザ変数は取得された結果一覧に行番号を付与するために使っています。 2回に分けてこのSQLが実行できるのであれば、その方法でも良いので教えてもらいたいです。 つたない説明で申し訳ないですが、よろしくお願いします。

    • ベストアンサー
    • Java
  • JSFで最初のリクエストで動く処理を実装するには?

    近日、JSF(ver 1.2)でWebシステムを実装することになりJSFの勉強中のものです。 ASP.NET や PHP(Smarty) でWebシステム実装経験があります。 JSFでどう実装すれば良いのかわからないことがあり、詳しい方にお教え頂きたいと考えています・・・! 【質問概要】 JSFで最初のリクエスト時のみに動く処理はどのように実装すればよいのでしょうか? ASP.NETでは Page_Load イベントで Page#IsPostBack を以下の例のように使用すると 最初のリクエスト時のみに動く処理を実装することができました。 ---- 例 ここから ------------------------------------------- void Page_Load() { // 毎リクエスト時に行う処理 if (!IsPostBack) { // 最初のリクエスト時にのみ行う処理 } } ---- 例 ここまで ------------------------------------------- JSFではこれに相当するものが無いでしょうか? 【試してみたこと】 管理Beanのコンストラクタで最初のリクエスト時にのみ行う処理ができるかと思い、 以下のtest.jspを実行し、コンソールにどのように表示されるか試してみました。 ---- test.jsp ここから ------------------------------------- <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> (中略) <body> <f:view> <h:form> <h:commandButton action="#{Test.clickTest}" value="テストボタン"></h:commandButton><br /> </h:form> </f:view> </body> </html> ---- test.jsp ここまで ------------------------------------- ※Test は 下記 Test.java で実装した管理Bean。スコープはrequest。 ---- Test.java ここから ------------------------------------- public class Test { public Test(){ System.out.println("コンストラクタを通っている。"); } public String clickTest() { System.out.println("ボタンが押された。"); return "clickTest"; } } ---- Test.java ここまで ------------------------------------- <コンソール出力結果> 最初のリクエスト時: コンストラクタを通っている。 テストボタン押下後: コンストラクタを通っている。 ボタンが押された。 このことから、リクエストのたびにコンストラクタが処理されていることが分かりました。 ASP.NETの Page#IsPostBack の様なものがあれば、最初のリクエストかどうかを判別できるのですが・・・! 以上です。 上記のようなコンストラクタを使用する以外でも、なにか良い方法は無いでしょうか? お詳しい方、何卒よろしくお願い申し上げます・・・!

  • C#のdatatableを配列に挿入し、DataGridViewにバインドする方法

    開発環境:VS2005 はじめまして。ゆかりともうします。 今悩んでいるのが、datatableに入っているオブジェクトを配列に挿入し、 文字列編集後にDataGridViewに表示させたいのですが、やり方がわかりません。 お手数ですが、どなたかご教示いただけないでしょうか? コードサンプル) ArrayList array = new ArrayList(); select * from name; using (System.Data.DataTable dataTable = new DataTable()) { this.sqlDataAdapter.Fill(dataTable); <---どのように記述してよいのか分かりません---> } ※select文で抽出されてくる項目は5つございます。 すみませんが、よろしくお願い致します。

  • Excel VBA EOFに関して

    テキストボックスにDateを入力し、SQLServerに接続しSelectの結果をシートに書き込むだけのものなのですが、「BOFとEOFのいずれかがTrueになっているか、または現在のレコードが削除されています」というエラーでさっぱりわかりません。どなたかアドバイスをお願い致します。 -前後省略- stdate = UserForm1.stdate.Value endate = UserForm1.endate.Value strsql = "select ***" strsql = strsql & "from ***" strsql = strsql & "where *** and ***.start_date between '" & stdate & "' and '" & endate & "' " con.Open connectionString Set rs = con.Execute(strsql) Sheets("Data1").Select rs.MoveFirst i = 2 Do Until rs.EOF Cells(i, 1) = rs.Fields(0).Value Cells(i, 2) = rs.Fields(1).Value Cells(i, 3) = rs.Fields(2).Value Cells(i, 4) = rs.Fields(3).Value i = i + 1 rs.MoveNext Loop con.Close Set con = Nothing Exit Sub Err_DBConnectOpen: MsgBox Err.Description If con.State <> ADODB.adStateClosed Then con.Close End If Set con = Nothing End Sub

  • javaの初歩的な質問です

    以下のソースコードをかきました Image image = ImageIO.read(Thread.currentThread().getContextClassLoader().getResourceAsStream("16_16.png")); すると以下のエラーがでてきました Exception in thread "main" java.lang.IllegalArgumentException: input == null! at javax.imageio.ImageIO.read(Unknown Source) at Task.<init>(Task.java:23) at Task.main(Task.java:16) 16_16.png が見つからないというメッセージでしょうか? しかし16_16.pngはエクリプス上ではプロジェクト直下に入っているようにみえます。 数ヶ月前まではエラーなどは出てなかったと思うのですが。

    • ベストアンサー
    • Java
  • java のstruts1.3です。

    java のstruts1.3です。 Cannot invoke newStrutsKadai.EntryWorkForm.setArrayDB on bean class 'class newStrutsKadai.EntryWorkForm' - argument type mismatch - had objects of type "java.lang.String" but expected signature "java.util.ArrayList" と言うエラーがでます。 以下javaのソースです。DB接続は完璧に出来ています。 public final class EntryWorkForm extends ActionForm { private static final long serialVersionUID = 1L; private String cmbOsName; ArrayList<EntryWorkForm> array = new ArrayList<EntryWorkForm>( ) ; public void reset( ActionMapping map, HttpServletRequest req ) { //必要な部分だけ抜粋 //検索された行数文ループ while( rs.next( ) ) {//本マスタテーブル 検索された行数文ループ String stOSName = rs.getString("OSName"); //上記の2行を丁寧に記述した EntryWorkForm obj = new EntryWorkForm( stOSName.toString() ); array.add( obj ) ; } //END while( rs.next( ) ) this.setArrayDB( array );//ここでエラーエラーエラー } /****************************************************************************************/ private ArrayList<EntryWorkForm> arrayDB = new ArrayList<EntryWorkForm>( ); //セット オブジェクト配列 public void setArrayDB( ArrayList<EntryWorkForm> arrayDB ){ this.arrayDB = arrayDB; } //ゲット オブジェクト配列 public ArrayList<EntryWorkForm> getArrayDB ( ) { return this.arrayDB ; } /****************************************************************************************/ public String getCmbOSName ( ) { return this.cmbOsName; } public void setCmbOSName ( String cmbOsName ) { this.cmbOsName = cmbOsName; } public EntryWorkForm( ) { } //コンストラクタ 引数あり EntryWorkForm ( String cmbOSName ) { System.out.println("テスト用で作成したコンストラクタが呼ばれています。 ReturnScreenFormDB.java"); cmbOsName = cmbOSName; } 質問です--- JSPでセレクトボックスに動的に出力しています。 JSP画面でボタンを押して画面遷移をすると上記のエラーが出ます。

    • ベストアンサー
    • Java