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>