Was ist die Verwendung vonaces-config.xml in JSF 2?

89

Nach der großen Unterstützung von JSF 2 für Anmerkungen frage ich mich, wofür ich das verwenden würde faces-config.xml. Welche Bedeutung hat es jetzt?

Mit anderen Worten, welche Konfigurationen können nur durch faces-config.xmlund nicht über Anmerkungen vorgenommen werden?

Im Moment benutze ich es nur, um den EL-Resolver von Spring zu deklarieren.

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    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_2_0.xsd"
    version="2.0">

    <application>
        <el-resolver>
            org.springframework.web.jsf.el.SpringBeanFacesELResolver
        </el-resolver>
    </application> 
</faces-config>
Mahmoud Saleh
quelle
1
Warum müssen wir den eingebauten ELResolver angeben? Ich dachte, die Designphilosophie ist Konvention über Konfiguration ...
masterxilo
Ich habe auch keine <el-resolver>in meiner faces-config.xmlund es funktioniert perfekt.
Roland

Antworten:

142

Es muss noch für viele Dinge verwendet werden, die nicht kommentiert werden können. ZB benutzerdefinierte JSF-Validierungsnachrichten:

<application>
    <message-bundle>com.example.i18n.messages</message-bundle>
</application>

Ein globales i18n-Bundle (damit Sie nicht <f:loadBundle>in jeder Ansicht deklarieren müssen ):

<application>
    <resource-bundle>
        <base-name>com.example.i18n.Text</base-name>
        <var>text</var>
    </resource-bundle>
</application>

Explizit unterstützte i18n-Gebietsschemas (sodass die nicht deklarierten Gebietsschemas ignoriert werden, obwohl es ein Nachrichten- oder Ressourcenpaket dafür gibt):

<application>
    <locale-config>
        <default-locale>en</default-locale>
        <supported-locale>nl</supported-locale>
        <supported-locale>es</supported-locale>         
        <supported-locale>de</supported-locale>         
    </locale-config>
</application>

Benutzerdefinierte Ansichtshandler :

<application>
    <view-handler>com.example.SomeViewHandler</view-handler>
</application>

Phasen-Listener (dafür gibt es noch keine Anmerkung):

<lifecycle>
    <phase-listener>com.example.SomePhaseListener</phase-listener>
</lifecycle>

Verwaltete Beans, die nicht mit Anmerkungen versehen werden können (die folgende gibt den aktuellen Stand Datean #{now}):

<managed-bean>
    <description>Current date and time</description>
    <managed-bean-name>now</managed-bean-name>
    <managed-bean-class>java.util.Date</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

Benutzerdefinierte Fabriken, wie benutzerdefinierte Exception - Handler Fabrik (es kann auch Fabriken für FacesContext, ExternalContext, LifeCycleund vieles mehr , so dass Sie Ihre benutzerdefinierte Implementierung zur Verfügung stellen können):

<factory>
    <exception-handler-factory>com.example.SomeExceptionHandlerFactory</exception-handler-factory>
</factory>

Um nur die häufig verwendeten zu nennen. Wenn faces-config.xmlIhre IDE die automatische Vervollständigung von Tags enthält, können Sie alle herausfinden. Nur die verwalteten Beans, Validatoren, Konverter, Komponenten, Renderer und Punkt-zu-Punkt-Navigationsfälle werden dank der neuen Anmerkungen und der impliziten Navigation nicht mehr benötigt.

BalusC
quelle
7
@ Matt: Ich habe ein Projekt hat , wo ein java.util.HashMapwie #{components}in Anforderung Umfang gespeichert wird eine bessere Aussage Übersicht über alle Komponenten Bindungen zu haben. Zum Beispiel binding="#{components.foo}", damit darauf verwiesen werden kann, dass es #{components.foo}selbstdokumentierender und weniger riskant ist (aufgrund möglicher Namenskonflikte) als binding="#{foo}"und #{foo}.
BalusC
2
Ich suchte auch nach einer Anmerkung zur Angabe von el-resolver. Jetzt denke ich, dass es keine Möglichkeit gibt, diese Anwendungseigenschaften über Annotation anzugeben.
Rup Majumder
@ RupMajumder Wo willst du eine solche Anmerkung setzen, ich meine auf welche Klasse? Diese Eigenschaft ist auf die gesamte Anwendung verteilt.
Iozee
1
FWIW: Bei Verwendung von Apache Deltaspike kann die Annotation JsfPhaseListener für die Verwendung von Phasenlistenern verwendet werden, ohne dass diese in der Datei sites-config.xml konfiguriert werden müssen.
Jpangamarca