2013-07-09 15 views
6

Przeprowadzamy migrację projektu JSF 1.1 (MyFaces) do JSF 2. Chodzi o to, aby migrować okresowo, utrzymując jednocześnie wspólną stronę JSP i XHTML. Używamy wielu znaczników ajax4jsf-1.1.1 na stronach JSP. Nie używamy RichFaces. Po skonfigurowaniu systemu do JSF 2 (ze wszystkich zmian konfiguracyjnych zawartych w poradniku przez Balusc), gdy próbowali uzyskać dostęp do strony JSP z ajax4jsf.jar w ścieżce klasy, mamy wyjątek:Migrowanie JSF 1.1 z Ajax4jsf 1.x do 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) 

wygląda ajax4jsf.jar jest niezgodne z JSF 2. Wygląda na problem z konfiguracją LifeCycle.

Czy jest jakiś sposób, abyśmy mogli pracować a4j z JSP 2 JSF? Wiem, że kiedy używamy XHTML, nie potrzebujemy tego wszystkiego.

+0

Czy próbowałeś użyciu RichFaces 4 zamiast ajax4jsf? –

+0

Tak, próbowałem szybko. Ale w obliczu problemów związanych z nawigacją i działaniem z JSP. Nie zagłębialiśmy się w to, ponieważ planowaliśmy wykorzystać w przyszłości prymitywy i nie chcemy w tej chwili przygody z Richfaces. –

+0

Po prostu, aby poinformować, RichFaces wchłonął projekt ajax4jsf. Nie rozumiem, dlaczego nie * przygody * w RichFaces. –

Odpowiedz

13

Pozbądź się Ajax4jsf 1.x łącznie. W rzeczywistości nie jest kompatybilny z JSF2. Zamiast tego JSF2 oferuje nowy główny znacznik ajaxowy <f:ajax>, który obejmuje całą podstawową funkcjonalność, jaką wcześniej oferował Ajax4jsf 1.x.

Jeśli uaktualnienie do RichFaces 4 nie jest opcją (ponieważ, jak sam powiedziałeś, nie używasz komponentów RichFaces w dowolnym miejscu), po prostu usuń Ajax4jsf 1.x i zamień wszystkie znaczniki <a4j:xxx> za pomocą standardowych odpowiedników JSF2.

  • <a4j:ajaxListener>: użyj <f:ajax listener>.
  • <a4j:keepAlive>: wystarczy umieścić zarządzaną fasolę w zakresie widoku przez @ViewScoped.
  • <a4j:log>: użyj jsf.ajax.addOnEvent() lub jsf.ajax.addOnError() w kontekście JS.
  • <a4j:commandLink>: tylko gniazdo <f:ajax> wewnątrz <h:commandLink>.
  • <a4j:outputPanel>: użyj <h:panelGroup> i pamiętaj, aby dołączyć jego identyfikator do <f:ajax render> lub PrimeFaces <p:outputPanel>.
  • <a4j:repeat>: wystarczy użyć standardu <ui:repeat>.
  • <a4j:form>: po prostu użyjemy <h:form>, to automatycznie rozpozna <f:ajax>.
  • <a4j:htmlCommandLink>: po prostu gniazdo <f:ajax> wewnątrz <h:commandLink>.
  • <a4j:jsFunction>: bez wymiany. Rozważmy OmniFaces <o:commandScript> lub PrimeFaces <p:remoteCommand>.
  • <a4j:region>: wystarczy użyć <f:ajax execute>, można nawet owinąć <f:ajax> wokół grupy składników.
  • <a4j:loadBundle>: wystarczy użyć standardu <f:loadBundle>.
  • <a4j:status>: użyj jsf.ajax.addOnEvent() lub jsf.ajax.addOnError() w kontekście JS.
  • <a4j:actionparam>: wystarczy użyć standardu <f:param>.
  • <a4j:loadScript>: wystarczy użyć standardu <h:outputScript>.
  • <a4j:mediaOutput>: bez wymiany. Rozważ PrimeFaces <p:media>.
  • <a4j:poll>: bez wymiany. Rozważmy OmniFaces <o:commandScript> lub PrimeFaces <p:poll>.
  • <a4j:commandButton>: po prostu gniazdo <f:ajax> wewnątrz <h:commandButton>.
  • <a4j:include>: wystarczy użyć standardu <ui:include>.
  • <a4j:loadStyle>: wystarczy użyć standardu <h:outputStylesheet>.
  • <a4j:support>: wystarczy użyć standardu <f:ajax>.

Należy także zmienić nazwę/przepisać pliki JSP na pliki Facetów. W prostych przypadkach jest to zwykle kwestia zmiany deklaracji root i rozszerzeń plików. Facelets ułatwia zastąpienie całego zduplikowanego kodu pojedynczym szablonem. Poniższa odpowiedź dotyczy:

+0

Ale jeśli dobrze rozumiem, tagi nie będą działać na stronach JSP, prawda? Czy istnieje jakieś rozwiązanie, które działa w JSP (zamiast ponownie wdrażać JSP w XHTML)? –

+0

JSP jest przestarzałe w JSF2. Tak więc rzeczywiście oczekuje się, że będziesz migrować również do Facetów. Może to być pomocne: http://stackoverflow.com/questions/4441713/migrating-from-jsf-1-2-to-jsf-2-0/4532870#4532870 – BalusC

+0

szukał sposobu, w jaki możemy zachować istniejące JSP z tagami a4j tak jak jest przez pewien czas podczas migracji do XHTML. Wygląda, nie ma mowy. Nie wiesz, czy uaktualnianie do RichFaces jest opcją do obsługi tagów a4j na stronach JSP. –