繁体   English   中英

使用Ajax4jsf 1.x将JSF 1.1迁移到JSF 2

[英]Migrating JSF 1.1 with Ajax4jsf 1.x to JSF 2

我们正在将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并用标准JSF2等价物替换所有<a4j:xxx>标签。

  • <a4j:ajaxListener> :使用<f:ajax listener>
  • <a4j:keepAlive> :只需通过@ViewScoped将托管bean放入视图范围。
  • <a4j:log> :在JS上下文中使用jsf.ajax.addOnEvent()jsf.ajax.addOnError()
  • <a4j:commandLink> :只需在<h: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> :只需在<h:commandLink>嵌套<f:ajax> <h:commandLink>
  • <a4j:jsFunction> :没有替代品。 考虑OmniFaces <o:commandScript>PrimeFaces <p:remoteCommand>
  • <a4j:region> :只需使用<f:ajax execute> ,甚至可以围绕<f:ajax>包装<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> :只需在<h:commandButton>嵌套<f:ajax> <h:commandButton>
  • <a4j:include> :只需使用标准<ui:include>
  • <a4j:loadStyle> :只使用标准<h:outputStylesheet>
  • <a4j:support> :只需使用标准<f:ajax>

您还需要将JSP文件重命名/重写为Facelets文件。 在简单的情况下,这通常只是更改根声明和文件扩展名的问题。 Facelets可以更轻松地通过单个模板替换所有重复的代码。 以下答案适用:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM