本章では、パラメータの受け渡し方法について解説します。
例えば図7.1[パラメータの受け渡し]のように、画面1のテキストフィールドに入力したパラメータを、画面2で表示する処理を実現します。
まずは、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]のようになります。
プロパティ名 | title |
getter名 | getTitle |
setter名 | setTitle |
この例のgetTitleメソッドは、"t"というフィールドの値を返し、またsetTitleメソッドでは"t"というフィールドに値を設定しています。しかし、プロパティの名前は"title"なのです。プロパティ名はフィールド名とは関係ないことがわかります。
HTMLのフォームから入力されたパラメータは、Managed Bean (またはBacking Bean)と呼ばれるJavaBeansに格納されます。このとき、Managed Beanのプロパティでパラメータの情報を管理します。
それでは、Managed Beanのソースを見てみましょう。
public class ParameterBean { private String word = ""; public void setWord(String word) { this.word = word; } public String getWord() { return word; } }
setWordやgetWordといったメソッドがあることから、このBeanには、wordというプロパティがあることがわかります。このwordプロパティで、テキストフィールドに入力されたパラメータを管理するのです。
Managed Beanを利用するためには、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通りの内容が入ります。
このfaces-config.xmlでは、"session"になっています。
Managed Beanは、managed-bean-scope要素の設定によって自動的にインスタンスが生成されます。JSPのuseBeanタグを使う必要はありません。
では、画面1の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式は、次のようなスタイルになります。
#{ Beanの名前 . プロパティ名 }
"Beanの名前"は、先のmanaged-bean-name要素の内容部分となります。
"プロパティ名"は、入力フィールドのパラメータ情報を格納するManaged Beanのプロパティ名となります。
このJSPでは"#{ParameterBean.word}"というValue Binding式が登場しています。"ParameterBean"というJavaBeansのwordプロパティという意味ですね。
次に、画面2となるpage2.jspです。このJSPで、画面1で入力されたパラメータの情報を出力しています。
<%@ 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プロパティの値が出力されます。
では、まとめてみましょう。
画面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との関係についてまとめてみました。