JSF生命周期监听器

在 即時事 件 中我們提到,JSF的請求執行到回應,完整的過程會經過六個階段:
  • 回復畫面(Restore View)
依客戶端傳來的session資料或伺服端上的session資料,回復JSF畫面元件。
  • 套用請求值(Apply Request Values)
JSF畫面元件各自獲得請求中的值屬於自己的值,包括舊的值與新的值。
  • 執行驗證(Process Validations)
轉換為物件並進行驗證。
  • 更新模型值(Update Model Values)
更新Bean或相關的模型值。
  • 喚起應用程式(Invoke Application)
執行應用程式相關邏輯。
  • 繪製回應畫面(Render Response)
對先前的請求處理完之後,產生畫面以回應客戶端執行結果。

在每個階段的前後會引發javax.faces.event.PhaseEvent,如果您想嘗試在每個階段的前後捕捉這個事 件,以進行一些處理,則可以實作javax.faces.event.PhaseListener,並向 javax.faces.lifecycle.Lifecycle登記這個Listener,以有適當的時候通知事件的發生。

PhaseListener有三個必須實作的方法getPhaseId()、beforePhase()與afterPhase(),其中 getPhaseId()傳回一個PhaseId物件,代表Listener想要被通知的時機,可以設定的時機有:
  • PhaseId.RESTORE_VIEW
  • PhaseId.APPLY_REQUEST_VALUES
  • PhaseId.PROCESS_VALIDATIONS
  • PhaseId.UPDATE_MODEL_VALUES
  • PhaseId.INVOKE_APPLICATION
  • PhaseId.RENDER_RESPONSE
  • PhaseId.ANY_PHASE

其中PhaseId.ANY_PHASE指的是任何的階段轉換時,就進行通知;您可以在beforePhase()與afterPhase()中撰寫階段 前後撰寫分別想要處理的動作,例如下面這個簡單的類別會列出每個階段的名稱:

  • ShowPhaseListener.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;
    }
}

撰寫好PhaseListener後,我們可以在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>

您可以使用這個簡單的類別,看看在請求任一個JSF畫面時所顯示的內容,藉此瞭解JSF每個階段的流程變化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Spring Boot整合JSF,你可以按照以下步骤进行操作: 1. 添加JSF依赖:在pom.xml文件中,添加JSF的依赖项,如下所示: ```xml <dependency> <groupId>javax.faces</groupId> <artifactId>javax.faces-api</artifactId> <version>2.3</version> </dependency> ``` 2. 配置JSF Servlet:在Spring Boot的配置类中,添加以下配置,以将JSF Servlet映射到`/javax.faces`路径下: ```java import javax.faces.webapp.FacesServlet; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JsfConfig { @Bean public ServletRegistrationBean<FacesServlet> facesServletRegistration() { ServletRegistrationBean<FacesServlet> registration = new ServletRegistrationBean<>(new FacesServlet(), "*.jsf"); registration.setName("FacesServlet"); return registration; } } ``` 3. 配置JSF View Resolver:在Spring Boot的配置类中,添加以下配置,以将JSF视图解析为`.xhtml`文件: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.view.InternalResourceViewResolver; @Configuration public class JsfConfig { @Bean public ViewResolver internalResourceViewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setViewClass(JsfView.class); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".xhtml"); return resolver; } } ``` 4. 创建JSF视图:在`/WEB-INF/views/`目录下创建JSF视图文件,例如`hello.xhtml`,并在其中定义JSF组件。 现在,你已经成功地将Spring Boot与JSF整合起来了。你可以在JSF视图中使用JSF的标签和组件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值