2013-07-09 19 views
6

Stiamo migrando il progetto JSF 1.1 (MyFaces) a JSF 2. L'idea è di migrare periodicamente mantenendo sia JSP che XHTML insieme per qualche tempo. Utilizziamo molti tag ajax4jsf-1.1.1 nelle pagine JSP. Non usiamo RichFaces. Dopo aver configurato il sistema per JSF 2 (con tutte le modifiche di configurazione di cui tutorial di Balusc) Quando ha cercato di accedere alla pagina JSP con ajax4jsf.jar nel percorso di classe, si ottiene un'eccezione:Migrazione di JSF 1.1 con Ajax4jsf 1.x in JSF 2

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) 

Sembra ajax4jsf.jar è non compatibile con JSF 2. Sembra un problema con la configurazione di LifeCycle.

C'è un modo per far funzionare a4j con JSP JSF 2? So che quando usiamo XHTML non abbiamo bisogno di tutto questo.

+0

Hai provato a usare RichFaces 4 invece di Ajax4jsf? –

+0

Sì, ho provato rapidamente. Ma affrontano problemi con la navigazione e la gestione delle azioni con JSP. Non l'ho approfondito perché avevamo in programma di utilizzare primefaces in futuro e non vogliamo avventurarci in Richfaces al momento. –

+0

Per farvi sapere, RichFaces ha assorbito il progetto ajax4jsf. Non capisco perché non * avventura * in RichFaces. –

risposta

13

Sbarazzarsi di Ajax4jsf 1.x del tutto. In effetti non è compatibile con JSF2. Invece, JSF2 offre un nuovo tag ajax principale <f:ajax> che copre tutte le funzionalità di base come precedentemente offerto da Ajax4jsf 1.x.

Se l'aggiornamento a RichFaces 4 non è un'opzione (perché, come hai detto tu stesso, non si utilizza componenti RichFaces ovunque), quindi è sufficiente rimuovere Ajax4jsf 1.xe sostituire tutti <a4j:xxx> tag da equivalenti standard di JSF2.

  • <a4j:ajaxListener>: utilizzare <f:ajax listener>.
  • <a4j:keepAlive>: basta mettere bean gestito nel perimetro vista da @ViewScoped.
  • <a4j:log>: utilizzare jsf.ajax.addOnEvent() o jsf.ajax.addOnError() nel contesto JS.
  • <a4j:commandLink>: basta nido <f:ajax> all'interno <h:commandLink>.
  • <a4j:outputPanel>: utilizzare <h:panelGroup> e ricordarsi di includere l'ID in <f:ajax render> o PrimeFaces <p:outputPanel>.
  • <a4j:repeat>: utilizzare solo lo standard <ui:repeat>.
  • <a4j:form>: basta usare <h:form>, sarà autorecognize <f:ajax>.
  • <a4j:htmlCommandLink>: basta nido <f:ajax> all'interno <h:commandLink>.
  • <a4j:jsFunction>: nessuna sostituzione. Si consideri OmniFaces <o:commandScript> o PrimeFaces <p:remoteCommand>.
  • <a4j:region>: basta usare <f:ajax execute>, è possibile anche avvolgere <f:ajax> attorno a un gruppo di componenti.
  • <a4j:loadBundle>: utilizzare solo lo standard <f:loadBundle>.
  • <a4j:status>: utilizzare jsf.ajax.addOnEvent() o jsf.ajax.addOnError() nel contesto JS.
  • <a4j:actionparam>: utilizzare solo lo standard <f:param>.
  • <a4j:loadScript>: utilizzare solo lo standard <h:outputScript>.
  • <a4j:mediaOutput>: nessuna sostituzione. Si consideri PrimeFaces <p:media>.
  • <a4j:poll>: nessuna sostituzione. Si consideri OmniFaces <o:commandScript> o PrimeFaces <p:poll>.
  • <a4j:commandButton>: solo nidificare <f:ajax> all'interno di <h:commandButton>.
  • <a4j:include>: utilizzare solo lo standard <ui:include>.
  • <a4j:loadStyle>: utilizzare solo lo standard <h:outputStylesheet>.
  • <a4j:support>: utilizzare solo lo standard <f:ajax>.

È inoltre necessario rinominare/riscrivere i file JSP in file Facelets. In casi semplici, di solito si tratta solo di cambiare le dichiarazioni di root e le estensioni di file. Facelets semplifica la sostituzione di tutti i codici duplicati con un singolo modello. La risposta vale quanto segue:

+0

Ma se ho capito bene, i tag non funzioneranno in JSP giusto? C'è qualche soluzione che funziona in JSP (invece di ri-implementare JSP in XHTML)? –

+0

JSP è obsoleto in JSF2. Quindi è previsto che tu passi anche a Facelets. Questo può essere utile quindi: http://stackoverflow.com/questions/4441713/migrating-from-jsf-1-2-to-jsf-2-0/4532870#4532870 – BalusC

+0

cercava un modo in cui possiamo mantenere esistenti JSP con tag a4j come è da qualche tempo durante la migrazione a XHTML. Sembra che non ci sia modo. Non è sicuro l'aggiornamento a RichFaces un'opzione solo per supportare tag a4j nelle pagine JSP. –