我们正在将 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 时,我们不需要这一切。
最佳答案
完全摆脱 Ajax4jsf 1.x。它确实与JSF2不兼容。相反,JSF2 提供了一个新的主 ajax 标签 <f:ajax>
它涵盖了 Ajax4jsf 1.x 之前提供的所有核心功能。
如果无法升级到 RichFaces 4(因为,正如您自己所说,您没有在任何地方使用 RichFaces 组件),那么只需删除 Ajax4jsf 1.x 并替换所有 <a4j:xxx>
标准 JSF2 等效标记。
-
<a4j:ajaxListener>
:使用<f:ajax listener>
. -
<a4j:keepAlive>
:只需将托管bean放入 View 范围中@ViewScoped
. -
<a4j:log>
:使用jsf.ajax.addOnEvent()
或jsf.ajax.addOnError()
在 JS 上下文中。 -
<a4j:commandLink>
:只是窝<f:ajax>
里面<h:commandLink>
. -
<a4j:outputPanel>
:使用<h:panelGroup>
并记住将其 ID 包含在<f:ajax render>
中或PrimeFaces<p:outputPanel>
. -
<a4j:repeat>
:只需使用标准<ui:repeat>
. -
<a4j:form>
:只需使用<h:form>
,它会自动识别<f:ajax>
. -
<a4j:htmlCommandLink>
:只是窝<f:ajax>
里面<h:commandLink>
. -
<a4j:jsFunction>
:只需使用标准<h:commandScript>
。然而它是在 JSF 2.3 后期引入的。如果您无法升级到 JSF 2.3,请考虑 OmniFaces<o:commandScript>
或PrimeFaces<p:remoteCommand>
. -
<a4j:region>
:只需使用<f:ajax execute>
,您甚至可以包裹<f:ajax>
围绕一组组件。 -
<a4j:loadBundle>
:只需使用标准<f:loadBundle>
. -
<a4j:status>
:使用jsf.ajax.addOnEvent()
或jsf.ajax.addOnError()
在 JS 上下文中。 -
<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 可以更轻松地用单个模板替换所有重复的代码。以下答案适用:
关于jsf - 将 JSF 1.1 与 Ajax4jsf 1.x 迁移到 JSF 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17553033/