JSFによるWebアプリケーション開発 第7回 Action Method の実装 JSFによるWebアプリケーション開発 第7回
ここでの内容 JSFでの Action Method の実装方法について学ぶ。
やりたいこと 画面1で名前を入力する 画面1のボタンを押すと、画面2に遷移する。 画面2では、画面1で入力された名前と、現在の時刻を表示する。
何をすればよいのか ボタンが押されたときに、「現在の時刻を取得する」という「ビジネスロジック」を実行する。 こうしたビジネスロジックを「Action Method」と言う。 Action Method は、Managed Bean に記述する。
currentTime という Action Method (1) public class ParameterBean { public String currentTime() { Date d = new Date(); DateFormat df = DateFormat.getDateTimeInstance(); ...... sb.append(df.format(d)); return "success"; }
currentTime という Action Method (2) 現在の日時を取得して、入力フィールドのパラメータと組み合わせている。 返値として “success” という文字列を返す。
page1.jsp <h:form id="searchForm"> <h:inputText id="word" value="#{ParameterBean.word}" /> <h:commandButton id="button1" action="#{ParameterBean.currentTime}" value="Go!" /> </h:form>
action 属性の比較 前章 <h:commandButton id="button1" action="success" value="Go!" /> 本章 action="#{ParameterBean.currentTime}" value="Go!" />
#{ParameterBean.currentTime} こうしたしくみのことを “Method Binding” と言う。 こうした #{……} という書式を “Method Binding 式” と言う。
Method Binding 式 #{ Beanの名前 . Action Method名 } “Beanの名前” は、 先の managed-bean-name 要素の内容部分 “Action Method名” は、ボタンが押されたときに実行される Action Method 名
Action Method のルール public であること 引数がないこと String を返値とすること この返値が outcome になる。
Action Method の返値と outcome (1) この outcome が、h:commandButton 要素の action 属性の値となる。 この値と、faces-config.xml の設定情報により遷移先が決まる。
Action Method の返値と outcome (2) <h:commandButton id="button1" action="#{ParameterBean.currentTime}" value="Go!" /> ↓(Action Method を実行) ↓ action=“success” value="Go!" />
図書検索プログラムの作成 (1)
プログラムの概要 (1) 検索語を入力すると、その検索語を含む本のデータのリストを出力する。 図書データはデータベースに格納されている。
プログラムの概要 (2) 入力フィールドに検索語を入れ、ボタンを押すと、Action Method が呼ばれる。 次の画面で、検索結果を出力する。
プログラムの概要 (3) 検索結果
検索語入力画面 <h:form id="searchForm"> <h:inputText id="searchWord" value="#{BookSearcher.word}" /> <h:commandButton id="submit" action="#{BookSearcher.searchBooks}" value="Go!" /> </h:form>
Managed Bean (1) プロパティ public class BookSearcher { ...... public void setWord(String word) { this.word = word; } public String getWord() { return word;
Managed Bean (2) Action Method public String searchBooks() { searchBooks(word); return "success"; } private void searchBooks(String word) { // データベースの検索処理
Managed Bean (3) Model の処理 (1) 検索結果には、複数の図書データが含まれる。 BookData という JavaBeans を用意 1冊の図書データは、1つの BookData に格納される。 java.util.List を使って、複数の BookData をまとめておく。
Managed Bean (3) Model の処理 (2) List list = new ArrayList(); BookData book = new BookData(); book.setId(rs.getString("id")); book.setTitle(rs.getString("title")); book.setAuthor(rs.getString("author")); list.add(book);
検索結果の出力画面 <h:dataTable id="table" border="1" value="#{BookSearcher.bookList}“ var="book"> <h:column> <f:facet name="header"> <h:outputText value="タイトル"/> </f:facet> <h:outputText id="bookTitle“ value="#{book.title}"/> </h:column> ...... </h:dataTable>
h:dataTable 要素 (1) コレクション (List, 配列など) のデータを表にして表示するUIコンポーネント id 属性がある。 border 属性は、表の罫線の太さの指定 <h:dataTable id="table" border="1" value="#{BookSearcher.bookList}“ var="book"> </h:dataTable>
h:dataTable 要素 (2) value 属性で、表示するコレクション型のプロパティを指定する。Value Binding 式を使う。 var 属性は、コレクション中の1つの要素を表す変数名となる。 <h:dataTable id="table" border="1" value="#{BookSearcher.bookList}“ var="book"> </h:dataTable>
h:dataTable 要素 (3) この例では、value 属性は List 型である bookList プロパティを指定している。 bookList には、複数の BookData が格納されている。 従って、var 属性で指定された book という変数名は、BookData Bean を指している。 <h:dataTable id="table" border="1" value="#{BookSearcher.bookList}“ var="book"> </h:dataTable>
h:column 要素 (1) <h:dataTable ……> <h:column> <f:facet name="header"> <h:outputText value="タイトル"/> </f:facet> <h:outputText id="bookTitle“ value="#{book.title}"/> </h:column>
h:column 要素 (2) h:dataTable 要素の1列分のデータを表す UIコンポーネント
f:facet 要素 表の1列のヘッダやフッタを表す UIコンポーネント <h:column> <f:facet name="header"> <h:outputText value="タイトル"/> </f:facet> …… </h:column>
データの出力 この列では、book という変数 (= BookData Bean) の title プロパティの値を出力する。 <h:column> …… <h:outputText id="bookTitle“ value="#{book.title}"/> </h:column>
h:dataTable の働き (1) 表の1行分が、h:dataTable の var 属性の値に対応 つまり、コレクション中の1つの JavaBeans が、表の1行分となる。 この例では、List 中の1つの BookData が、表の1行分となる。
h:dataTable の働き (2) BookData Bean のどのプロパティを出力するかは、column 要素によって決まる。