SeamFramework.orgCommunity Documentation

Capitolo 12. Definire i Web Beans tramite XML

12.1. Dichiarare classi Web Bean
12.2. Dichiarare metadati Web Bean
12.3. Dichiarare membri Web Bean
12.4. Dichiarazione inline dei Web Beans
12.5. Uso di uno schema

Finora si sono visti molti esempi di Web Bean dichiarati usando annotazioni. Comunque ci sono varie occasioni in cui non è possibile usare le annotazioni per definire un Web Bean:

In entrambi i casi Web Beans fornisce due opzioni:

Molti framework utilizzano XML per scrivere metadati relazionati alle classi. Web Beans usa un approccio molto diverso rispetto agli altri framework per specificare i nomi delle classi Java, dei campi o dei metodi. Invece di scrivere i nomi delle classi o dei membri come valori stringa di elementi e atttributi XML, Web Beans consente di utilizzare il nome della classe o del membro come nome dell'elemento XML.

Il vantaggio di quest'approccio è che risulta possibile scrivere uno schemaXML che previene gli errori di scrittura nei documenti XML. E' comunque possibile per un tool generare lo schema XML in modo automatico dal codice Java compilato. Oppure un ambiente di sviluppo integrato può eseguire la stessa validazionesenza il bisogno di un passo di generazione intermedio ed esplicito.

Per ogni pacchetto Java, Web Beans definisce un corrispondente namespace XML. Ilnamespace è formato aggiungendo il prefisso urn:java: al nomedel pacchetto Java. Per il pacchetto com.mydomain.myapp, il namespace XML è urn:java:com.mydomain.myapp.

I tipi Java appartenenti al pacchetto vengono riferiti usando un elemento XML nel namespace corrispondente al pacchetto. Il nome dell'elemento è un nome di tipo Java. I campi e metodi del tipo vengono specificati dagli elementi figlio nello stesso namespace. Se il tipo è un'annotazione, i membri sonospecificati dagli attributi dell'elemento.

Per esempio l'elemento <util:Date/> nel seguente frammento XML si riferisce alla classe java.util.Date:


<WebBeans xmlns="urn:java:javax.webbeans"
          xmlns:util="urn:java:java.util">

    <util:Date/>

</WebBeans
>

E questo è tutto il codice per dichiarare che Date è un Web Bean semplice! Un'istanza di Date ora può essere iniettata da qualsiasi altro Web Bean:

@Current Date date

E' possibile dichiarare lo scope, il tipo di deploy ed i tipi di binding degli interceptor usando elementi figli diretti della dichiarazione Web Bean:


<myapp:ShoppingCart>
    <SessionScoped/>
    <myfwk:Transactional requiresNew="true"/>
    <myfwk:Secure/>
</myapp:ShoppingCart
>

Si utilizza esattamente lo stesso approccio per specificare i nomi ed il tipo di binding:


<util:Date>
    <Named
>currentTime</Named>
</util:Date>

<util:Date>
    <SessionScoped/>
    <myapp:Login/>
    <Named
>loginTime</Named>
</util:Date>

<util:Date>
    <ApplicationScoped/>
    <myapp:SystemStart/>
    <Named
>systemStartTime</Named>
</util:Date
>

Dove @Login e @SystemStart sono tipi di annotazioni di binding.

@Current Date currentTime;

@Login Date loginTime;
@SystemStart Date systemStartTime;

Di nuovo un Web Bean può supportare tipi di binding multipli:


<myapp:AsynchronousChequePaymentProcessor>
    <myapp:PayByCheque/>
    <myapp:Asynchronous/>
</myapp:AsynchronousChequePaymentProcessor
>

Interceptor e decoratori sono solo eb Bean semplici, e quindi possono essere dichiarati come qualsiasi altro Web Bean semplice:


<myfwk:TransactionInterceptor>
    <Interceptor/>
    <myfwk:Transactional/>
</myfwk:TransactionInterceptor
>

DA FARE!

I Web Beans consentono di definire un Web Bean ad un certo punto di iniezione. Per esempio:


<myapp:System>
    <ApplicationScoped/>
    <myapp:admin>
        <myapp:Name>
            <myapp:firstname
>Gavin</myapp:firstname>
            <myapp:lastname
>King</myapp:lastname>
            <myapp:email
>gavin@hibernate.org</myapp:email>
        </myapp:Name>
    </myapp:admin>
</myapp:System
>

L'elemento <Name> dichiara un Web Bean semplice con scope @Dependent e classe Name, con un set di valori di campo iniziali. Questo Web Bean ha uno speciale binding generatore dal container e quindi è iniettabile solo allo specifico punto di iniezione al quale è stato dichiarato.

Questa caratteristica semplice e potente consente formato XML di Web Bean di essere usato per specificare l'intero grafo di oggetti Java. Non è ancora una completa soluzione di databinding, ma ci si avvicina!

Se si vuole che il formato di documento XML sia scritto da persone che non sono sviluppatori Java o che non hanno accesso al codice, occorre fornire uno schema. There's nothing specific to Web Beans about writing or using the schema.


<WebBeans xmlns="urn:java:javax.webbeans"
          xmlns:myapp="urn:java:com.mydomain.myapp"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:java:javax.webbeans http://java.sun.com/jee/web-beans-1.0.xsd
                              urn:java:com.mydomain.myapp http://mydomain.com/xsd/myapp-1.2.xsd">

    <myapp:System>
        ...
    </myapp:System>

</WebBeans
>

Scrivere unoschema XML è abbastanza noiso. Quindi il progetto Web Beans RI fornirà uno strumento per generare automaticamente lo schema XML dal codice Java compilato.