【问题标题】:JSF Event Listener before Render Response Phase呈现响应阶段之前的 JSF 事件侦听器
【发布时间】:2016-04-05 07:02:21
【问题描述】:

当表单在到达渲染响应阶段之前首次加载时,我想在 JSF 视图范围的支持 bean 中进行一些处理。我无法在渲染响应阶段执行此过程,因为我有一个取决于处理的动态包含。是否有我可以使用的事件侦听器或阶段侦听器?

【问题讨论】:

  • 托管 bean 的@PostConstruct 到底是怎么回事?
  • 包含将是动态的,基于我传递给 bean 的 get 参数,该参数在 UpdateModelView 阶段设置到托管 bean 中。我不确定在此阶段之前是否会调用 @PostConstruct。
  • 只要确保参数已设置并在@PostConstruct中可用。
  • 该属性是当前通过 f:viewParam 自动设置的。在这种情况下我是否必须手动提取请求参数?

标签: jsf-2 lifecycle


【解决方案1】:

您可以使用编程阶段侦听器,我假设您使用的是 JSF2。下面的类将在您的应用程序中加载阶段侦听器。

@ManagedBean(eager = true)
@ApplicationScoped
public class SomeClass implements Serializable {

    @PostConstruct
    private void initialize() {
        LifecycleFactory factory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
        Lifecycle lifecycle = factory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
        lifecycle.addPhaseListener(new PhaseListenerImpl());

    }
}

你可以在 beforePhase 方法中定义你的逻辑。

public class PhaseListenerImpl implements PhaseListener {   

@Override
public void afterPhase(PhaseEvent pe) {

    return;
}

@Override
public void beforePhase(PhaseEvent pe) {

    FacesContext fc = pe.getFacesContext();
    String viewId = fc.getViewRoot().getViewId();


        try {
            if(viewId==blah){
            //your logic goes here for your view
            }

        } catch (Exception e) {
            e.printStackTrace();

        }

    }       

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

【讨论】:

  • OP 需要在视图构建期间运行代码(因为 ui:include 在视图构建期间运行而不是视图渲染时间)。
  • 代码允许我在渲染响应阶段之前注入监听器。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2012-06-26
  • 2013-06-27
  • 2011-11-28
  • 2012-08-04
  • 2014-05-10
  • 1970-01-01
相关资源
最近更新 更多