JSFのサンプルアプリ作成
サンプルアプリの概要
「金額を入力し、入力した金額に応じて返す画面を切り替えるJSFサンプルアプリです。」
[開発環境]
- JDK1.5.0_13
- eclipse3.2
- Tomcat5.5.25
- JSF1.1(JSF1.2(JSP2.1準拠)にTomcat5.5が対応していないと思われるので、JSF1.1を使用)
[用意するもの]
- WEB-INF/judge.jsp(初期表示画面:金額を入力)
- WEB-INF/rank/poor.jsp(金額が低いときに返す画面)
- WEB-INF/rank/middle.jsp(金額が普通のときに返す画面)
- WEB-INF/rank/rich.jsp(金額が高いときに返す画面)
- WEB-INF/classes/sample/Bank.class(バッキングビーン)
[処理の流れ]
http://localhost:8080/JsfSample1/samplefaces/judge.jspにアクセス。
1.judge.jspで金額を入力し、「資産審査をする」ボタンを押下します。
↓
2.web.xmlの設定によりJSFサーブレットが呼び出されます。
↓
3.JSFサーブレットがその金額(リクエストの値)を受け取り、judge.jspに対応するコンポーネントツリーを構築します。
↓
4.コンポーネントツリーはバッキングビーンと呼ばれるビーンと対応しているので、そのビーンにユーザが入力した金額がセットされます。
↓
5.バッキングビーンのjudgeメソッドが呼び出され、金額に応じた判定がなされます。
↓
6.judgeメソッドは戻り値として"upper"、もしくは"middle"、もしくは"low"を返します。
↓
7.faces-config.xmlが上記戻り値"upper"、"middle"、"low"に基づいて返す画面(jsp)を決定します。
↓
8.レスポンス
judge.jsp
<%@ page language="java" contentType="text/html; charset=windows-31j" pageEncoding="windows-31j"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-31j"> <title>JSF judge page</title> スタイルシートの定義は省略 </head> <body> <span>資産査定</span> <f:view> <h:form> <div class="next"> 銀行による資産審査です。<br /> 手持ちの全財産を入力してください<br /> <h:inputText id="inputMoney" value="#{MoneyBank.money}"> <f:validateLongRange maximum="3000"/> </h:inputText> <h:commandButton value="資産審査する" action="#{MoneyBank.judge}"/> <p><span>ご不明点があればこちらまで(イベントドリブン実験用)</span> ★ここでバッキングビーンのjudgeメソッドを指定<h:commandButton action="#{MoneyBank.judge}" value="help" actionListener="#{BankEventHandler.helpCalled}" /></p> </div> <h:message for="inputMoney" styleClass="alerting"/> </h:form> </f:view> </body> </html>
rich.jsp middle.jspもpoor.jspも構造は同じ。文面だけを変える。
<%@ page language="java" contentType="text/html; charset=windows-31j" pageEncoding="windows-31j"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-31j"> <title>JSF recipent page</title> CSS定義は省略 </head> <body> <span>富裕層窓口</span> <div class="next"> <f:view> <h:form> 富裕層向け窓口です。 あなたの資産は<h:outputText id="output" value="#{MoneyBank.money}" />円です。 <h:commandButton value="Back" action="success" /> </h:form> </f:view> </div> </body> </html>
sample.Bank.class(バッキングビーン)
package sample; public class Bank implements Serializable { private int money = 0; public void setMoney(int money) { this.money = money; } public int getMoney() { return this.money; } /** * jspとのメソッドバインディングで呼び出されるメソッド * * [規約] * 引数なし、戻り値はString型 * * 金額の多寡によりランクを審査する */ public String judge() { if (this.money >= 1000) { System.out.println("[Bankクラス判定]upperクラス"); return "upper"; } else if (this.money >= 500) { System.out.println("[Bankクラス判定]middleクラス"); return "middle"; } else { System.out.println("[Bankクラス判定]lowクラス"); return "low"; } } }
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> <!-- routing --> <navigation-rule> <from-view-id>/judge.jsp</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/rank/rich.jsp</to-view-id> </navigation-case> ★金額によって遷移先jspを決定。基準値は"upper"もしくは"middle"もしくは"low" <navigation-case> <from-action>#{MoneyBank.judge}</from-action> <from-outcome>upper</from-outcome> <to-view-id>/rank/rich.jsp</to-view-id> </navigation-case> <navigation-case> <from-action>#{MoneyBank.judge}</from-action> <from-outcome>middle</from-outcome> <to-view-id>/rank/middle.jsp</to-view-id> </navigation-case> <navigation-case> <from-action>#{MoneyBank.judge}</from-action> <from-outcome>low</from-outcome> <to-view-id>/rank/poor.jsp</to-view-id> </navigation-case> </navigation-rule> ★バッキングビーンの指定 <managed-bean> <managed-bean-name>MoneyBank</managed-bean-name> <managed-bean-class>sample.Bank</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> <!-- Event Handler --> ★イベントドリブンの設定 <managed-bean> <managed-bean-name>BankEventHandler</managed-bean-name> <managed-bean-class>event.listener.BankListener</managed-bean-class>★イベントを受け取るリスナクラス <managed-bean-scope>session</managed-bean-scope> </managed-bean> </faces-config>
web.xml
<!-- Faces Servlet --> <servlet> <servlet-name>FacesServlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup> 1 </load-on-startup> </servlet> <!-- Faces Servlet Mapping --> <servlet-mapping> <servlet-name>FacesServlet</servlet-name> ★例えばjudge.jspにアクセスする場合なら、URLはhttp://localhost:8080/JsfSample1/samplefaces/judge.jspになります。 "samplefaces"を間に必ず挟んでください。 <url-pattern>/samplefaces/*</url-pattern> </servlet-mapping>