我们正在将JSF 1.1(MyFaces)项目迁移到JSF 2.我们的想法是通过将JSP和XHTML保持在一起一段时间来定期迁移。我们在JSP页面中使用了许多ajax4jsf-1.1.1标记。我们不使用RichFaces。将系统配置为JSF 2(Balusc教程中提到的所有配置更改)当尝试在类路径中使用ajax4jsf.jar访问JSP页面时,我们得到一个例外:
Caused by: java.lang.IllegalStateException: setViewHandler may not be executed after a lifecycle request has been completed
at org.apache.myfaces.application.ApplicationImpl.setViewHandler(ApplicationImpl.java:853)
at org.ajax4jsf.framework.ajax.InitPhaseListener.beforePhase(InitPhaseListener.java:92)
at org.apache.myfaces.lifecycle.PhaseListenerManager.informPhaseListenersBefore(PhaseListenerManager.java:76)
at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:131)
看起来ajax4jsf.jar与JSF 2不兼容。看起来LifeCycle配置存在一些问题。
有什么方法可以让a4j使用JSF 2 JSP吗?我知道当我们使用XHTML时,我们不需要这一切。
答案 0 :(得分:13)
完全摆脱Ajax4jsf 1.x.它确实与JSF2不兼容。相反,JSF2提供了一个新的主要ajax标记<f:ajax>
,它涵盖了Ajax4jsf 1.x之前提供的所有核心功能。
如果升级到RichFaces 4不是一个选项(因为,正如你自己所说,你没有在任何地方使用RichFaces组件),那么只需删除Ajax4jsf 1.x并用标准的JSF2替换所有<a4j:xxx>
标签
<a4j:ajaxListener>
:使用<f:ajax listener>
。<a4j:keepAlive>
:只需将托管bean放在@ViewScoped
的视图范围内。<a4j:log>
:在JS上下文中使用jsf.ajax.addOnEvent()
或jsf.ajax.addOnError()
。<a4j:commandLink>
:只需在<f:ajax>
内嵌套<h:commandLink>
。<a4j:outputPanel>
:使用<h:panelGroup>
并记住在<f:ajax render>
或PrimeFaces <p:outputPanel>
中包含其ID。<a4j:repeat>
:只需使用标准<ui:repeat>
。<a4j:form>
:只需使用<h:form>
,即可自动识别<f:ajax>
。<a4j:htmlCommandLink>
:只需在<f:ajax>
内嵌套<h:commandLink>
。<a4j:jsFunction>
:没有替代品。考虑OmniFaces <o:commandScript>
或PrimeFaces <p:remoteCommand>
。<a4j:region>
:只需使用<f:ajax execute>
,您甚至可以围绕一组组件包裹<f:ajax>
。<a4j:loadBundle>
:只需使用标准<f:loadBundle>
。<a4j:status>
:在JS上下文中使用jsf.ajax.addOnEvent()
或jsf.ajax.addOnError()
。<a4j:actionparam>
:只需使用标准<f:param>
。<a4j:loadScript>
:只需使用标准<h:outputScript>
。<a4j:mediaOutput>
:没有替代品。考虑PrimeFaces <p:media>
。<a4j:poll>
:没有替代品。考虑OmniFaces <o:commandScript>
或PrimeFaces <p:poll>
。<a4j:commandButton>
:只需在<f:ajax>
内嵌套<h:commandButton>
。<a4j:include>
:只需使用标准<ui:include>
。<a4j:loadStyle>
:只需使用标准<h:outputStylesheet>
。<a4j:support>
:只需使用标准<f:ajax>
。您还需要将JSP文件重命名/重写为Facelets文件。在简单的情况下,这通常只是更改根声明和文件扩展名的问题。 Facelets可以更轻松地通过单个模板替换所有重复的代码。以下答案适用: