- (opcjonalnie) sprawdza istnienie definicji servletu javax.faces.webapp.FacesServlet w deskryptorze wdrożenia i w przypadku jego braku może w tym momencie zakończyć pracę
- poszukuje META-INF/faces-config.xml we wszystkich zasobach aplikacji webowej (poprzez odpytanie ServletContext o wszystkie dostępne zasoby, jak pliki jar, czy zawartość WEB-INF/classes) i wczytuje je jako plik konfiguracyjny JSF w odwrotnej kolejności do tej zwróconej przez Thread.getContextClassloader().getResources())
- sprawdza istnienie parametru kontekstowego javax.faces.CONFIG_FILES, który jest listą plików konfiguracyjnych oddzielonych przecinkiem, a następnie wczytuje je kolejno
- sprawdza istnienie pliku /WEB-INF/faces-config.xml w aplikacji webowej
<?xml version="1.0"?>gdzie każdy z elementów wpływa na konfigurację naszej aplikacji webowej korzystającej z JBoss Seam (i niewprost z JSF). Przy okazji okazało się, że plik jboss-seam.jar zawiera również plik META-INF/ejb-jar.xml, co określa go również jako moduł EJB.
<faces-config version="1.2"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
<factory>
<application-factory>org.jboss.seam.jsf.SeamApplicationFactory</application-factory>
</factory>
<application>
<navigation-handler>org.jboss.seam.jsf.SeamNavigationHandler</navigation-handler>
<view-handler>org.jboss.seam.jsf.SeamViewHandler</view-handler>
<state-manager>org.jboss.seam.jsf.SeamStateManager</state-manager>
<el-resolver>org.jboss.seam.el.SeamELResolver</el-resolver>
<message-bundle>org.jboss.seam.core.SeamResourceBundle</message-bundle>
</application>
<lifecycle>
<phase-listener>org.jboss.seam.jsf.SeamPhaseListener</phase-listener>
</lifecycle>
</faces-config>
Najbardziej zaintrygował mnie krok 3, o którym już ktoś mi wcześniej wspominał, jako sposobie na podział rozrastającego się faces-config.xml na mniejsze pliki składowe. Z pewnością zarządzanie mniejszymi plikami jest prostsze, więc możliwość podziału faces-config.xml na mniejsze pliki konfiguracyjne jest wartościową informacją.
Możemy, więc posiadać wiele plików konfiguracyjnych w formacie faces-config.xml, które definiujemy w deskryptorze wdrożenia aplikacji webowej - /WEB-INF/web.xml następująco:
<?xml version="1.0" encoding="UTF-8"?>Daje to ciekawą możliwość nadpisywania konfiguracji, np. produkcyjnej testową lub podobnie, gdzie poszczególne definicje ziaren zarządzanych JSF w produkcyjny-faces-config.xml są nadpisane przez faces-config.xml w katalogu WEB-INF. Po wykonaniu testów funkcjonalnych można po prostu usunąć plik WEB-INF/faces-config.xml i wdrożyć aplikację na właściwe środowisko testowe.
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/produkcyjny-faces-config.xml, /WEB-INF/inny-faces-config.xml</param-value>
</context-param>
</web-app>
Pozostaje sprawdzenie, czy taki podział konfiguracji JSF jest wspierany przez środowiska programistyczne. Sprawdziłem NetBeans 6.5 i muszę przyznać, że mam dobrą i złą wiadomość. Zacznę od tej złej - jedynie faces-config.xml jest specjalnie traktowany jako plik konfiguracyjny JSF przez edytor PageFlow (pisałem o nim w NetBeans 6 i jego edytor PageFlow do faces-config.xml). Dobra wiadomość jest taka, że tworząc ziarno zarządzane przez asystenta JSF Managed Bean w polu Configuration File widnieją nasze pliki konfiguracyjne JSF.
Nie obyło się bez zgłoszenia kilku błędów odnośnie wsparcia javax.faces.CONFIG_FILES, jak np. Issue #141444 [65cat] Configuration Files without all javax.faces.CONFIG_FILES, gdzie w Configuration Files jedynie wymieniony jest pierwszy z listy plików w javax.faces.CONFIG_FILES oraz faces-config.xml.
Zastanawiam się, jak szeroko stosowana jest owa funkcjonalność JSF podziału pliku konfiguracyjnego faces-config.xml w projektach. Zdarzyło się u Ciebie? Chętnie zapoznałbym się z powodem takiego podziału - łatwość zarządzania, czy coś więcej?
Cześć,
OdpowiedzUsuńakurat kilka dni temu walczyłem z tym tematem (w NetBeans 6.1) i mam trochę inne spostrzeżenia:
Jeżeli kolejny plik faces-config utworzysz jako plik konfiguracyjny JSF (a nie plik XML) to jest traktowany tak samo jak faces-config.xml. Wydawałoby się dziwnym, gdyby zepsuli to w wersji 6.5
Poza tym nie udało mi się zmusić wykorzystywanej implementacji (MyFaces 1.2) do wykorzystania kilku plików. Zawsze czytany był tylko ten podany jako pierwszy. A powód podzielenia? Doszedłem do wniosku, że wygodnie będzie przechowywać w jednym pliku definicję beanów a w drugi reguły nawigacji... :)
post trochę stary, ale przypadkiem tu trafiłem
OdpowiedzUsuńdodam, że od dawna w NetBeans (bodajże co najmniej 6.0) jeśli dodasz nowy plik przez wizzard (New->JSF Faces Configuration) to jest on także dopisywany do javax.faces.CONFIG_FILES w web.xml