我们正在将JSF 1.1(MyFaces)项目迁移到JSF2。其想法是通过将JSP和XHTML在一起保持一段时间来进行定期迁移。我们在JSP页面中使用了许多ajax4jsf-1.1.1标记。我们不使用RichFaces。在将系统配置为JSF 2(具有Balusc教程中提到的所有配置更改)之后,当尝试使用classpath中的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时,我们并不需要所有这些。

最佳答案

完全摆脱Ajax4jsf1.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>:通过@ViewScoped将托管bean放在 View 范围内。
  • <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,可以更轻松地用一个模板替换所有重复的代码。适用以下答案:
  • Migrating from JSF 1.2 to JSF 2.0
  • 09-04 05:04
    查看更多