Powered by SmartDoc

Value Binding

「パラメータの受け渡し」について

本章では、パラメータの受け渡し方法について解説します。

例えば図7.1[パラメータの受け渡し]のように、画面1のテキストフィールドに入力したパラメータを、画面2で表示する処理を実現します。

パラメータの受け渡し

JavaBeansとプロパティ

まずは、JavaBeansについておさらいしましょう。

JavaBeansは、「プロパティ」と呼ばれるものをもつJavaクラスです。あるBeanが持つ「属性」を「プロパティ」と考えることができます。例えば、「1冊の本」を示すJavaBeansで、次のような情報をプロパティとして扱うことができます。

Javaのクラスでこうした情報を扱うには、クラス中のフィールドを利用するのが普通でしょう。つまり、クラス中のフィールドが「プロパティ」である、と考えるのが自然です。ところがプロパティは、クラスのフィールドとは関係ありません。

あるJavaBeansにtitleというプロパティがということは、titleというフィールドがあることを意味しません。setTitle()やgetTitle()というメソッドがあることによって、titleというプロパティが存在することになるのです。

つまり、メソッドがあるから、プロパティが存在するということになります。

getTitleというメソッドは、titleというプロパティの値を獲得するメソッドです。このメソッドを"getter"と言います。

public String getTitle() {
	return this.t;
}

また、setTitleというメソッドは、titleというプロパティに値を設定するメソッドです。このメソッドを"setter"と言います。

public void setTitle(String title) {
	this.t = title;
}

setter、getterとプロパティのネーミング・ルールは、次のように整理できます。getterは、"get"で始まる名前を持つメソッドで、setterは、"set"で始まる名前を持つメソッドです。"set","get"の後に続く文字列が、プロパティの名前に対応します。正確には、プロパティ名の先頭の文字を大文字にして、"set"や"get"の文字を加えたものが、setterとgetterになります。

   setter名 = "set" + ( プロパティ名 )'
   getter名 = "get" + ( プロパティ名 )'

逆に言うとプロパティ名は、setter名やgetter名から、先頭の"set"、"get"を取り除いた文字列に対応します。

   プロパティ名 = ( setter名から、先頭の"set"を取り除いたもの )
   プロパティ名 = ( getter名から、先頭の"get"を取り除いたもの )

整理すると、表7.1[プロパティと setter, getter]のようになります。

プロパティと setter, getter
プロパティ名 title
getter名 getTitle
setter名 setTitle

この例のgetTitleメソッドは、"t"というフィールドの値を返し、またsetTitleメソッドでは"t"というフィールドに値を設定しています。しかし、プロパティの名前は"title"なのです。プロパティ名はフィールド名とは関係ないことがわかります。

Managed Bean の作成

HTMLのフォームから入力されたパラメータは、Managed Bean (またはBacking Bean)と呼ばれるJavaBeansに格納されます。このとき、Managed Beanのプロパティでパラメータの情報を管理します。

それでは、Managed Beanのソースを見てみましょう。

ParameterBean.java
public class ParameterBean {

    private String word = "";

    public void setWord(String word) {
        this.word = word;
    }

    public String getWord() {
        return word;
    }
}

setWordやgetWordといったメソッドがあることから、このBeanには、wordというプロパティがあることがわかります。このwordプロパティで、テキストフィールドに入力されたパラメータを管理するのです。

faces-config.xml の設定

Managed Beanを利用するためには、faces-config.xmlに設定を記述する必要があります。

では、faces-config.xmlを見てみましょう。

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>

    <managed-bean>
        <managed-bean-name>ParameterBean</managed-bean-name>
        <managed-bean-class>ParameterBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>

    <navigation-rule>
        <from-view-id>/page1.jsp</from-view-id>
        <navigation-case>
            <from-outcome>success</from-outcome>
            <to-view-id>/page2.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>

</faces-config>

このfaces-config.xmlでは、先ほど解説したnavigation-rule要素のほかに、新たにmanaged-bean要素を追加しています。

managed-bean要素に含まれている各要素について解説しましょう。

    <managed-bean>
        <managed-bean-name>ParameterBean</managed-bean-name>
        <managed-bean-class>ParameterBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>

managed-bean-class要素では、Managed Beanのクラス名を指定しています。

次に、managed-bean-name要素で、このManaged Beanに"ParameterBean"という名前を付けています。

managed-bean-scope要素では、Managed Beanの生存期間を表しています。この要素には、4通りの内容が入ります。

application
そのWebアプリケーションが起動してから終了するまで
session
セッション管理が有効なあいだ
request
(HTTPの)要求から応答まで
none
スコープには属さない

このfaces-config.xmlでは、"session"になっています。

Managed Beanは、managed-bean-scope要素の設定によって自動的にインスタンスが生成されます。JSPのuseBeanタグを使う必要はありません。

JSP と Value Binding

Value Binding

では、画面1のJSPを見てみましょう。

page1.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>
<link href="style.css" type="text/css" rel="stylesheet" />
<title>JSF: パラメータ受け渡しのテスト</title>
</head>
<body>

<h1>JSF: パラメータ受け渡しのテスト</h1>

<f:view>
    <h:form id="searchForm">
        <h:inputText id="word" value="#{ParameterBean.word}" />
        <h:commandButton id="button1" action="success" value="Go!" />
    </h:form>
</f:view>

</body>
</html>

前回解説したように、h:inputTextタグが入力フィールドを表すUIコンポーネントです。このタグに、value属性があり、"#{ParameterBean.word}"という見慣れない記述があります。

h:inputTextタグの#{ParameterBean.word}という記述によって、テキストフィールドに入力された文字列は、ParameterBeanのwordプロパティに格納されます。

こうしたしくみのことを"Value Binding"と言います。

また、"#{……}"という書式を"Value Binding式"と言います。

Value Binding 式

Value Binding式は、次のようなスタイルになります。

#{ Beanの名前 . プロパティ名 }

"Beanの名前"は、先のmanaged-bean-name要素の内容部分となります。

"プロパティ名"は、入力フィールドのパラメータ情報を格納するManaged Beanのプロパティ名となります。

このJSPでは"#{ParameterBean.word}"というValue Binding式が登場しています。"ParameterBean"というJavaBeansのwordプロパティという意味ですね。

h:outputText タグ

次に、画面2となるpage2.jspです。このJSPで、画面1で入力されたパラメータの情報を出力しています。

page2.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>
<link href="style.css" type="text/css" rel="stylesheet" />
<title>JSF: パラメータ受け渡しのテスト</title>
</head>
<body>

<h1>JSF: パラメータ受け渡しのテスト</h1>

<f:view>
    <h:form id="searchForm">
        <h:outputText id="word" value="#{ParameterBean.word}" />
    </h:form>
</f:view>

</body>
</html>

ここで、h:outputTextタグが出てきます。

        <h:outputText id="word" value="#{ParameterBean.word}" />

このh:outputTextタグは、value属性の値を表示するUIコンポーネントです。他のUIコンポーネントと同じく、id属性があります。

また、h:inputTextタグと同様に、value属性があります。ここでもValue Binding式が出てきていますね。ここでは、ParameterBeanのwordプロパティの値が出力されます。

Value Binding とパラメータの受け渡し

では、まとめてみましょう。

画面1のh:inputTextに入力された文字は、Value Binding式によってParameterBeanのwordプロパティに格納されます。

このParameterBeanは、faces-config.xmlの設定によってsessionスコープを持っています。これによって、画面1と画面2でParameterBeanを共有できるようになります。

同じくfaces-config.xmlの設定によって、画面1のボタンを押すと画面2に遷移します。

画面2では、h:outputTextタグのValue Binding式によって、ParameterBeanのwordプロパティの値が出力されます。

このようにして、画面1で入力された文字が画面2で表示されるようになるのです。

図7.2[ManagedBean と JSP]で、ManagedBeanとJSPとの関係についてまとめてみました。

ManagedBean と JSP