jsf - 将 JSF 1.1 与 Ajax4jsf 1.x 迁移到 JSF 2

标签 jsf jsf-2 richfaces myfaces ajax4jsf

我们正在将 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/

相关文章:

java - 从 xml JSF/Java 配置 web-app 数据目录

jquery - JSF 和 Jquery AJAX - 如何让它们一起工作?

jsf - 丰富的modalpanel自动关闭

jquery - PreRenderView 在浏览器返回后跳过按钮操作

java - session 过期时重定向到登录页面时出现空指针异常?

jsf-2 - 如何使用带有十进制值的 Primefaces slider 组件?

ajax - JSF f :ajax listener vs commandButton action

javascript - 我可以在 RichFace 中实现文件上传的多个文件选择,或者使用 javascript 为此实现自定义标签吗?

java - Richfaces HtmlColumn 样式类覆盖

java - Spring EL 和 JSF