
[ h:dataTableで1件のデータを複数行で描画するサンプル(その1) ]
■2005/9/1
Hepon
■環境:JSF1.1
■h:dataTableで1件のデータを複数行で描画するサンプルは、
2種類あります。
dataTableのcolumn内にdataTableを入れる(ネストする)方法と、
入れないで実現する方法、のふたつです。
まずはdataTableを入れる(ネストする)方法から。
h:dataTableでデータを表示する際、h:dataTableを普通に使うと、
下図のように1件のデータは1行で表示されます。

「文字で出力」というカラムの「aaa」が1行目のデータの1つめの要素で、
2つ目の要素はその右の「eee」ですね。
このように、1件のデータは1行で表示されます。
そして、columnの中にはJSFのタグ以外のものは一切置くことができません。
<br>といったHTMLタグをはじめとして、普通のテキストすら置けません。
というか、置いても完全に無視されます。
よってcolumnの中で改行して2行にする、といったことができません。
さて、こうした状況の中で、1件のデータで20個の要素を表示したいとします。
となると、困ってしまうわけです。
普通に横並びに20個カラムを並べていくと、
とんでもなく横長なひどい画面の出来上がりです。
しかしh:dataTableには1件のデータを2行で表示したりするような機能はありません。
それでも1件のデータを2行で表現したいわけです。
そこでそれを可能にするために工夫してみました。
まずは以下の完成後の図を見て下さい。

何をしているか、何となくわかりますでしょうか?
まず、ヘッダ部分は普通のHTMLです。
ヘッダの下の本体部分がh:dataTableです。
そして、h:dataTableではcolumnは3つしか使っていません。
左のチェックボックスの部分で1つ。
上段、下段1、下段2、下段3の部分で1つ。
右の備考欄の部分で1つ。
3つのcolumnの内、中央のcolumnの中が、2行になっています。
columnの中にはJSFのタグしか置けない、ということは、
JSFのh:dataTableなら置けるのではないか、ということで
h:dataTableを2つ設置してみた所、なんとh:dataTableをネストすることができました。
内側のh:dataTableでは1件しかデータの入っていないダミーのリストを使って
1回まわして1行分だけ作成して、そこのcolumnで外側のh:dataTableのデータを
表示させている、といった部分が若干ややこしいですが、
後は特に説明せずともソースを見てもらえればわかるかと思います。
以下のソースを見て下さい。
<!-- ↓ふたつめのテーブルのヘッダ部分 -->
<table width="700" bgcolor="#FFFFFF" border="0" cellpadding="1" cellspacing="3">
<thead>
<tr bgcolor="#FFCCDD">
<th colspan="5">1件のデータに対して、データを複数行で表現するテスト</th>
</tr>
<tr bgcolor="#FFCCDD">
<th rowspan="2" width="18"> </th>
<th colspan="3">上段</th>
<th rowspan="2" width="300">備考欄</th>
</tr>
<tr bgcolor="#FFCCDD">
<th width="74">下段1</th>
<th width="74">下段2</th>
<th width="74">下段3</th>
</tr>
</thead>
<tbody>
<tr><td></td></tr>
</tbody>
</table>
<!-- ↓ふたつめのテーブル -->
<h:dataTable value="#{dataTable001Bean.testlist}" var="ttlist" border="1" bgcolor="#FFCCDD" cellpadding="0" cellspacing="0" rowClasses="table_odd,table_even">
<h:column>
<h:selectBooleanCheckbox id="column004" value="#{ttlist.column004}" />
</h:column>
<h:column>
<h:dataTable value="#{dataTable001Bean.dummylist}" var="tttlist" border="1" bgcolor="#FFCCDD" cellpadding="0" cellspacing="0">
<h:column>
<h:inputText id="colmun006" value="#{ttlist.column006}" size="55" maxlength="12" />
</h:column>
</h:dataTable>
<h:dataTable value="#{dataTable001Bean.dummylist}" var="ttttlist" border="1" bgcolor="#FFCCDD" cellpadding="0" cellspacing="0">
<h:column>
<h:inputText id="colmun001x" value="#{ttlist.column001}" readonly="true" styleClass="readonly" size="16" style="text-align:right" />
</h:column>
<h:column>
<h:inputText id="colmun002x" value="#{ttlist.column002}" size="16" maxlength="12" style="text-align:right" />
</h:column>
<h:column>
<h:inputText id="colmun003x" value="#{ttlist.column003}" size="16" maxlength="12" style="text-align:right" />
</h:column>
</h:dataTable>
</h:column>
<h:column>
<h:inputText id="colmun005" value="#{ttlist.column005}" size="72" maxlength="12" />
</h:column>
</h:dataTable>
以下、全てのソースです。
★DataTable001Bean.java
package demo;
import java.util.ArrayList;
/**
* Created by Exadel Studio
*
*
*/
public class DataTable001Bean {
private ArrayList testlist;
private ArrayList dummylist;
public DataTable001Bean() {
testlist = new ArrayList();
testlist.add(new DataTable002Bean("aaa","eee",false));
testlist.add(new DataTable002Bean("bbb","fff",true));
testlist.add(new DataTable002Bean("ccc","ggg",false));
testlist.add(new DataTable002Bean("ddd","hhh",true));
dummylist = new ArrayList();
dummylist.add(new DataTable002Bean("zzz","aaa",false));
}
public ArrayList getTestlist() {
return testlist;
}
public void setTestlist(ArrayList testlist) {
this.testlist = testlist;
}
public ArrayList getDummylist() {
return dummylist;
}
public void setDummylist(ArrayList dummy) {
this.dummylist = dummy;
}
}
★DataTable001Bean.java
package demo;
public class DataTable002Bean {
private String column001;
private String column002;
private String column003;
private boolean column004;
private String column005;
private String column006;
public DataTable002Bean(String str1,String str2,boolean boo){
column001 = str1;
column002 = str2;
column003 = str1;
column004 = boo;
column005 = "←上段と下段で1つづつ、あわせて2つのdataTableを使用している。";
column006 = "上段でひとつのdataTableを使用している。";
}
public String getColumn001() {
return column001;
}
public void setColumn001(String column001) {
this.column001 = column001;
}
public String getColumn002() {
return column002;
}
public void setColumn002(String column002) {
this.column002 = column002;
}
public String getColumn003() {
return column003;
}
public void setColumn003(String column003) {
this.column003 = column003;
}
public boolean isColumn004() {
return column004;
}
public void setColumn004(boolean column004) {
this.column004 = column004;
}
public String getColumn005() {
return column005;
}
public void setColumn005(String column005) {
this.column005 = column005;
}
public String getColumn006() {
return column006;
}
public void setColumn006(String column006) {
this.column006 = column006;
}
}
★dataTable.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>
<!-- CSS -->
<link rel="StyleSheet" href="css/contract.css" type="text/css" />
<title>h:dataTable サンプル</title>
</HEAD>
<body bgcolor="white">
<!-- ↓全てのJSFはこのタグの中に -->
<f:view>
<!-- ********************* -->
<h1><h:outputText value="h:dataTable サンプル"/></h1>
<h:outputText value="2005/8/25/Thu/Hepon"/>
<br><br>
<!-- ********************* -->
<!-- ↓ひとつめのテーブル -->
<h:dataTable value="#{dataTable001Bean.testlist}" var="tlist" border="1" bgcolor="#FFCCDD" cellpadding="3" cellspacing="3" width="700">
<f:facet name="header">
<h:outputText value="ヘッダ表示テスト" />
</f:facet>
<h:column>
<f:facet name="header">
<h:outputText value="文字で出力" />
</f:facet>
<h:outputText id="colmun001" value="#{tlist.column001}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="inputの入力可能タイプ" />
</f:facet>
<h:inputText id="colmun002" value="#{tlist.column002}" size="7" maxlength="6" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="inputの入力不可タイプ/右寄せ" />
</f:facet>
<h:inputText id="colmun003" value="#{tlist.column003}" size="7" readonly="true" maxlength="6" style="text-align:right" />
</h:column>
<f:facet name="footer">
<h:outputText value="フッタ表示テスト" />
</f:facet>
</h:dataTable>
<!-- ********************* -->
<br><br>
<!-- ↓ふたつめのテーブルのヘッダ部分 -->
<table width="700" bgcolor="#FFFFFF" border="0" cellpadding="1" cellspacing="3">
<thead>
<tr bgcolor="#FFCCDD">
<th colspan="5">1件のデータに対して、データを複数行で表現するテスト</th>
</tr>
<tr bgcolor="#FFCCDD">
<th rowspan="2" width="18"> </th>
<th colspan="3">上段</th>
<th rowspan="2" width="300">備考欄</th>
</tr>
<tr bgcolor="#FFCCDD">
<th width="74">下段1</th>
<th width="74">下段2</th>
<th width="74">下段3</th>
</tr>
</thead>
<tbody>
<tr><td></td></tr>
</tbody>
</table>
<!-- ↓ふたつめのテーブル -->
<h:dataTable value="#{dataTable001Bean.testlist}" var="ttlist" border="1" bgcolor="#FFCCDD" cellpadding="0" cellspacing="0" rowClasses="table_odd,table_even">
<h:column>
<h:selectBooleanCheckbox id="column004" value="#{ttlist.column004}" />
</h:column>
<h:column>
<h:dataTable value="#{dataTable001Bean.dummylist}" var="tttlist" border="1" bgcolor="#FFCCDD" cellpadding="0" cellspacing="0">
<h:column>
<h:inputText id="colmun006" value="#{ttlist.column006}" size="55" maxlength="12" />
</h:column>
</h:dataTable>
<h:dataTable value="#{dataTable001Bean.dummylist}" var="ttttlist" border="1" bgcolor="#FFCCDD" cellpadding="0" cellspacing="0">
<h:column>
<h:inputText id="colmun001x" value="#{ttlist.column001}" readonly="true" styleClass="readonly" size="16" style="text-align:right" />
</h:column>
<h:column>
<h:inputText id="colmun002x" value="#{ttlist.column002}" size="16" maxlength="12" style="text-align:right" />
</h:column>
<h:column>
<h:inputText id="colmun003x" value="#{ttlist.column003}" size="16" maxlength="12" style="text-align:right" />
</h:column>
</h:dataTable>
</h:column>
<h:column>
<h:inputText id="colmun005" value="#{ttlist.column005}" size="72" maxlength="12" />
</h:column>
</h:dataTable>
<!-- ********************* -->
</f:view>
</body>
</HTML>
★index.jsp
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
</head>
<body>
<jsp:forward page="/pages/dataTable.jsf" />
</body>
</html>
★web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>htc002</display-name>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/faces-config.xml</param-value>
</context-param>
<listener>
<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
</web-app>
★faces-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!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>
<managed-bean>
<managed-bean-name>dataTable001Bean</managed-bean-name>
<managed-bean-class>demo.DataTable001Bean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<lifecycle/>
<application>
<locale-config/>
</application>
<factory/>
</faces-config>
★contract.css
.readonly
{
border:1pt solid #888888;
background-color:#B0B0B0;
color:#000000;
font-size:10pt;
width:auto;
}
tr.table_odd
{
background-color:transparent;
}
tr.table_even
{
background-color:#ffffbb;
}