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

我们正在将JSF 1.1(MyFaces)项目迁移到JSF 2.我们的想法是通过将JSP和X HTML保持在一起一段时间来定期迁移.我们在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>:通过@ViewScoped将托管bean放在视图范围内.
>< a4j:log>:在JS上下文中使用jsf.ajax.addOnEvent()或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>:无替换.考虑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:民意调查>:无替换.考虑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

相关文章

IE6是一个非常老旧的网页浏览器,虽然现在很少人再使用它,但...
PHP中的count()函数是用来计算数组或容器中元素的个数。这个...
使用 AJAX(Asynchronous JavaScript and XML)技术可以在不...
Ajax(Asynchronous JavaScript and XML)是一种用于改进网页...
本文将介绍如何通过AJAX下载Excel文件流。通过AJAX,我们可以...
Ajax是一种用于客户端和服务器之间的异步通信技术。通过Ajax...