jsf-4つのイベント


jsfには、アクションイベント、インスタントイベント、値変更イベント、Phaseイベントの4つのイベントがあります。
以下、説明します。
アクションイベント:
アクションイベントをアクションシーンでモニターする
まず簡単なjsfページコードを見てください。
<h:commandButton value="  " action="#{user.verify}"/>
以上のコードの中では、アクションListenerについては触れていませんが、jsfはそのデフォルトのために予め定義されたアクションListenerを生成しました。
実際のプロセスはこうです。
JSFはまず指定されたactionListenerがあるかどうかチェックしてから、動作方法が指定されているかどうかを確認して、あらかじめ定義されているアクションListenerを生成し、値に応じてページをナビゲーションします。
アクションイベントの3つのトリガー方法:
方法1:動作方法を指定することにより
<h:commandButton value="  " action="#{user.verify}"/>
方法二:アクションリストの属性を指定することにより
<h:commandButton value="  " actionListener="#{user.verify}" action="#{user.outcome}"/>
方法3:<f:actionListener>ラベルでコンポーネントにイベントを登録する
•LogHandler.java
package onlyfun.caterpillar;
import javax.faces.event.ActionListener;
....
public class LogHandler implements ActionListener {
public void processAction(ActionEvent e) {
//   Log
}
}
•VerifyHandler.java
package onlyfun.caterpillar;
import javax.faces.event.ActionListener;
....
public class VerifyHandler implements ActionListener {
public void processAction(ActionEvent e) {
//     
}
}

<h:commandButton value="  " action="#{user.outcome}">
<f:actionListener type="onlyfun.caterpillar.LogHandler"/>
<f:actionListener type="onlyfun.caterpillar.VerifyHandler"/>
</h:commandButton>
即時イベント:
インスタントイベント(Immediate Events)とは、JSFビューコンポーネントが取得要求において取得すべき値を取得した後、直ちに指定されたイベントを処理し、その後の変換器処理、検証処理、モデル値更新などの流れを行わないことを意味する。
JSFのイベントモデルにはいわゆるインスタントイベントがあるのは、Webアプリケーションの先天的な特性がGUIプログラムとは異なるため、JSFのイベント方式はGUIプログラムのイベント方式とはかなり違っています。基本的な問題はHTTPの無状態の特徴だけに、ウェブアプリケーションが生まれつきサーバ端の特定のオブジェクトを直接呼び起こすことができなくなります。
すべてのオブジェクトの呼び出しはサーバー側で行います。どのオブジェクトを喚起するべきかは基本的な流れに従います。
再構築ビュー(Rester View)
クライアントから送られてきたsessionデータまたはサーバ端のsessionデータに基づいて、JSFビューコンポーネントを再構築します。
スリーブ要求値(Apple Request Values)
JSFビューコンポーネントはそれぞれ、古い値と新しい値を含む要求中の自分の値を取得する。
実行検証(Process Validations)
オブジェクトに変換して検証します。
モデル値の更新(Update Model Values)
ビーンまたは関連モデル値を更新します。
アプリケーションの起動(Invoke Application)
アプリケーション関連ロジックを実行します。
レスポンスページを描画します。
前の要求を処理した後、クライアントの実行結果に反応するページが生成される。
アクションイベントについては、コンポーネントの動作イベントは、スリーブ要求値段階でアクションイベントのオブジェクトを生成しますが、関連イベントの処理はすぐに行われるのではなく、アクションイベントは、先にキューに入れられます。その後、検証、更新方式の値段階を経て、キュー内のイベントを処理しなければなりません。
このような流れは、ボタンを押して後端を実行するアプリケーションにとっては問題ではないが、イベントによっては、例えばページに影響を与えるイベントだけが必要ではない。
例えば、フォームには使用者名、パスワードなどの欄があり、地域オプションボタンを提供しています。使用者は名前、パスワードを記入しないで地域オプションボタンを押してもいいです。正常な流れに沿って検証、更新、アプリケーションを喚起するなどの流れがありますが、明らかに、使用者の名前とパスワードが空白です。これは不必要なエラーを引き起こします。
コンポーネントのイベントをセットして要求値を要求した直後に処理し、その後の段階をスキップして直接ページ描画を行います。JSFのinputとcommandコンポーネントにはimmediate属性が設定できます。trueに設定すれば、指定されたイベントは即時イベントになります。
一例は以下の通りです。
•index.jsp
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@page contentType="text/html;charset=UTF8"%>
<f:view locale="#{user.locale}">
<f:loadBundle basename="messages" var="msgs"/>
<html>
<head>
<title><h:outputText value="#{msgs.titleText}"/></title>
</head>
<body>
<h:form>
<h3><h:outputText value="#{msgs.hintText}"/></h3>
<h:outputText value="#{msgs.nameText}"/>:
<h:inputText value="#{user.name}"/><p>
<h:outputText value="#{msgs.passText}"/>:
<h:inputSecret value="#{user.password}"/><p>
<h:commandButton value="#{msgs.commandText}"
action="#{user.verify}"/>
<h:commandButton value="#{msgs.Text}"
immediate="true"
actionListener="#{user.changeLocale}"/>
</h:form>
</body>
</html>
</f:view>
これは使用者に語族の使用を決定させるモデルで、最後のcommandButtonコンポーネントはimmediate属性を設定されています。このボタンを押すと、JSFパッケージの要求値は直ちに指定されたactionListenerを処理します。検証、モデル値を更新しないので、入力欄とパスワード欄に記入された値に注意してください。あなたのuser.nameとuser.passwordに影響しません。
値変更イベント
使用者がJSF入力コンポーネントの値を変更してフォームを提出すると、値変更イベントが発生します。これはjavax.faces.event.Value Change Eventオブジェクトをなくします。このイベントを処理するなら、2つの方法があります。
方法1は、JSF入力コンポーネントのvalueChange Listener属性を直接設定する。例えば、
<h:selectOneMenu value="#{user.locale}"
onchange="this.form.submit();"
valueChangeListener="#{user.changeLocale}">
<f:selectItem itemValue="zh_CN" itemLabel="Chinese"/>
<f:selectItem itemValue="en" itemLabel="English"/>
</h:selectOneMenu>
ここでGUIの中から選択項目をシミュレーションするために、直ちに反応が発生します。私たちはオンチャン属性の中でJavaScriptを使っています。オプション項目が変更された後、直ちにフォームを提出します。提出ボタンを押さないでください。
方法2は、javax.faces.event.Value Chane Listenerインターフェースを実現し、そのprocessValue Change()方法を定義する。例えば、
•SomeListener.java
package onlyfun.caterpillar;
....
public class SomeListener implements ValueChangeListener {
public void processValueChange(ValueChangeEvent event) {
....
}
....
}
その後、JSFページでタグを使用し、そのtype属性を設定します。例えば、
<h:selectOneMenu value="#{user.locale}"
onchange="this.form.submit();">
<f:valueChangeListener
type="onlyfun.caterpillar.SomeListener"/>
<f:selectItem itemValue="zh_CN" itemLabel="Chinese"/>
<f:selectItem itemValue="en" itemLabel="English"/>
</h:selectOneMenu>
Phase事件
インスタントイベントでは、JSFの要求は反応を実行し、完全なプロセスは6段階を通過すると述べた。
各段階の前後でjavax.faces.event.Phase Eventを誘発します。このイベントを各段階の前後で捉えてみたいなら、いくつかの処理をすれば、javax.faces.event.Phase Listenerを実現し、javax.faces.lifecycle.LifecycleにこのListenerを登録して、適切なイベントが発生した時にイベントを通知します。
PhaseListenerには3つの実現しなければならない方法get PhaseId()、beforePhease()とafterPhease()があり、ここでget PhaseId()は一つのPhaseIdオブジェクトに転送され、Listenerが通知されたいタイミングを表し、設定できるタイミングがあります。
PhaseId.RESTORE_VIEW
PhaseId.APPLY_REQUST_VALES
PhaseId.PROCESS_ValDATIONS
PhaseId.UPDATE_MODEL_VALES
PhaseId.INVOKE_APPLICATION
PhaseId.RENDER_RESPOSE
PhaseId.ANY_PHASE
そのうちPhaseId.ANY_PHASEとは、どの段階でも切り替えた時に、通知します。beforePhease()とafterPhease()において、作成段階の前後にそれぞれ処理したい動作を作成できます。例えば、以下のような簡単なクラスは各段階の名前を挙げます。
•Show Phouse Listener.java
package onlyfun.caterpillar;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
public class ShowPhaseListener implements PhaseListener {
public void beforePhase(PhaseEvent event) {
String phaseName = event.getPhaseId().toString();
System.out.println("Before " + phaseName);
}
public void afterPhase(PhaseEvent event) {
String phaseName = event.getPhaseId().toString();
System.out.println("After " + phaseName);
}
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
}
Phase Listenerを作成したら、faces-config.xmlにLifecycleに登録できます。
•faces-config.xml

<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
"http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
<faces-config>
<lifecycle>
<phase-listener>
onlyfun.caterpillar.ShowPhaseListener
</phase-listener>
</lifecycle>
......
</faces-config>