読者です 読者をやめる 読者になる 読者になる

Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

RenderResponseとpreRenderView

JSF PhaseListener

保守案件(C#2.0)の改造話が出てきて落ち着かない今日この頃。JavaEE、いつまで触れるかな…。

……

今日はアクセス権限周りの実装準備のため、PhaseListener周りを色々お試し実装してました。
で、ふと、先日知ったpreRenderViewを思い出し、どういう関係なのか気になりました。
どっちが先なの?みたいな。

とりあえず試した実装です。

PhaseListenerは

package jp.co.hoge.phaselistner;

import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

public class ConfirmPhaseListener implements PhaseListener{

    @Override
    public void afterPhase(PhaseEvent event) {
        System.out.println("afterPhaseが呼ばれたお:" + getPhaseId().toString());
    }

    @Override
    public void beforePhase(PhaseEvent event) {
        System.out.println("beforePhaseが呼ばれたお:" + getPhaseId().toString());
    }

    @Override
    public PhaseId getPhaseId() {
        //return PhaseId.ANY_PHASE;
        return PhaseId.RENDER_RESPONSE;
    }    
}

として、faces-config.xml

<lifecycle>
    <phase-listener>jp.co.hoge.phaselistner.ConfirmPhaseListener</phase-listener>
</lifecycle>

を追加。続けてpreRenderViewは

package jp.co.hoge.prerenderview;

import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.inject.Named;
import javax.enterprise.context.RequestScoped;

@Named(value = "preRenderViewBean")
@RequestScoped
public class PreRenderViewBean implements Serializable{

    public PreRenderViewBean() {
        System.out.println("PreRenderViewBeanコンストラクタ");
    }
    
    @PostConstruct
    public void init(){
        System.out.println("PreRenderViewBeanのPostConstruct");
    }
    
    public void preRenderViewListener(){
        System.out.println("PreRenderViewBeanのメソッドpreRenderViewListnerだよ");
    }
}

xhtml

<f:view>
    <f:event listener="#{preRenderViewBean.preRenderViewListener()}" type="preRenderView" />
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        Hello from Facelets
    </h:body>
</f:view>

実行すると

情報: beforePhaseが呼ばれたお:RENDER_RESPONSE 6
情報: PreRenderViewBeanコンストラクタ
情報: PreRenderViewBeanコンストラクタ
情報: PreRenderViewBeanのPostConstruct
情報: PreRenderViewBeanのメソッドpreRenderViewListnerだよ
情報: afterPhaseが呼ばれたお:RENDER_RESPONSE 6

となりました。RenderResponse=preRenderViewってこと??あれ、なんか理解できてない気が。
てかコンストラクタが2回呼ばれるのもよくわからない…。
サンプルレベルだから定義しちゃったけど、BackingBeanでは@PostConstructしか使っちゃいけないのかな?うーん。
こういう変な所で悩んでしまう初心者な自分…。多分基礎的なことがわかってなさそうなので、明日落ち着いて調べます。
って、AdventCalendarの準備もしなきゃ(汗

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村