SeamFramework.orgCommunity Documentation

Capitolo 41. Seam sull'application server GlassFish

41.1. L'ambiente e l'esecuzione di applicazioni su GlassFish
41.1.1. Installazione
41.2. L'esempio jee5/booking
41.2.1. Compilare l'esempio jee5/booking
41.2.2. Mettere in esecuzione l'applicazione su GlassFish
41.3. L'esempio booking jpa
41.3.1. Compilazione dell'esempio jpa
41.3.2. Deploy dell'esempio jpa
41.3.3. Quali sono le differenze in GlassFish v2 UR2
41.4. Mettere in esecuzione un'applicazione generata con seam-gen su GlassFish v2 UR2
41.4.1. Eseguire il setup di seam-gen
41.4.2. Modifiche necessarie per l'esecuzione su GlassFish

GlassFish è un application server open source che implementa in maniera completa le specifiche Java EE 5. L'ultima versione stabile rilasciata è la v2 UR2.

Anzitutto vedremo l'ambiente GlassFish. Quindi proseguiremo su come eseguire l'esempio JEE5. Poi eseguiremo l'aplicazione di esempio JPA. Infine mostreremo come si può ottenere un'applicazione generata con seam-gen che funzioni su GlassFish.

Tutte le informazioni e gli esempi in questo capitolo sono basati sull'ultima versione di GlassFish al momento in cui è stato scritto.

Dopo aver scaricato GlassFish occorre installarlo:

$ java -Xmx256m -jar glassfish-installer-v2ur2-b04-linux.jar

Dopo averlo installato, occorre configurarlo:

$ cd glassfish; ant -f setup.xml

Il nome del dominio creato è domain1.

Ora facciamo partire il server JavaDB interno:

$ bin/asadmin start-database

Nota

JavaDB è un database interno che è incluso in GlassFish, così come HSQLDB è incluso in JBoss AS.

Ora facciamo partire il server GlassFish:

$ bin/asadmin start-domain domain1

La console di amministrazione web è disponibile all'indirizzo http://localhost:4848/. E' possibile accedere alla console di amministrazione web con il nome utente e la password di default (admin e adminadmin rispettivamente). Useremo la console di amministrazione per mettere in esecuzione i nostri esempi. E' anche possibile copiare i file EAR/WAR nella cartella glassfish/domains/domain1/autodeploy per metterli in esecuzione, ma non ci occuperemo di questo.

E' possibile fermare il server e il database usando:

$ bin/asadmin stop-domain domain1; bin/asadmin stop-database

L'esempio jee5/booking è basato sull'esempio Hotel Booking (che gira su JBoss AS). Così com'è, è fatto per girare su GlassFish. Si trova in $SEAM_DIST/examples/jee5/booking.

Si tratta dell'esempio Hotel Booking implementato con componente Seam POJO e usando Hibernate JPA con transazioni JPA. Non richiede che il supporto EJB3 sia in funzione sull'application server.

L'esempio ha numerose configurazioni e script per compilare per molti dei più comuni application server, incluso GlassFish.

Questo è molto simile all'esempio jee5 descritto in Sezione 41.2.2, «Mettere in esecuzione l'applicazione su GlassFish» eccetto che questo è un war e non un ear.

  • Accedere alla console di amministrazione

    http://localhost:4848
  • Accedere all'opzione di menu Web Applications sotto il menu Applications che si trova a sinistra.

    • Preparazione dell'installazione dell'applicazione

      • Navigare su examples/jpa/dist-glassfish/jboss-seam-jpa.war.

      • Selezionare il pulsante OK.

    • Ora è possibile accedere all'applicazione all'indirizzo http://localhost:8081/jboss-seam-jpa/.

Usare Derby anziché Hypersonic SQL DB

Per fare funzionare l'applicazione così com'è con GlassFish abbiamo usato il database Derby (detto anche JavaDB) in GlassFish. Comunque è fortemente raccomandato che venga usato un altro database (ad esempio HSQL). examples/jpa/resources-glassfish/WEB-INF/classes/GlassfishDerbyDialect.class è un accorgimento per aggirare un problema di Derby nel server GlassFish. Va usato come dialect per Hibernate se si usa Derby con GlassFish.

seam-gen è uno strumento molto utile per i programmatori per avere velocemente un'applicazione pronta e funzionante, e fornisce la base su cui aggiungere le proprie funzionalità. Così com'è seam-gen produrrà un'applicazione configurata per girare su JBoss AS. Le seguenti istruzioni mostrano i passi necessari per farla girare su GlassFish.

Il primo passo è configurare seam-gen per costruire il progetto base. Ci sono diverse scelte fatte qui sotto, e in particolare i valori della datasource e di Hibernate che metteremo a posto una volta che il progetto è stato creato.

$ ./seam setup
Buildfile: build.xml

init:

setup:
[echo] Welcome to seam-gen :-)
[input] Enter your Java project workspace (the directory that contains your
Seam projects) [C:/Projects] [C:/Projects]
/projects
[input] Enter your JBoss home directory [C:/Program Files/jboss-4.2.3.GA]
[C:/Program Files/jboss-4.2.3.GA]

[input] Enter the project name [myproject] [myproject]
seamgen_example
[echo] Accepted project name as: seamgen_example
[input] Do you want to use ICEfaces instead of RichFaces [n] (y, [n])

[input] skipping input as property icefaces.home.new has already
been set.
[input] Select a RichFaces skin [blueSky] ([blueSky], classic, ruby, wine,
deepMarine, emeraldTown, japanCherry, DEFAULT)

[input] Is this project deployed as an EAR (with EJB components) or a WAR
(with no EJB support) [ear] ([ear], war)

[input] Enter the Java package name for your session beans
[com.mydomain.seamgen_example] [com.mydomain.seamgen_example]
org.jboss.seam.tutorial.glassfish.action
[input] Enter the Java package name for your entity beans
[org.jboss.seam.tutorial.glassfish.action]
[org.jboss.seam.tutorial.glassfish.action]
org.jboss.seam.tutorial.glassfish.model
[input] Enter the Java package name for your test cases
[org.jboss.seam.tutorial.glassfish.action.test]
[org.jboss.seam.tutorial.glassfish.action.test]
org.jboss.seam.tutorial.glassfish.test
[input] What kind of database are you using? [hsql] ([hsql], mysql, oracle,
postgres, mssql, db2, sybase, enterprisedb, h2)

[input] Enter the Hibernate dialect for your database
[org.hibernate.dialect.HSQLDialect]
[org.hibernate.dialect.HSQLDialect]

[input] Enter the filesystem path to the JDBC driver jar
[/tmp/seam/lib/hsqldb.jar] [/tmp/seam/lib/hsqldb.jar]

[input] Enter JDBC driver class for your database [org.hsqldb.jdbcDriver]
[org.hsqldb.jdbcDriver]

[input] Enter the JDBC URL for your database [jdbc:hsqldb:.]
[jdbc:hsqldb:.]

[input] Enter database username [sa] [sa]

[input] Enter database password [] []

[input] Enter the database schema name (it is OK to leave this blank) [] []

[input] Enter the database catalog name (it is OK to leave this
blank) [] []

[input] Are you working with tables that already exist in the database? [n]
(y, [n])

[input] Do you want to drop and recreate the database tables and data in
import.sql each time you deploy? [n] (y, [n])

[propertyfile] Creating new property file:
/home/mnovotny/workspaces/jboss/jboss-seam/seam-gen/build.properties
[echo] Installing JDBC driver jar to JBoss server
[copy] Copying 1 file to
/home/mnovotny/workspaces/jboss/jboss-seam/seam-gen/C:/Program
Files/jboss-4.2.3.GA/server/default/lib
[echo] Type 'seam create-project' to create the new project

BUILD SUCCESSFUL
Total time: 4 minutes 5 seconds

Scrivere $./seam new-project per creare il progetto e poi fare cd /projects/seamgen_example sulla nuova struttura che è stata creata.

Ora dobbiamo fare alcune modifiche al progetto generato.

resources/META-INF/persistence-dev.xml
resources/GlassfishDerbyDialect.class

Come per altri esempi è necessario includere questa classe per il supporto del database. Può essere copiata dall'esempio jpa nella cartella seamgen_example/resources.

$ cp \ 
$SEAM_DIST/examples/jpa/resources-glassfish/WEB-INF/classes/GlassfishDerbyDialect.class \ 
./resources
                     
resources/META-INF/jboss-app.xml

E' possibile cancellare questo file dato che non si sta mettendo in esecuzione su JBoss AS (jboss-app.xml è usato per abilitare l'isolamento del classloader in JBoss AS)

resources/*-ds.xml

E' possibile cancellare questi file dato che non si sta mettendo in esecuzione in JBoss AS (questi file definiscono le data source in JBoss AS, mentre qui stiamo usando la data source di default di GlassFish)

resources/WEB-INF/components.xml
  • Abilitare l'integrazione con le transazioni gestite dal container - aggiungere il componente <transaction:ejb-transaction/> e la sua dichiarazione di namespace xmlns:transaction="http://jboss.com/products/seam/transaction"

  • Modificare il jndi-pattern in java:comp/env/seamgen_example/#{ejbName}

resources/WEB-INF/web.xml

Come per l'esempio jee5/booking, occorre aggiungere un riferimento EJB a web.xml. Tecnicamente il tipo di riferimento non è necessario, ma lo aggiungiamo qui come buona pratica. Notare che questi riferimenti richiedono la presenza di un elemento local-home vuoto per mantenere la compatibilità con l'esecuzione in JBoss 4.x.


<ejb-local-ref
>              
    <ejb-ref-name
>seamgen_example/AuthenticatorAction</ejb-ref-name
>                
    <ejb-ref-type
>Session</ejb-ref-type
>     
    <local-home/>
    <local
>org.jboss.seam.tutorial.glassfish.action.Authenticator</local
>  
  </ejb-local-ref>
   
  <ejb-local-ref>
    <ejb-ref-name
>seamgen_example/EjbSynchronizations</ejb-ref-name
>  
    <ejb-ref-type
>Session</ejb-ref-type>
    <local-home/>
    <local
>org.jboss.seam.transaction.LocalEjbSynchronizations</local>
  </ejb-local-ref
>

Tenere presente che se si esegue in JBoss AS 4.x e si sono definiti i riferimenti EJB mostrati sopra nel web.xml, sarà necessario anche definire i nome JNDI locali in jboss-web.xml per ciascuno di essi, come mostrato sotto. Questo passo non è richiesto quando si esegue in GlassFish, ma viene riportato qui nel caso si esegua anche in JBoss AS 4.x (non è richiesto invece per JBoss AS 5).


<ejb-local-ref
>              
    <ejb-ref-name
>seamgen_example/AuthenticatorAction</ejb-ref-name
>                
    <local-jndi-name
>AuthenticatorAction</local-jndi-name
>  
  </ejb-local-ref>
   
  <ejb-local-ref>
    <ejb-ref-name
>seamgen_example/EjbSynchronizations</ejb-ref-name
>  
    <local-jndi-name
>EjbSynchronizations</local-jndi-name>
  </ejb-local-ref
>

Questa applicazione ha dei requisiti simili a quelli dell'esempio jee5/booking.