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 とは互換性がありません。<f:ajax>代わりに、JSF2 は、以前に Ajax4jsf 1.x で提供されていたすべてのコア機能をカバーする新しいメイン ajax タグを提供します。

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>:またはPrimeFaces<h:panelGroup>にその ID を含めることを忘れずに使用してください。<f:ajax render><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 に答える