JSF:JDBC問合せからの表形式結果表示

 JSFでは、データベースに問い合わせた結果集合から、 HTMLのTABLEタグを使った表形式の結果を表示することが簡単にできます。 JDBCでデータベースへ問合せを行う処理はコーディングが必要ですが、 結果表示はほぼプログラミング不要で行えます。

 以下の例は、SHITENと名づけられたテーブルの全件を検索して、 表形式に出力しています。

●shiten11.jsp
ボタンがあるだけのフォームです。 余談ですがJSFでは、Beanに持たせるべきプロパティ要素が全くないフォームの場合、 StrutsでいうアクションフォームBeanのようなものを定義する必要はありません。 ここではボタンが押された後の遷移先を決定するために、Backing Beanをaction属性に使っています。

<%@ page contentType="text/html;charset=Windows-31J" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<html>
<body>
<f:view>
支店コード表の全件を検索します。
<h:form>
  <h:commandButton value="検索" action="#{Shiten1.action}"/>
</h:form>
</f:view>
</body>
</html>


●shiten12.jsp
結果を表示するページです。

<%@ page contentType="text/html;charset=Windows-31J" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<html>
<head>
<style type="text/css">
.tr1 {background-color:#cccccc}
.col {background-color:#ffeeee}
</style>
</head>

<body>
<f:view>
<h:dataTable
   id="table1" headerClass="tr1" columnClasses="col,col,col,col,col"
   border="1" var="e" value="#{Shiten1.data}">

  <h:column>
    <f:facet name="header"><h:outputText value="支店コード"/></f:facet>
    <h:outputText id="id1" value="#{e.shiten_code}"/>
  </h:column>
  <h:column>
    <f:facet name="header"><h:outputText value="支店名"/></f:facet>
    <h:outputText id="id2" value="#{e.shiten_name}"/>
  </h:column>
  <h:column>
    <f:facet name="header"><h:outputText value="地域"/></f:facet>
    <h:outputText id="id3" value="#{e.area_code}"/>
  </h:column>
  <h:column>
    <f:facet name="header"><h:outputText value="所在地"/></f:facet>
    <h:outputText id="id4" value="#{e.address}"/>
  </h:column>
  <h:column>
    <f:facet name="header"><h:outputText value="従業員数"/></f:facet>
    <h:outputText id="id5" value="#{e.employee_num}"/>
  </h:column>
</h:dataTable>

</f:view>
</body>
</html>

<h:outputText id="id1" value="#{e.shiten_code}"/>

のshiten_codeというのは、ResultSetオブジェクトが内部的に(ResultSetMetaDataとして) 持っている、結果集合の列名を指定しているものです。 RDBMSでは一般に、データベース・オブジェクト名や列名大文字・小文字を区別しないため、 "shitenCode"のようにJavaのプロパティと同様の命名法は一般的ではありません。 半角下線を使っていたら、その通りに指定します。
●ShitenBean1.java
action()メソッドで、データベース問合せを行い、結果をResultSetで保持するBeanです。

/*
 * Created on 2004/11/05
 */
package jsfcl01.beans;

import java.io.Serializable;
import java.sql.*;

/**
 * 支店コード表の全件を検索するサンプルです。
 */
public class ShitenBean1 implements Serializable {
    private ResultSet resultSet;

    public String action() throws SQLException {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch(ClassNotFoundException ex){
            throw new SQLException("JDBC Driver Class cannot be loaded: " + ex.toString());
        }
        Connection conn  = DriverManager
                .getConnection(
                        "jdbc:mysql:///udb?useUnicode=true&characterEncoding=SJIS",
                        "urano", "urano398");
        String sql = "SELECT * FROM SHITEN ORDER BY SHITEN_CODE";
        PreparedStatement st = conn.prepareStatement(sql);
        resultSet = st.executeQuery();
        return "success";
    }

    public ResultSet getData() {
        return resultSet;
    }
}

faces-config.xmlです。

<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC
  "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
  "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">

<faces-config>
  <navigation-rule>
    <from-view-id>/shiten/shiten11.jsp</from-view-id>
    <navigation-case>
      <from-outcome>success</from-outcome>
      <to-view-id>/shiten/shiten12.jsp</to-view-id>
    </navigation-case>
  </navigation-rule>
  <managed-bean>
    <managed-bean-name>Shiten1</managed-bean-name>
    <managed-bean-class>jsfcl01.beans.ShitenBean1</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
  </managed-bean>
</faces-config>

 なお、上記の例ではjava.sql.ResultSetオブジェクトを h:dataTableタグのvalue属性に指定して表形式の表示を行いましたが、 ResultSetでなくとも、2次元の表形式のデータを保持できるオブジェクトであれば、 value属性に指定できます。 例えばリスト(java.util.List)のリスト、文字列の配列(String[])の配列や、 リストの配列、配列のリストでもOKです。 それらの場合は、上の例で

<h:outputText id="id4" value="#{e.address}"/>

のようになっているところを、

<h:outputText id="id4" value="#{e[3]}"/>

のように、配列要素(またはリスト要素)のインデックスで指定します。 私のように、JDBCをラップしたライブラリで、結果集合をこのような配列に一旦格納する人にもありがたい仕様ですね。

Server Side Java Index Top

(first uploaded 2004/11/07 last updated 2004/11/07, URANO398)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル