質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
GlassFish

GlassFishは、Java EE準拠のアプリケーションサーバの名称です。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

PrimeFaces

PrimeFacesは、トルコのソフトウェア会社Prime Teknolojiが提供する、 JSFリッチユーザーインターフェースコンポーネントです。 Apache License V2ライセンスのオープンソースソフトウェアです。

Q&A

解決済

2回答

7365閲覧

Primefacesのdatatableでのresultset表示について

edarion

総合スコア6

GlassFish

GlassFishは、Java EE準拠のアプリケーションサーバの名称です。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

PrimeFaces

PrimeFacesは、トルコのソフトウェア会社Prime Teknolojiが提供する、 JSFリッチユーザーインターフェースコンポーネントです。 Apache License V2ライセンスのオープンソースソフトウェアです。

0グッド

0クリップ

投稿2015/02/04 01:17

Webアプリケーション作成にあたり、primefacesを使用しようと考えています。
そこで、必要になりそうな部品の確認を行っていたのですが、
datatableでデータがうまく表示されません。(no record foundになる)

コードは以下になります。
【index.xhtml】

<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui"> <h:head> <title>Sample</title> </h:head> <h:body> <p:dataTable var="dt1" value="#{bean.resultSet}"> <p:column headerText="管理番号"> <h:outputText value="#{dt1.No}" /> </p:column> <p:column headerText="顧客番号" > <h:outputText value="#{dt1.Kokyaku_No}" /> </p:column> <p:column headerText="種類" > <h:outputText value="#{dt1.Type}" /> </p:column> <p:column headerText="結果" > <h:outputText value="#{dt1.Result}" /> </p:column> </p:dataTable> <br /> <h:dataTable var="dt2" value="#{bean.resultSet}" border="1"> <h:column> <f:facet name="header"> <h:outputText value="管理番号"/> </f:facet> <h:outputText value="#{dt2.No}" /> </h:column> <h:column > <f:facet name="header"> <h:outputText value="顧客番号"/> </f:facet> <h:outputText value="#{dt2.Kokyaku_No}" /> </h:column> <h:column > <f:facet name="header"> <h:outputText value="種類"/> </f:facet> <h:outputText value="#{dt2.Type}" /> </h:column> <h:column > <f:facet name="header"> <h:outputText value="結果"/> </f:facet> <h:outputText value="#{dt2.Result}" /> </h:column> </h:dataTable> </h:body> </html>

【Bean.java】

package mybean; import javax.inject.Named; import javax.enterprise.context.RequestScoped; import javax.inject.Named; import java.util.ArrayList; import java.io.*; import java.util.List; import java.sql.*; import javax.annotation.PostConstruct; @Named(value = "bean") @RequestScoped public class Bean { private ResultSet rs; private Connection conn; public Bean() { } @PostConstruct public void init() { String jdbc_url = "jdbc:sqlserver://w2012-java\JAVA;databaseName=test"; String user = "sa"; String password = "P@ssw0rd"; try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); conn = DriverManager.getConnection(jdbc_url, user, password); Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); String SQL = "SELECT * FROM test"; rs = stmt.executeQuery(SQL); }catch (Exception e) { e.printStackTrace(); } } public ResultSet getResultSet(){ return rs; } }

同じResultSetを使用している、<h:dataTable ~>側は問題なく表示されます。

何か思い当たる点はあるでしょうか?
よろしくお願いいたします

[環境]
jsf2.2
primefaces 5.1
glassfish 4.1
JDK 1.8.25
NetBeans 8.0.2
ブラウザ chrome,IE11

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Valueで指定するデータの型が一致しないのが原因ではないでしょうか。EntityBeanを定義し、Listで渡せば良いかと思います。

以下の様なClassを作成します。(データ型は推測なので修正下さい)

lang

1package mybean; 2 3public class Customer { 4 private Integer No; 5 private Integer Kokyaku_No; 6 private String Type; 7 private String Result; 8 9 public Customer(Integer No, Integer Kokyaku_No, String Type, String Result) { 10 this.No = No; 11 this.Kokyaku_No = Kokyaku_No; 12 this.Type = Type; 13 this.Result = Result; 14 } 15 16 public Integer getNo() { 17 return No; 18 } 19 20 public void setNo(Integer No) { 21 this.No = No; 22 } 23 24 public Integer getKokyaku_No() { 25 return Kokyaku_No; 26 } 27 28 public void setKokyaku_No(Integer Kokyaku_No) { 29 this.Kokyaku_No = Kokyaku_No; 30 } 31 32 public String getType() { 33 return Type; 34 } 35 36 public void setType(String Type) { 37 this.Type = Type; 38 } 39 40 public String getResult() { 41 return Result; 42 } 43 44 public void setResult(String Result) { 45 this.Result = Result; 46 } 47 48}

BackingBeanではfaceletに渡すパラメータ型をResultSetからListに変更し、SQL実行後にResultSetからListに格納します。

lang

1package mybean; 2 3import beans.*; 4import java.io.Serializable; 5import java.sql.*; 6import java.util.*; 7import javax.annotation.PostConstruct; 8import javax.enterprise.context.RequestScoped; 9import javax.inject.Named; 10 11@Named(value = "bean") 12@RequestScoped 13public class Bean implements Serializable{ 14 15 private List<Customer> rs; 16 17 String jdbc_url = "jdbc:sqlserver://w2012-java\JAVA;databaseName=test"; 18 String user = "sa"; 19 String password = "P@ssw0rd"; 20 21 @PostConstruct 22 public void init(){ 23 24 try { 25 ResultSet result; 26 Connection conn; 27 28 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 29 conn = DriverManager.getConnection(jdbc_url, user, password); 30 Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, 31 ResultSet.CONCUR_READ_ONLY); 32 String SQL = "SELECT * FROM test"; 33 result = stmt.executeQuery(SQL); 34 35 rs=new ArrayList<>(); 36 37 while(result.next()){ 38 rs.add(new Customer(result.getInt(1), result.getInt(2), 39 result.getString(3), result.getString(4))); 40 } 41 42 }catch (ClassNotFoundException | SQLException e) { 43 e.printStackTrace(); 44 } 45 46 47 } 48 49 public List<Customer> getRs() { 50 return rs; 51 } 52 53 public void setRs(List<Customer> rs) { 54 this.rs = rs; 55 } 56 57}

ソースの実行確認までは出来ていないので、バグが有りましたら済みません。
自前の環境で類似のコードを試したら出来ました。ご参考までに。

以下はコメントに関する回答ですが、javaEEにおけるDBアクセス手段にEntityManagerを使用する手法が有ります。この場合、EntityBeanはTable毎に作成が必要となりますが(EntityBeanからTableをCreateするメソッドが有ります)Queryの結果はEntityBeanのListとなりますので、回答の様な変換は必要は無く相性は良いと思います。EntityBeanについて説明サイトは幾つか有りますが、自分は以下書籍で学習しています。

わかりやすいJava EE ウェブシステム入門

投稿2015/02/05 03:53

編集2015/02/05 08:12
BlueMoon

総合スコア1339

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

edarion

2015/02/05 07:56

上記のアドバイスを元に、Listをprimefacesのdatatableへ渡すことで データの表示は成功しました。 ありがとうございます。 最初に使用していたjsfのdatatableのValueには、 ResultSetをそのまま渡して表示できていたため、 JSFベースのリッチUIコンポーネントのprimefacesも 同じ型で渡せるものかと思っていましたが、 そうではなかったということですね。 一般的にこういう処理を行いたい場合は、 SQL文の結果に応じたエンティティクラスを 個別に作っていくものなのでしょうか?
BlueMoon

2015/02/05 08:15

回答に追記しました。
edarion

2015/02/08 23:43

遅くなりましたが、追加の回答ありがとうございました。 紹介いただいた書籍を見て購入しましたが、回答の内容や、 その他の疑問があった部分をかなり理解することができました。
guest

0

本がお役に立ったようで良かったです。私も時折読み直しながら、学習中です。

投稿2015/02/10 00:24

BlueMoon

総合スコア1339

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問