1 EJB e Portal Component Object http://desvino.altervista.org In

Transcript

1 EJB e Portal Component Object http://desvino.altervista.org In
1
EJB e Portal Component Object
http://desvino.altervista.org
In questo tutorial studiamo come sfruttare la tecnologia EJB, Enterprise JavaBean, all’interno del SAP
Netweaver Portal. In breve, EJB è un’architettura a componenti distribuita che permette lo sviluppo e il
deploy delle componenti business relativamente ad applicazioni J2EE.
In particolare, utilizziamo un bean session statless per ottenere dall’UME, User Management Engine, del
portale l’utente loggato. Non è scopo di questo tutorial illustrare nel dettaglio il funzionamento di EJB o di
un session bean nello specifico.
Nelle figure sottostanti elenchiamo i passi necessari per la creazione di un progetto di tipo J2EE – EJB
Module Project e di un session bean stateless con l’ausilio del NetWeaver Developer Studio (NWDS).
NWDS – Nuovo progetto J2EE – EJB Module Project
NWDS – nuovo EJB
2
EJB e Portal Component Object
http://desvino.altervista.org
NWDS – nome, progetto, tipo e package per il bean
Nella figura seguente vediamo le interfacce e classi da estendere:

Remote Interface: javax.ejb.EJBObject. Definisce i servizi che il bean deve implementare
(metodi di logica);

Home Interface: javax.ejb.EJBHome. La classe "Factory", cioè la classe che si occupa della
creazione del bean;

Bean Class: javax.ejb.SessionBean. Questa classe deve riprendere i metodi della Remote
Interface ed è questa che conterrà la logica applicativa vera e propria;

Local Interface: javax.ejb.EJBLocalObject. Come per Remote Interface, con la differenza che
l'accesso non avviene su rete;

Local Home: javax.ejb.EJBLocalHome. Come per Home Interface, con la differenza che l'accesso
è diretto;
3
EJB e Portal Component Object
http://desvino.altervista.org
NWDS – interfacce e superclassi per il bean
NWDS crea in automatico un deployment descriptor, ejb-jar.xml, ed un deployment descriptor specific per
il server J2EE, ejb-j2ee-engine.xml.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans
2.0//EN"
"http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<description>EJB JAR description</description>
<display-name>EJB JAR</display-name>
<enterprise-beans>
<session>
<ejb-name>TestEjbBean</ejb-name>
<home>it.videsfot.TestEjbHome</home>
<remote>it.videsoft.TestEjb</remote>
<local-home>it.videsoft.TestEjbLocalHome</local-home>
<local>it.videsoft.TestEjbLocal</local>
<ejb-class>it.videsoft.TestEjbBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-j2ee-engine SYSTEM "ejb-j2ee-engine.dtd">
4
EJB e Portal Component Object
http://desvino.altervista.org
<ejb-j2ee-engine>
<enterprise-beans>
<enterprise-bean>
<ejb-name>TestEjbBean</ejb-name>
<jndi-name>TestEjbBean</jndi-name>
<session-props/>
</enterprise-bean>
</enterprise-beans>
</ejb-j2ee-engine>
ejb-j2ee-engine.xml
La struttura completa del progetto è visibile nella figura sottostante. Sono presenti sia l’EJB module project
che l’ear.
Struttura progetto EJBTEST
La classe TestEjbBean implementa l’interfaccia SessionBean. Per il nostro scopo abbiamo bisogno di
implementare soltanto il metodo getUser(). Infatti, al suo interno creiamo un oggetto di tipo IUser ed
otteniamo dalla UMFactory l’utente loggato. I metodi get della classe IUser consentono di ottenere i dati
che ci interessano. Affinchè sia possibile utilizzare l’API UME è necessario aggiungere al build path relativo
al modulo EJB la libreria esterna com.sap.security.api presente nella cartella sap/ide/ie70/eclipse…
package it.videsoft;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.ejb.CreateException;
import com.sap.security.api.IUser;
import com.sap.security.api.UMFactory;
/**
EJB e Portal Component Object
5
http://desvino.altervista.org
* @ejbHome <{it.videsoft.TestEjbHome}>
* @ejbLocal <{it.videsoft.TestEjbLocal}>
* @ejbLocalHome <{it.videsoft.TestEjbLocalHome}>
* @ejbRemote <{it.videsoft.TestEjb}>
* @stateless
* @transactionType Container
*/
public class TestEjbBean implements SessionBean {
public void ejbRemove() {
}
public void ejbActivate() {
}
public void ejbPassivate() {
}
public void setSessionContext(SessionContext context) {
myContext = context;
}
private SessionContext myContext;
/**
* Business Method.
*/
public String getUser() {
IUser user = UMFactory.getAuthenticator().getLoggedInUser();
String result = "UniqueID: " + user.getUniqueID() + " " +
"UniqueName: " + user.getUniqueName() + " " +
"FirstName: " + user.getFirstName() + " " +
"LastName: " + user.getLastName() + " " +
"Name: " + user.getName() + " " +
"DisplayName: " + user.getDisplayName();
return result;
}
/**
* Create Method.
*/
public void ejbCreate() throws CreateException {
// TODO : Implement
}
TestEjbBean.java
package it.videsoft;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
public interface TestEjb extends EJBObject {
/**
* Business Method.
*/
public String getUser() throws RemoteException;
}
TestEjb.java
EJB e Portal Component Object
6
http://desvino.altervista.org
package it.videsoft;
import javax.ejb.EJBHome;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
public interface TestEjbHome extends EJBHome {
/**
* Create Method.
*/
public TestEjb create() throws CreateException, RemoteException;
}
TestEjbHome.java
package it.videsoft;
import javax.ejb.EJBLocalObject;
public interface TestEjbLocal extends EJBLocalObject {
/**
* Business Method.
*/
public String getUser();
}
TestEjbLocal.java
package it.videsoft;
import javax.ejb.EJBLocalHome;
import javax.ejb.CreateException;
public interface TestEjbLocalHome extends EJBLocalHome {
/**
* Create Method.
*/
public TestEjbLocal create() throws CreateException;
}
TestEjbLocalHome.java
Per effettuare il deploy sul server, creiamo un nuovo Enterprise Application Project ed aggiungiamo ad esso
il modulo EJB creato in precedenza.
ear deploy su J2EE
7
EJB e Portal Component Object
http://desvino.altervista.org
Utilizziamo l’EJB deployato sul nostro server J2EE, all’interno di un componente portale.
Creiamo un nuovo progetto di tipo Portal Application Project e chiamiamolo PCEjb, successivamente
creiamo un Portal Application Object e chiamiamo anch’esso PCEjb.
Il componente portale non far altro che richiamare l’EJB per ottenere dal metodo getuser l’utente loggato e
restituirlo nella response.
Il passo iniziale concerne lo specificare, all’interno dello Java Build Path relativo al progetto, raggiungibile
attraverso tasto destro -> properties, il progetto EJBTEST nella tab Projects (Required projects on the build
path).
PCEjb Java Build Path
package it.videsoft;
import
import
import
import
import
import
import
import
import
com.sapportals.portal.prt.component.*;
it.saisei.TestEjb;
it.saisei.TestEjbHome;
java.rmi.RemoteException;
javax.ejb.CreateException;
javax.naming.Context;
javax.naming.InitialContext;
javax.naming.NamingException;
javax.rmi.PortableRemoteObject;
public class PCEjb extends AbstractPortalComponent
{
public void doContent(IPortalComponentRequest request,
IPortalComponentResponse response)
{
8
EJB e Portal Component Object
http://desvino.altervista.org
try {
InitialContext ic = new InitialContext();
Context context = new InitialContext();
Object objref = context.lookup("TestEjbBean");
TestEjbHome home = (TestEjbHome)
PortableRemoteObject.narrow(objref,TestEjbHome.class);
try{
TestEjb testEjb = home.create();
response.write(testEjb.getUser());
}
catch(CreateException e) {response.write("Create Exception "
+ e.getMessage());}
catch(RemoteException e1) {response.write("Remote Exception "
+ e1.getMessage());}
}catch(NamingException e2) { response.write("Naming Exception " +
e2.getMessage());}
}
}
PCEjb.java
Nel file di configurazione portalapp.xml è necessario specificare il riferimento al progetto (ear) contenente
l’EJB, inserendo la riga
<property name="PrivateSharingReference" value="SAPJ2EE::sap.com/EJBTESTear"/>
<?xml version="1.0" encoding="utf-8"?>
<application>
<application-config>
<property name="PrivateSharingReference" value="SAPJ2EE::sap.com/EJBTESTear"/>
</application-config>
<components>
<component name="PCEjb">
<component-config>
<property name="ClassName" value="it.videsoft.PCEjb"/>
</component-config>
<component-profile/>
</component>
</components>
<services/>
</application>
portalapp.xml
L’ultimo passo concerne la creazione di una IView di tipo componente prortale e la sua esecuzione in
preview.
risultato dell’esecuzione di una Iview di tipo componente portale