我已经为我们的应用设置了一些非常有用的东西。在开发模式中很有用,但在生产中却没有。例如,我注册了这个phaselistener
<lifecycle>
<phase-listener>org.primefaces.component.lifecycle.LifecyclePhaseListener</phase-listener>
</lifecycle>
在生产模式下,没有必要这样做,所以我想知道你们如何使用JSF应用程序通过在生产模式下考虑PROJECT_STAGE状态来禁用它?
PS:在xhtml页面中,我意识到这很简单,因为我可以决定不使用#{facesContext.application.projectStage eq 'Development'}
来呈现组件
答案 0 :(得分:2)
您可以以编程方式而不是通过faces-config.xml注册PhaseListener,例如:
@ManagedBean(eager = true)
@ApplicationScoped
public class ApplicationBean {
@PostConstruct
private void initialize() {
LifecycleFactory factory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
Lifecycle lifecycle = factory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
if (ProjectStage.Development.equals(getProjectStage())) {
lifecycle.addPhaseListener(new PhaseListenerImpl());
}
}
private ProjectStage getProjectStage() {
FacesContext fc = FacesContext.getCurrentInstance();
Application appl = fc.getApplication();
return appl.getProjectStage();
}
}
(参见web.config)
答案 1 :(得分:1)
使用系统事件监听器(参见https://www.tutorialspoint.com/jsf/jsf_applicationevents_tag.htm):
a = 1,
type(a)
>>> tuple
b = 1, 2
type(b)
>>> tuple
c = (1)
type(c)
>>>> int
答案 2 :(得分:0)
如果不在开发模式下,则可以通过扩展Primefaces LifecyclePhaseListener
并从null
方法返回getPhaseId()
来实现。
public class LifecycleForDevelopmentPhaseListener extends LifecyclePhaseListener {
@Override
public PhaseId getPhaseId() {
if (!FacesContext.getCurrentInstance().isProjectStage(ProjectStage.Development)) {
return null;
}
return super.getPhaseId();
}
}
这将绕过相位监听器