Top Banner
EJB - laboratorium
32

EJB - laboratorium

Jan 02, 2016

Download

Documents

alan-sampson

EJB - laboratorium. Agenda. tworzenie i instalacja session oraz entity EJB dostęp do zdalnego obiektu Konfiguracja serwera aplikacji JBoss. Proces tworzenia aplikacji. interfejsy Beana (local, remote, home) implementacja Beana deskryptory (application, ejb-jar, serwera aplikacji) - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: EJB - laboratorium

EJB - laboratorium

Page 2: EJB - laboratorium

Agenda

tworzenie i instalacja session oraz

entity EJB dostęp do zdalnego obiektu Konfiguracja serwera aplikacji JBoss

Page 3: EJB - laboratorium

Proces tworzenia aplikacji

-interfejsy Beana (local, remote, home)-implementacja Beana-deskryptory (application, ejb-jar, serwera aplikacji)-kod klienta (jsp, servlet, pure Java)-złożenie (assemblacja – jar, war, ear)

Page 4: EJB - laboratorium

Nazewnictwo – dobre praktyki

<nazwaBeana> np. Fortune

- implementacja bean sesyjnego- FortuneEJB- implementacja bean encji CMP- FortuneCMP- implementacja bean encji BMP- FortuneBMP- Interfejs zdalny beana sesyjnego- FortuneSB- Interfejs lokalny beana sesyjnego - FortuneSBLocal- Interfejs zdalny beana encji- FortuneEB- Interfejs lokalny beana encji - FortuneEBLocal- Interfejs domowy zdalny beana sesyjnego- FortuneSBHome- Interfejs domowy lokalny beana sesyjnego - FortuneSBLocalHome- Interfejs domowy zdalny beana encji- FortuneEBHome- Interfejs domowy lokalny beana encji - FortuneEBLocalHome

Page 5: EJB - laboratorium

Serwer Aplikacji

Fortune Teller

klient

FortuneTellerSB

getFortune()

Fortune Teller

FortuneEBLocal

Baza Danych

SQL/JDBC

Jeśli istnieje wiele rekordów tylko jeden pobierany losowo!

addFortune(String)

Page 6: EJB - laboratorium

FortuneTeller – kod bean-a sesyjnego

public class FortuneTellerEJB implements SessionBean, FortuneTellerSB {

public void ejbCreate() throws CreateException {}

public String getFortune() { .... }public String addFortune(String fortune) { .... }

public void setSessionContext(SessionContext arg0) throws .... {}

public void ejbRemove() throws .... {}public void ejbActivate() throws .... {}public void ejbPassivate() throws .... {}}

Page 7: EJB - laboratorium

Fortune Teller – interfejsy

zdalny (remote)public interface FortuneTellerSB

extends javax.ejb.EJBObject {public String getFortune() throws

RemoteException; public String addFortune(String fortune)

throws RemoteException;}

domowy (home)public interface FortuneTellerSBHome

extends javax.ejb.EJBHome {FortuneTellerSB create() throws CreateException,

RemoteException;}

Page 8: EJB - laboratorium

FortuneCMP – interfejs lokalny

public interface FortuneEBLocal extends javax.ejb.EJBLocalObject{

public String getText();

public void setText(String text);

public Integer getId();

}

Page 9: EJB - laboratorium

FortuneCMP – lokalny interfejs domowy

public interface FortuneEBLocalHome extends javax.ejb.EJBLocalHome {

public FortuneEBLocal create(String text) throws CreateException;public java.util.Collection findAll() throws javax.ejb.FinderException;public FortuneEBLocal findByPrimaryKey(Integer id) throws javax.ejb.FinderException;

}

- tworzenie- wyszukiwanie

Page 10: EJB - laboratorium

FortuneCMP 1/2public abstract class FortuneCMP implements EntityBean{public abstract Integer getId();public abstract void setId(Integer id);public abstract String getText();public abstract void setText(String text);

public Integer ejbCreate(String text) throws CreateException {

//enumerator bean albo sekwencje z bazy danych ...setId(id);setText(text);return null;

}public void ejbPostCreate(String text) throws

CreateException {}

Page 11: EJB - laboratorium

FortuneCMP 2/2

/***** Entity bean specific methods ********/

public void setEntityContext(EntityContext arg0)

throws (...){}

public void unsetEntityContext() throws (...){}

public void ejbLoad() throws (...){}

public void ejbStore() throws (...){}

public void ejbRemove() throws (...) {}

public void ejbActivate() throws (...){}

public void ejbPassivate() throws (...) {}

}

Page 12: EJB - laboratorium

FortuneCMP – deskryptor ejb-jar.xml

(...)<enterprise-beans>

<entity> <ejb-name>FortuneCMP</ejb-name><local-home>edu.(...).FortuneEBLocalHome</local-home> <local>edu.(...).FortuneEBLocal</local><ejb-class>edu.(...).FortuneCMP</ejb-class>

<persistence-type>Container</persistence-type> <prim-key-class>java.lang.Integer</prim-key-class> <reentrant>False</reentrant> <cmp-version>2.x</cmp-version> <abstract-schema-name>FortuneCMP</abstract-schema-name>

<cmp-field><field-name>id </field-name></cmp-field>

<cmp-field><field-name>text </field-name></cmp-field> <primkey-field>id</primkey-field>

</entity> (...)

Page 13: EJB - laboratorium

FortuneCMP – deskryptorjbosscmp-jdbc.xml 1/2

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE jbosscmp-jdbc PUBLIC "-//JBoss//DTD JBOSSCMP-JDBC

3.0//EN" "http://www.jboss.org/j2ee/dtd/jbosscmp-jdbc_3_0.dtd">

<jbosscmp-jdbc> <defaults> <datasource>java:/DefaultDS</datasource> <datasource-mapping>Hypersonic SQL</datasource-mapping> </defaults> <enterprise-beans> -------- opisy wszystkich CMP bean ------- na następnym slajdzie </enterprise-beans></jbosscmp-jdbc>

Page 14: EJB - laboratorium

FortuneCMP – deskryptorjbosscmp-jdbc.xml 2/2

<enterprise-beans> <entity> <ejb-name>FortuneCMP</ejb-name> <create-table>true</create-table> <remove-table>false</remove-table> <table-name>t_fortune</table-name> <cmp-field> <field-name>id</field-name> <column-name>id</column-name> </cmp-field> <cmp-field> <field-name>text</field-name> <column-name>text</column-name> </cmp-field> </entity> </enterprise-beans>

Page 15: EJB - laboratorium

FortuneCMP – jboss.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE jboss PUBLIC "//JBoss//DTD JBOSS 3.0//EN http://www.jboss.org/j2ee/dtd/jboss_3_0.dtd">

<jboss> <enterprise-beans> <entity> <ejb-name>FortuneCMP</ejb-name> <local-jndi-name>ejb/FortuneCMP</local-jndi-name> </entity> <session> <ejb-name>MyFortuneSB</ejb-name> <jndi-name>ejb/FortuneSB</jndi-name> </session> </enterprise-beans></jboss>

Page 16: EJB - laboratorium

FortuneTeller – dostęp do EB 1/2

public void ejbCreate() throws CreateException {try { InitialContext ic = new InitialContext();

String fortuneEBHomeJNDI =(String)

ic.lookup("java:/comp/env/fortuneCMPRef");java.lang.Object objref = ic.lookup(fortuneEBHomeJNDI);fortuneEBLocalHome = (FortuneEBLocalHome) objref;

} catch (NamingException e) { throw new CreateException( "could not get reference to entity bean" + e); }}

Page 17: EJB - laboratorium

FortuneTeller – dostęp do EB 2/2public String getFortune() { try { Collection fortunes = fortuneEBLocalHome.findAll(); //w EJBQL można zrobić count()... if (fortunes.size() > 0) { int which= (int)(Math.random()* fortunes.size()); FortuneEBLocal fortune = (FortuneEBLocal) fortunes.toArray( new FortuneEBLocal[0])[which]; return fortune.getText(); } else logger.info("no fortunes in db - dummyFortune"); } catch (FinderException e) { logger.error("could not find fortune", e); } return "dummyFortune";}

Page 18: EJB - laboratorium

Fortune Teller – ejb-jar.xml 1/2

<?xml version="1.0"?><!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> <display-name>FortuneBeans</display-name> <enterprise-beans> <.......................... Na następnej stronie..........> </enterprise-beans> <assembly-descriptor> <container-transaction> <method> <ejb-name>MyFortuneSB</ejb-name> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor></ejb-jar>

Page 19: EJB - laboratorium

Fortune Teller – ejb-jar.xml 2/2

<enterprise-beans> <session> <ejb-name>MyFortuneSB</ejb-name> <home>edu.agh.dsrg.sius.fortune.FortuneTellerSBHome</home> <remote>edu.agh.dsrg.sius.fortune.FortuneTellerSB</remote> <ejb-class>edu.agh.dsrg.sius.fortune.FortuneTellerEJB</ejb-

class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> <env-entry> <env-entry-name>fortuneCMPRef</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>ejb/FortuneCMP</env-entry-value> </env-entry> </session> </enterprise-beans>

Page 20: EJB - laboratorium

FortuneTeller – jboss.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 3.0//EN"

"http://www.jboss.org/j2ee/dtd/jboss_3_0.dtd"><jboss> <enterprise-beans> <session> <ejb-name>MyFortuneSB</ejb-name> <jndi-name>ejb/FortuneSB</jndi-name> </session> </enterprise-beans> <resource-managers> </resource-managers></jboss>

Page 21: EJB - laboratorium

FortuneTeller – plik jar

Struktura pliku jar: /META-INF/jboss.xml /META-INF/ejb-jar.xml /edu/agh..../*.class

(pliki klas zgodnie z nazwami pakietów)

Uwaga na wielkość liter....

Page 22: EJB - laboratorium

FortuneTeller – desktyptor aplikacji

Deskryptor aplikacji – application.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE application PUBLIC '-//Sun Microsystems, Inc.//DTD

J2EE Application 1.2//EN' 'http://java.sun.com/j2ee/dtds/application_1_2.dtd'>

<application> <display-name>Fortune</display-name> <module> <ejb>FortuneEJB.jar</ejb> </module></application>

Pominięto plik war dla aplikacji webowych

Page 23: EJB - laboratorium

FortuneTeller – plik ear

Struktura pliku ear: /META-INF/application.xml /FortuneEJB.jar

nazwa zgodna z tą w deskryptorze!! /FortuneWEB.war

(opcjonalnie plik war – tu pomijamy)

Page 24: EJB - laboratorium

JBoss - uruchomienie aplikacji

Serwer aplikacji (JBoss) www.jboss.org - rozpakować i ustawić

JAVA_HOME u nas JBHome = np. /tmp/${id}/jboss-3.2.7 uruchomienie {JBHome}/bin/run.sh

Plik aplikacji (ear lub jar) do {JBHome}/server/default/deploy

Logi w {JBHome}/server/default/log

Konsola admina – localhost:8080/jmx-console

Page 25: EJB - laboratorium

JBoss - pokaz

- kompletny kod *.java- zawartość plików jar, ear- uruchomienie JBoss’a- instalowanie aplikacji (deploying)

- Analiza logów

Page 26: EJB - laboratorium

Dostęp do Bean – aplikacja klienta, podstawowe kroki

Uzyskanie kontekstu JNDIPobranie referencji do obiektu Home Bean poprzez JNDIUzyskanie referencji do interfejsu Beana metodą create() wywołaną na interfejsie homeWywołanie metody biznesowej beana

Page 27: EJB - laboratorium

Kontekst JNDI

InitialContext (jndi.properties) INITIAL_CONTEXT_FACTORY

java.naming.factory.initial=

org.jnp.interfaces.NamingContextFactory PROVIDER_URL

java.naming.provider.url=

jasmin.ics.agh.edu.pl:1099

try {

Context ctx = new InitialContext();

} catch (NamingException ne) {;}

Page 28: EJB - laboratorium

Dostęp do metod Beana

try {

FortuneTellerSBHome home = (FortuneTellerSBHome)

ctx.lookup("java:/ejb/FortuneSB"); FortuneTellerSB fortuneTeller = home.create(); fortuneTeller.createFortune( „myfortune1” ); fortuneTeller.createFortune( „myfortune2” ); String myFortune = fortuneTeller.getFortune(); log( „ Found fortune:” + myFortune);} catch (NamingException e) {;} catch (CreateException e) {;}

Page 29: EJB - laboratorium

Uruchomienie klientafortuneClient.jar FortuneClient FortuneSB FortuneSBHome

plik jbossall-client.jar zgodność wersji! {JBOSS_HOME}/client/

plik jndi.properties

java -classpath jbossall-client.jar;fortuneClient.jar edu.agh.dsrg.sius.fortune.FortuneClient

Page 30: EJB - laboratorium

FortuneTeller - pokaz

kompletny kod uruchomienie i analiza wyjścia programu logów serwera aplikacji integracja z loggerem Jboss’a

Page 31: EJB - laboratorium

JBoss – uruchomienie aplikacji

Tworzmy jar, ear (jak poprzednio)Konfigurujemy bazę danych

nazwa (taka jak w jbosscmp-jdbc.xml ) domyślnie DefaultDB - Hypersonic (hsqldb-ds.xml) Inne (Postgress, Oracle) –

pliki w {JBossRoot}/docs/examples/jca/*.xml ustawić parametry – host, port, hasło – i do katalogu

deploy

Klient się nie zmienia !!!!! – podstawa zaleta architektury wielowarstwowej

Page 32: EJB - laboratorium

Projektowanie CMP - uwagi

Dostęp bezpośredni – specyfikacja zezwala ale nie używać – uzywać Fasady SesyjnejPrzesyłanie danych – wzorzec Value ObjectGenerowanie kluczy głównychXDoclet – programowanie deklaratywne - recepta na wiele ale nie na brak wiedzy

W EJB 3.0 wykorzystywane są tzw. anotacje