
[ h:dataTableで特定行の情報を取り出す方法 ]
■2005/10/25
Hepon
■環境:JSF1.1
MyFaces1.0.9
WindowsXP
ExadelStudioPro2.5.2
■まず最初に画面写真をみて下さい。

■h:dataTableの、クリックした行の持つ情報を取得して、
h:dataTableで表示していた分と、表示せずに保持していた分の情報を
遷移先の画面で出しています。
何行目がクリックされたか、という情報も表示するようにしています。
これを実現する為には、DataModelというものを使用するようです('∇')
通常h:dataTableにはList(ArrayList)を渡していると思いますが、
Listの代わりにDataModelを渡します。
h:dataTable内のh:commandLinkからbeanのメソッドを動かして、
その中で、DataModelのgetRowData()などのメソッドを使って、
選択した行の情報を取得します。
あとは以下に載せているソースを見ればわかると思います。
■注意:遷移先次画面は、新しいウィンドウに表示するようにしています。
■それでは、ソースをどうぞ(*'-')
★DataTable001Bean.java
package demo;
import java.util.ArrayList;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
/**
* h:dataTable
* @author Hepon
* @param 2005/10/25
*/
public class DataTable001Bean {
//プロパティ
//dataTableで行の情報を取得するにはDataModelを使う必要がある
private DataModel datamodel;
/**
* コンストラクタ
* dataTabelに出すデータを作成
*/
public DataTable001Bean() {
ArrayList testlist = new ArrayList();
datamodel = new ListDataModel();
//リストにDataTable002Beanオブジェクトを入れる
testlist.add(new DataTable002Bean("aaa","bbb","xxx0"));
testlist.add(new DataTable002Bean("ccc","ddd","xxx1"));
testlist.add(new DataTable002Bean("eee","fff","xxx2"));
testlist.add(new DataTable002Bean("ggg","hhh","xxx3"));
//リストをdatamodelにセット
datamodel.setWrappedData((List) testlist);
}
/**
* コマンドリンク押下時処理
* 次画面のbeanを作成して次画面へ遷移させる
* @return String
*/
public String cmlink(){
String str1;
String str2;
String str3;
String str4;
int int1;
//getRowData()でクリックされた行の情報を取得する
DataTable002Bean bean002 = (DataTable002Bean) datamodel.getRowData();
//getRowIndexでクリックされた行の番号を取得する。
int1 = datamodel.getRowIndex();
//最初の行の数字は0なので、1を足して、〜行目、と言えるようにする。
int1++;
//値を準備
str1 = bean002.getColumn001();
str2 = bean002.getColumn002();
str3 = bean002.getColumn003();
str4 = String.valueOf(int1);
//次画面のbeanを作成
DataTable003Bean bean003 = new DataTable003Bean(str1,str2,str3,str4);
//sessionにbeanを乗せる
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("dataTable003Bean", bean003);
//okを返し次画面へ遷移
return "ok";
}
//************************
//*以下、セッターゲッター
//************************
public DataModel getDatamodel() {
return datamodel;
}
public void setDatamodel(DataModel datamodel) {
this.datamodel = datamodel;
}
}
★DataTable002Bean.java
package demo;
/**
* h:dataTable
* @author Hepon
* @param 2005/10/25
*/
public class DataTable002Bean {
//プロパティ
//column001と002をdataTableで表示する
private String column001;
private String column002;
//003は画面に表示しない。隠し情報
private String column003;
/**
* コンストラクタ
* @param str1
* @param str2
*/
public DataTable002Bean(String str1,String str2,String str3){
column001 = str1;
column002 = str2;
column003 = str3;
}
//***********************
//*以下、セッターゲッター
//***********************
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;
}
}
★DataTable003Bean.java
package demo;
/**
* h:dataTable
* @author Hepon
* @param 2005/10/25
*/
public class DataTable003Bean {
//定数定義
private static final String MSG1 = "選択行の情報1:";
private static final String MSG2 = "選択行の情報2:";
private static final String MSG3 = "選択行の情報3:";
private static final String MSG4 = " ←dataTableには表示していなかった分の、保持していた情報";
private static final String MSG5 = "あなたは";
private static final String MSG6 = "行目をクリックしました。";
//プロパティ
private String column001;
private String column002;
private String column003;
private String column004;
/**
* コンストラクタ
*/
public DataTable003Bean(){
//このサンプルでは、このコンストラクタは使用していない
column001 = "テスト1";
column002 = "テスト2";
column003 = "テスト3";
column004 = "テスト4";
}
/**
* コンストラクタ
* @param str1
* @param str2
* @param str3
*/
public DataTable003Bean(String str1,String str2,String str3,String str4){
column001 = MSG1 + str1;
column002 = MSG2 + str2;
column003 = MSG3 + str3 + MSG4;
column004 = MSG5 + str4 + MSG6;
}
//***********************
//*以下、セッターゲッター
//***********************
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 String getColumn004() {
return column004;
}
public void setColumn004(String column004) {
this.column004 = column004;
}
}
★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>
<title>h:dataTableで特定行の情報を取り出す方法</title>
</HEAD>
<body bgcolor="white">
<f:view>
<h:form id="form001">
<!-- ********************* -->
<h3><h:outputText id="text001" value="h:dataTableで特定行の情報を取り出す方法" /></h1>
<h:outputText id="text002" value="2005/10/25/Thu/Hepon" />
<br><br>
</h:form>
<h:form id="form002" target="sub">
<h:dataTable value="#{dataTable001Bean.datamodel}"
var="tlist"
border="1"
bgcolor="#FFCCDD"
cellpadding="3"
cellspacing="3"
width="300">
<h:column>
<f:facet name="header">
<h:outputText value="カラム1" />
</f:facet>
<h:commandLink id="cmlink001" action="#{dataTable001Bean.cmlink}">
<h:outputText id="column001" value="#{tlist.column001}" />
</h:commandLink>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="カラム2" />
</f:facet>
<h:outputText id="column002" value="#{tlist.column002}" />
</h:column>
</h:dataTable>
<!-- ********************* -->
</h:form>
</f:view>
</body>
</HTML>
★result.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>
<title>h:dataTableで特定行の情報を取り出す方法</title>
</HEAD>
<body bgcolor="white">
<f:view>
<h:form id="form001">
<!-- ********************* -->
<h3><h:outputText value="結果画面" /></h1>
<br><br>
<h:outputText id="text001" value="#{dataTable003Bean.column001}" /><br>
<h:outputText id="text002" value="#{dataTable003Bean.column002}" /><br>
<h:outputText id="text003" value="#{dataTable003Bean.column003}" /><br><br>
<h:outputText id="text004" value="#{dataTable003Bean.column004}" />
<!-- ********************* -->
</h:form>
</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>
★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>
<managed-bean>
<managed-bean-name>dataTable003Bean</managed-bean-name>
<managed-bean-class>demo.DataTable003Bean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/pages/dataTable.jsp</from-view-id>
<navigation-case>
<from-outcome>ok</from-outcome>
<to-view-id>/pages/result.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<lifecycle/>
<application>
<locale-config/>
</application>
<factory/>
</faces-config>