6

我们正在将 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 时,我们不需要所有这些。

4

1 回答 1

14

完全摆脱 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 放在视图范围内@ViewScoped
  • <a4j:log>:在 JS 上下文中使用jsf.ajax.addOnEvent()or 。jsf.ajax.addOnError()
  • <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>:在 JS 上下文中使用jsf.ajax.addOnEvent()or 。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 可以更轻松地用单个模板替换所有重复的代码。以下答案适用:

于 2013-07-09T18:01:22.257 回答