1 / 32

EJB - laboratorium

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)

Download Presentation

EJB - laboratorium

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. EJB - laboratorium

  2. Agenda • tworzenie i instalacja session oraz entity EJB • dostęp do zdalnego obiektu • Konfiguracja serwera aplikacji JBoss

  3. 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)

  4. 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

  5. Fortune Teller Fortune Teller Jeśli istnieje wiele rekordów tylko jeden pobierany losowo! getFortune() Serwer Aplikacji FortuneTellerSB addFortune(String) klient FortuneEBLocal SQL/JDBC Baza Danych

  6. FortuneTeller – kod bean-a sesyjnego publicclassFortuneTellerEJBimplementsSessionBean,FortuneTellerSB{ publicvoidejbCreate()throwsCreateException{} publicStringgetFortune(){ .... } publicStringaddFortune(String fortune){ .... } publicvoidsetSessionContext(SessionContextarg0)throws....{} publicvoidejbRemove()throws....{} publicvoidejbActivate()throws.... {} publicvoidejbPassivate()throws.... {} }

  7. Fortune Teller – interfejsy • zdalny (remote) publicinterfaceFortuneTellerSB extends javax.ejb.EJBObject{ publicStringgetFortune() throws RemoteException; publicStringaddFortune(String fortune) throws RemoteException; } • domowy (home) publicinterfaceFortuneTellerSBHome extends javax.ejb.EJBHome{ FortuneTellerSBcreate()throwsCreateException, RemoteException; }

  8. FortuneCMP – interfejs lokalny publicinterfaceFortuneEBLocalextendsjavax.ejb.EJBLocalObject{ publicStringgetText(); publicvoidsetText(Stringtext); publicIntegergetId(); }

  9. FortuneCMP – lokalny interfejs domowy publicinterfaceFortuneEBLocalHomeextendsjavax.ejb.EJBLocalHome{ publicFortuneEBLocalcreate(Stringtext) throwsCreateException; publicjava.util.CollectionfindAll() throwsjavax.ejb.FinderException; publicFortuneEBLocalfindByPrimaryKey(Integerid) throwsjavax.ejb.FinderException; } • tworzenie • wyszukiwanie

  10. FortuneCMP 1/2 publicabstractclassFortuneCMPimplementsEntityBean{ publicabstractIntegergetId(); publicabstractvoidsetId(Integerid); publicabstractStringgetText(); publicabstractvoidsetText(Stringtext); publicIntegerejbCreate(Stringtext)throwsCreateException{ //enumerator bean albo sekwencje z bazy danych ... setId(id); setText(text); returnnull; } publicvoidejbPostCreate(Stringtext)throwsCreateException{}

  11. FortuneCMP 2/2 /*****Entitybeanspecificmethods********/ publicvoidsetEntityContext(EntityContextarg0) throws(...){} publicvoidunsetEntityContext()throws(...){} publicvoidejbLoad()throws(...){} publicvoidejbStore()throws(...){} publicvoidejbRemove()throws(...) {} publicvoidejbActivate()throws(...){} publicvoidejbPassivate()throws (...){} }

  12. 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> (...)

  13. 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>

  14. 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>

  15. 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>

  16. FortuneTeller – dostęp do EB 1/2 publicvoidejbCreate()throwsCreateException{ try{ InitialContextic=newInitialContext(); StringfortuneEBHomeJNDI= (String)ic.lookup("java:/comp/env/fortuneCMPRef"); java.lang.Objectobjref=ic.lookup(fortuneEBHomeJNDI); fortuneEBLocalHome=(FortuneEBLocalHome)objref; }catch(NamingExceptione){ thrownewCreateException( "could not get reference to entity bean"+e); } }

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

  18. 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>

  19. 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>

  20. 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>

  21. 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....

  22. 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

  23. 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)

  24. 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

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

  26. Dostęp do Bean – aplikacja klienta, podstawowe kroki • Uzyskanie kontekstu JNDI • Pobranie referencji do obiektu Home Bean poprzez JNDI • Uzyskanie referencji do interfejsu Beana metodą create() wywołaną na interfejsie home • Wywołanie metody biznesowej beana

  27. 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 =newInitialContext(); }catch(NamingExceptionne){;}

  28. Dostęp do metod Beana try{ FortuneTellerSBHomehome=(FortuneTellerSBHome) ctx.lookup("java:/ejb/FortuneSB"); FortuneTellerSBfortuneTeller=home.create(); fortuneTeller.createFortune( „myfortune1” ); fortuneTeller.createFortune( „myfortune2” ); String myFortune = fortuneTeller.getFortune(); log( „ Found fortune:” + myFortune); }catch(NamingExceptione){; } catch(CreateExceptione){;}

  29. Uruchomienie klienta • fortuneClient.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

  30. FortuneTeller - pokaz • kompletny kod • uruchomienie i analiza • wyjścia programu • logów serwera aplikacji • integracja z loggerem Jboss’a

  31. 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

  32. Projektowanie CMP - uwagi • Dostęp bezpośredni – specyfikacja zezwala ale nie używać – uzywać Fasady Sesyjnej • Przesyłanie danych – wzorzec Value Object • Generowanie kluczy głównych • XDoclet – programowanie deklaratywne - recepta na wiele ale nie na brak wiedzy • W EJB 3.0 wykorzystywane są tzw. anotacje

More Related