[ 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>