SeamFramework.orgCommunity Documentation
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
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
.
Per compilare l'esempio, eseguire semplicemente il target ant
di default:
$ ant
nella cartella examples/jee5/booking
. Questo creerà le cartelle dist
e exploded-archives
.
Metteremo in esecuzione l'applicazione su GlassFish usando la console di amministrazione GlassFish.
Accedere alla console di amministrazione all'indirizzo http://localhost:4848
Accedere all'opzione di menu Enterprise Applications
sotto il menu Applications
che si trova a sinistra.
In cima alla tabella delle Enterprise Applications
selezionare Deploy
. Seguire la procedura guidata usando questi suggerimenti:
Preparazione dell'installazione dell'applicazione
Navigare su examples/jee5/booking/dist/jboss-seam-jee5.ear
.
Selezionare il pulsante OK
.
Ora è possibile accedere all'applicazione all'indirizzo http://localhost:8081/seam-jee5/
.
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.
Per compilare l'esempio usare il target glassfish
:
$ ant glassfish
Questo creerà le cartelle specifiche per l'application server dist-glassfish
e exploded-archives-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/
.
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. Cambiamenti al file di configurazione
META-INF/persistence.xml
- i principali cambiamenti necessari sono la datasource JNDI, il passaggio alla classe che esegue la risoluzione del gestore delle transazioni di GlassFish e il cambiamento del dialect Hibernate che deve essere GlassfishDerbyDialect
.
WEB-INF/classes/GlassFishDerbyDialect.class
— questa classe è necessaria per cambiare il dialect Hibernate in GlassfishDerbyDialect
import.sql
— sia per il diverso dialect che per il database Derby le colonne ID
non possono essere popolate da questo file sono state rimosse.
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
Alterare il jta-data-source
in modo che sia jdbc/__default
. Useremo il database Derby integrato in GlassFish.
Sostituire tutte le proprietà con con quello che segue. Le differenze chiave sono descritte brevemente in Sezione 41.3.3, «Quali sono le differenze in GlassFish v2 UR2»:
<property name="hibernate.dialect" value="GlassfishDerbyDialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.SunONETransactionManagerLookup"/>
Sarà necessario alterare anche persistence-prod.xml
se si vuole mettere in esecuzione in GlassFish usando il profilo prod.
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
>
Vogliamo prendere il componente Seam POJO Authenticator
e creare da questo un EJB3.
Rinominare la classe in AuthenticatorAction
Aggiungere l'annotazione @Stateless
alla nuova classe AuthenticatorAction
.
Creare un'interfaccia chiamata Authenticator
che AuthenticatorAction
implementa (EJB3 richiede che i session bean abbiano una interfaccia local). Annotare l'interfaccia con @Local
e aggiungere un singolo metodo uguale al metodo authenticate
in AuthenticateAction
.
@Name("authenticator")
@Stateless
public class AuthenticatorAction implements Authenticator {
@Local
public interface Authenticator {
public boolean authenticate();
}
Abbiamo già aggiunto il suo riferimento nel file web.xml
quindi siamo pronti per partire.
Questa applicazione ha dei requisiti simili a quelli dell'esempio jee5/booking
.
Modificare il target di default in archive
(non tratteremo la messa in esecuzione automatica in GlassFish).
<project name="seamgen_example" default="archive" basedir="."
>
Occorre avere GlassfishDerbyDialect.class
nella nostra applicazione. Per fare questo trovare il task jar
e aggiungere la riga con GlassFishDerbyDialect.class
come mostrato qui sotto:
<target name="jar" depends="compile,copyclasses" description="Build the distribution .jar file">
<copy todir="${jar.dir}">
<fileset dir="${basedir}/resources">
<include name="seam.properties" />
<include name="*.drl" />
<include name="GlassfishDerbyDialect.class" />
</fileset
>
</copy>
...
A questo punto occorre mettere i jar supplementari nel file ear
. Individuare la sezione <copy todir="${ear.dir}/lib"
>
del target ear
. Aggiungere il seguente brano all'elemento contenuto <fileset dir="${lib.dir}"
>
.
Aggiungere le dipendenze Hibernate
<!-- Hibernate and deps -->
<include name="hibernate.jar"/>
<include name="hibernate-commons-annotations.jar"/>
<include name="hibernate-annotations.jar"/>
<include name="hibernate-entitymanager.jar"/>
<include name="hibernate-validator.jar"/>
<include name="jboss-common-core.jar"/>
Aggiungere dipendenze di terze parti
<!-- 3rd party and supporting jars -->
<include name="javassist.jar"/>
<include name="dom4j.jar"/>
<include name="concurrent.jar" />
<include name="cglib.jar"/>
<include name="asm.jar"/>
<include name="antlr.jar" />
<include name="commons-logging.jar" />
<include name="commons-collections.jar" />
Alla fine dovrebbe diventare qualcosa di questo genere:
<fileset dir="${lib.dir}">
<includesfile name="deployed-jars-ear.list" />
<!-- Hibernate and deps -->
<include name="hibernate.jar"/>
<include name="hibernate-commons-annotations.jar"/>
<include name="hibernate-annotations.jar"/>
<include name="hibernate-entitymanager.jar"/>
<include name="hibernate-validator.jar"/>
<include name="jboss-common-core.jar" />
<!-- 3rd party and supporting jars -->
<include name="javassist.jar" />
<include name="dom4j.jar" />
<include name="concurrent.jar" />
<include name="cglib.jar" />
<include name="asm.jar" />
<include name="antlr.jar" />
<include name="commons-logging.jar" />
<include name="commons-collections.jar" />
</fileset
>
Compilare l'applicazione chiamando ant
nella cartella principale del progetto (ad esempio /projects/seamgen-example
). Il risultato della compilazione sarà dist/seamgen-example.ear
.
Per eseguire l'applicazione seguire le istruzioni indicate qui Sezione 41.2.2, «Mettere in esecuzione l'applicazione su GlassFish» ma usare i riferimenti a questo progetto seamgen-example
anziché jboss-seam-jee5
.
Controllare l'applicazione all'indirizzo http://localhost:8081/seamgen_example/