TP TUSC : Développement d`application J2EE en utilisant

publicité
TP TUSC : Développement d’application
J2EE en utilisant Lomboz & JBoss
~ Chapitre 3 ~
Dans ce chapitre, nous allons créer un EJB de type Session sans état. Cela signifie que la
session de l’EJB sera ouverte juste pendant le temps de traitement de la requête par l’EJB. Une fois
que l’EJB a répondu, la session est fermée. (idem chapitre 1, sauf que là on va l’appliquer au vrai sujet
du TP TUSC : le magasin qui vend ses produits en-ligne)
1/ Création d’un nouveau projet J2EE
Pour ceux qui n’auraient pas retenu la leçon du chapitre 1, voici toute la démarche :
- File > New > Lomboz J2EE Project
- Nom du projet : MyStore
- NEXT
- Vérifier que vous avez bien les répertoires src et bin
- NEXT
- Ajouter un module WEB qui s’appellera : OnlineStore
- Ajouter un module EJB qui s’appellera : MyStoreMgr
- Ajouter comme serveur cible : JBOSS 3.2.5
- FINISH
2/ Création de l’EJB sans état
-
Clic-droit sur le répertoire src du projet MyStore > New > Lomboz EJB Creation
Wizard
Nom du package : au.com.tusc.session
Nom du bean : StoreAccess
Type du bean : Stateless
FINISH
Vous pourrez remarquer au passage, que dans le fichier qui est généré, il y a ce qu’on appelle
un tag qui sert à définir le nom de notre bean, son type et le nom qui va lui être associé dans le
JNDI. Il sert aussi à générer des descripteurs de déploiement dans certains fichiers xml, c’est à
dire qu’il génère des « bloc » de code de description des fichiers à créer pour installer l’EJB
sur un serveur.
3/ Modification du fichier xdoclet.xml pour mettre en place une
interface d’accès distant (DAO)
-
Dans la section « <ejbdoclet », vérifiez que vous avez bien le tag suivant :
<dao pattern="{0}" destdir="${project.dir}/${ejbsrc.dir}"/>
NB : normalement, il se met tout seul grâce à la version de Lomboz que nous utilisons.
-
Dans la section « <jboss » de la section « <ejbdoclet », il y a 3 lignes à modifier (vous ne
pouvez pas les manquer, car c’est marqué « PLEASE_MODIFY_THIS ». Voici ce qu’il
faut y mettre :
4/ Création de l’interface DAO
-
-
Clic-droit sur le répertoire src du projet MyStore > New > Package
Nom du package : au.com.tusc.dao
Clic-droit sur le répertoire src du projet MyStore > New > Class
Nom de la classe : StoreAccessDAOImpl
Ajouter un tag dans le code de cette nouvelle classe pour générer son interface ensuite :
@ejb.dao class="au.com.tusc.session.StoreAccessDAO"
impl-class="au.com.tusc.dao.StoreAccessDAOImpl"
-
Ensuite, ajouter StoreAccessBean au module MyStoreMgr :
Clic-droit sur StoreAccessBean du projet MyStore > Lomboz J2EE > Add EJB to
Module
-
Ensuite, générer les fichiers liés à l’EJB StoreAccessBean :
Clic-droit sur le répertoire MyStoreMgr du projet > Lomboz J2EE > Generate EJB
Classes
 les interfaces liées à l’EJB sont générées, y compris celle du DAO (grâce
au tag que nous avons ajouté)
5/ Ajout d’une Business Method à notre EJB
-
Clic-droit sur la classe StoreAccessBean dans l’explorateur > New > Lomboz Ejb
Method Wizard
Entête de la méthode :
public String loginUser (String username, String password)
type de la méthode : Business
Interface de type Remote (distante)
FINISH
-
Ajouter un tag dans StoreAccessBean afin que cet EJB puisse utiliser le DAO :
@dao.call name="loginUser"
-
enfin, il faut re-générer les fichiers de MyStore :
o Clic-Droit sur le répertoire MyStore dans le répertoire MyStoreMgr >
Lomboz J2EE > Generate EJB Classes
Après avoir généré de nouveau les classes de l’EJB, vous pouvez constater que de nouvelles
fonctions ont été ajoutées StoreAccessDAO (dans le répertoire ejbsrc). Attention, vous ne devez pas
modifier ces fichiers car ils sont générés par Xdoclet et donc écrasés à chaque nouvelle génération
des fichiers. Si vous avez un problème, plutôt que de bidouiller ces fichiers pour une solution
temporaire, bidouillez les fichiers qui en sont la source (soit les JAVA, soit les XML).
6/ Implémentation de l’Interface DAO
Voici le code à mettre dans StoreAccessDAOImpl.java pour implémenter l’interface DAO :
package au.com.tusc.dao;
import au.com.tusc.session.StoreAccessDAO;
import au.com.tusc.sessionState.StoreAccessStateDAO;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class StoreAccessDAOImpl implements StoreAccessDAO, StoreAccessStateDAO{
private DataSource jdbcFactory;
public void init(){
System.out.println("Entering StoreAccessDAOImpl.init()");
InitialContext c = null;
if (this.jdbcFactory == null){
try{
c = new InitialContext();
this.jdbcFactory = (DataSource) c.lookup("java:comp/env/jdbc/DefaultDS");
}catch(Exception e){
System.out.println("Error in StoreAccessDAOImpl.init()");
}
}
System.out.println("Leaving StoreAccessDAOImpl.init()");
} //init()
public String loginUser (String username , String password){
System.out.println("Entering StoreAccessDAOImpl.loginUser()");
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
String userID = null;
try{
conn = jdbcFactory.getConnection();
String QueryString = "select userid from storeaccess where username=? and password=?";
ps = conn.prepareStatement(QueryString);
ps.setString(1,username);
ps.setString(2,password);
rs = ps.executeQuery();
boolean result = rs.next();
if(result){
userID = rs.getString("userid");
System.out.println("UserID is " + userID);
}
}catch(SQLException e){
e.printStackTrace();
System.out.println("Inside StoreAccessDAOImpl.loginUser() " +e);
}
finally{
try{
rs.close();
ps.close();
conn.close();
}catch(Exception e){
}
}
System.out.println("Leaving StoreAccessDAOImpl.loginUser()");
return userID;
} //loginUser()
} // StoreAccessDAOImpl
Ensuite il faut compléter le code de StoreAccessBean afin d’implémenter loginUser et la gestion du
contexte de session :
public abstract class StoreAccessBean implements SessionBean {
/**
* @ejb.interface-method
*
view-type="remote"
* @dao.call name="loginUser"
**/
public String loginUser (String username, String password){
System.out.println("Entering StoreAccessBean");
System.out.println("Leaving StoreAccessBean");
return null;
}
protected SessionContext ctx;
public void setSessionContext(SessionContext ctx){
this.ctx = ctx;
}
public void unsetSessionContext(){
this.ctx = null;
}
}
Puis il faut encore ajouter des tags supplémentaires dans StoreAccessBean pour pouvoir le déployer
correctement :
Tout est fini ! Y’a plus qu’à installer notre EJB sur le serveur et à créer un client pour le tester !
- Pour cela, re-générez les classes de l’EJB :
o Clic-Droit sur le répertoire MyStore dans le répertoire MyStoreMgr
Lomboz J2EE > Generate EJB Classes
>
- Allez dans le Lomboz J2EE View, puis lancer le serveur de MyStoreMgr (en mode Debug
ou en mode Normal, c’est suivant si vous avez des problèmes ou pas) :
- Déployez le module MyStoreMgr sur le serveur :
7/ Création d’un client pour tester l’EJB Stateless
- Clic-droit sur src du projet MyStore > New > Lomboz EJB Test Client Wizard
o Nom du package : au.com.tusc.client
o Nom du client : SessionClient
o EjbHome : au.com.tusc.session.StoreAccessHome
o EjbInterface : au.com.tusc.session.StoreAccess
- Complétez le code source de votre client :
package au.com.tusc.client;
import java.rmi.RemoteException;
import java.util.Hashtable;
import javax.ejb.CreateException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class SessionClient {
private au.com.tusc.session.StoreAccessHome getHome()
throws NamingException {
return (au.com.tusc.session.StoreAccessHome) getContext().lookup(
au.com.tusc.session.StoreAccessHome.JNDI_NAME);
}
private InitialContext getContext() throws NamingException {
Hashtable props = new Hashtable();
props.put(InitialContext.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
props.put(InitialContext.PROVIDER_URL, "jnp://127.0.0.1:1099");
// This establishes the security for authorization/authentication
// props.put(InitialContext.SECURITY_PRINCIPAL,"username");
// props.put(InitialContext.SECURITY_CREDENTIALS,"password");
InitialContext initialContext = new InitialContext(props);
return initialContext;
}
public void testBean() {
try {
au.com.tusc.session.StoreAccess myBean = getHome().create();
//-------------------------------------//This is the place you make your calls.
//System.out.println(myBean.callYourMethod());
System.out.println("Request from client : ");
System.out.println("Reply from Server: Your userid is "
+ myBean.loginUser("ANDY","PASSWD"));
} catch (RemoteException e) {
e.printStackTrace();
} catch (CreateException e) {
e.printStackTrace();
} catch (NamingException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
SessionClient test = new SessionClient();
test.testBean();
}
}
- ENFIN, vous pouvez tester votre client :
o Run > Run As...> Java Application
- Voici le résultat que vous devriez observer dans votre console :
PETITE ASTUCE DE DERNIERE MINUTE :
Si Eclipse ne reconnaît pas certains noms du style « StoreAccess », pensez à leur
ajouter le chemin de packages (qui les contiennent) en tant que préfixe :
« au.com.tusc.StoreAccess »
Téléchargement