Title: J2EE - Servlets Java Server Pages,EJB
1J2EE - ServletsJava Server Pages,EJB
- Lumír Návrat.katedra informatiky FEI VŠB-TUO
- A-1018 / 597 323 252
- lumir.navrat_at_vsb.cz
2Obsah
- Architektura Java EE
- Struktura webové aplikace
- Java Servlets
- Java Server Pages
- Použití JavaBeans
- Uživatelské znacky
- Knihovny znacek (JSTL)
- JDBC
- Enterprise JavaBeans
3Architektura Java EE
4Soucásti Java EE
- Servlets JSP webové komponenty a UI
- JDBC práce s databázemi
- EJB distribuované komponenty
- JAXP práce s XML, zasílání zpráv
- JNDI jmenné a adresárové služby
- RMI volání vzdálených metod
- JavaIDL distribuované objekty CORBA
- JMS asynchronní zpracování zpráv
- JavaMail zasílání zpráv e-mailem
- JTA distribuované transakce
- JCA pripojení k jiným systémum (napr. SAP)
- JPA - Java Persistent Api (novinka v Java 5 EE)
5Architektura Java EE
6Struktura webové aplikace
http//www.lib.com/catalog
- Servlety
- .class
- Statický obsah
- .html, .jpg, .gif,
- JSP
- .jsp
- Knihovny tríd
- .jar
WEB-INF
classes
lib
jsp
web.xml
images
index.jsp
http//www.lib.com/catalog/WEB-INF/...
7Konfiguracní soubor web.xml
- Základní konfigurace webové aplikace
- Definuje
- Servlety, filtry
- Zabezpecení adresáru a metody prístupu k aplikaci
- Reference na JNDI zdroje
8Java Servlets
- Standardní metoda rozširování webových serveru o
dynamické generování obsahu - Základní rozhraní pro aplikace s tenkým klientem
(webový prohlížec)
WebBrowser
Java Servlet Container
Servlet
Servlet
9Výhody servletu
- Perzistence mezi voláními rychlejší odezva na
požadavky, sdílení dat - CGI opakované zavádení
- Prístup k celému Java API
- JDBC databáze
- JAXP práce s XML
- JNDI adresárové služby
10Servletový kontejner
- Zajištuje beh servletu
- JVM
- Správa sezení
- Udržování kontextu
- Konfiguracní informace
- Perzistence
- Ruzní dodavatelé standardizace
- Java Servlet API 2.5 (aktuální revize)
11Typy servletových kontejneru
- Rozšírení WWW serveru
- Apache/JServ
- S vestaveným WWW serverem
- Jetty (Mortbay.com)
- Apache Tomcat referencní implementace
- Samostatné aplikacní servery
- Sun Application Server / Glassfish
- JBoss
- WebSphere (IBM)
12Java Servlet API
GenericServlet servletInfoinit()servic
e(request, response)destroy()
ServletConfig servletName getInitParameter(n)
servletConfig
1
1
servletContext
1
ServletContext attribute(n) getInitParameter(
n)
HttpServlet lastModifieddoGet()doPost(
)
javax.servlet.javax.servlet.http.
13Reprezentace požadavku
ServletRequest remoteHost, parameter(name) r
eader
http//www.lib.com/catalog - context path
HttpServletRequest contextPathheader(name)cook
ies
HttpSession attribute(n) removeAttribute(n)
invalidate()
session
1
14Reprezentace odpovedi
ServletResponse contentTypewriteroutputStream
HttpServletResponse header(name)addCookie(cooki
e)addHeader(name, value)sendError(sc, msg)
15lt?xml version"1.0" encoding"UTF-8"?gt ltweb-app
version"2.4" xmlns"http//java.sun.com/xml/ns/j2
ee" xmlnsxsi"http//www.w3.org/2001/XMLSchema-in
stance" xsischemaLocation"http//java.sun.com/xm
l/ns/j2ee http//java.sun.com/xml/ns/j2ee/we
b-app_2_4.xsd"gt ltdisplay-namegtCvicení
2lt/display-namegt ltdescriptiongtPríklady pro
cvicení 2 - servlety a JSP.lt/descriptiongt
ltfiltergt ltfilter-namegtencodinglt/filter-namegt
ltfilter-classgtcviceni2.RequestEncodingFilte
rlt/filter-classgt ltinit-paramgt
ltparam-namegtencodinglt/param-namegtltparam-valuegtUTF-
8lt/param-valuegt lt/init-paramgt lt/filtergt
ltservletgt ltservlet-namegtukol1lt/servlet-namegt
ltservlet-classgtctc.Ukol1Servletlt/servlet-classgt
lt/servletgt ltservlet-mappinggt
ltservlet-namegtukol1lt/servlet-namegtlturl-patterngt/he
llolt/url-patterngt lt/servlet-mappinggt
ltfilter-mappinggt ltfilter-namegtencodinglt/filt
er-namegtlturl-patterngt/lt/url-patterngt
lt/filter-mappinggt lt/web-appgt
16Úkol 1 - Vytvorení Servletu
- Vytvorte novou webovou aplikaci
- V rámci této webové aplikace vytvorte servlet,
který bude zobrazovat HTML text
17Java Server Pages
- Oddelení prezentace od aplikacní logiky
- Zjednodušení realizace stránek
- Servlety na všechno
- Statický obsah HTML servlety pro akce
- Dynamický obsah v rámci statického
- Možnost editace HTML editory
- Kompilace na Java servlet
- Pri prvním požadavku, kontrolují se zmeny
18Prvky JSP
- Direktivy
- lt_at_ page contentTypetext/html gt
- Vložený úsek programu (skriplet)
- lt out.println(x x) gt
- Výraz
- x lt x gt
- Statický kód
- lt! public String sayHello() gt
- Poznámka
- lt-- Tento kód se neprovede a nezobrazí ani v
HTML stránce --gt - Vestavené znacky akcí
- ltjspinclude page/headers/header.jsp /gt
- Uživatelem definované znacky
- ltmyDate /gt
- lt _at_ taglib urihttp//lib.com/tags prefixmy gt
19Príklad 1
- lt_at_ page contentTypetext/html charsetUTF-8
gt - lt_at_ page importjava.util. gt
- lthtmlgt
- ltheadgt
- lttitlegtPrvní pokuslt/titlegt
- lt/headgt
- ltbodygt
- lth1gtVítejte na mé stráncelt/h1gt
- ltpgtDnešní datum je lt new Date().toString()
gtlt/pgt - lt/bodygt
20Príklad 2
- lt_at_ page contentType"application/vnd.ms-excel"
gt - lt
- out.println("x\tx2")
- for(int i 1 i lt 10 i)
- out.println(I "\t (i i))
-
- gt
21Príklad 3
- lt
- Iterator i cart.getItems().iterator()
- while (i.hasNext())
- ShoppingCartItem item (ShoppingCartItem)i.
next() - BookDetails bd (BookDetails)item.getItem()
- gt
- lttrgt
- lttd align"right bgcolor"ffffff"gt
- ltitem.getQuantity() gt
- lt/tdgtlttd bgcolor"ffffaa"gt
- ltstronggtlta href"ltrequest.getContextPath
()gt - /bookdetails?bookIdbd.getBookId
()"gt - bd.getTitle()lt/agtlt/stronggt
- lt/tdgt
- ...
- lt
- // End of while
-
- gt
22Úkol 2
- Vytvorte JSP stránku, která bude vypisovat
tabulku s druhými mocninami císel do 10. Použijte
nejen scriplet, ale rovnež výraz.
23Preddefinované promenné
- HttpServletRequest request
- lt request.getRemoteHost() gt
- HttpServletResponse response
- HttpSession session
- PrintWriter out
- ServlerContext application
- ServletConfig config
- PageContext pageContext
- page ( this)
24Komponenty Java Beans - opakování
- Konstruktor
- public StringBean()
- Vlastnosti (properties)
- private String msg Nic
- public String getMsg() return msg
- public void setMsg(String m) msgm
- Metody
- public void clear() msg Nic
- Události (events)
25Príklad
- package ctc
- import java.util.Hashtable
- import java.util.Collection
- public class SeznamUzivatelu
-
- private Hashtable tabulka new Hashtable()
- public void uloz(Uzivatel u)
- tabulka.put(u.getLogin(), u)
- public Uzivatel hledej(String login)
- return (Uzivatel)tabulka.get(login)
- public Collection getSeznam() return
tabulka.values()
26Použití JavaBeans v JSP
- Zavedení komponenty
- ltjspuseBean idsb classStringBean /gt
- Prístup k vlastnostem
- ltjspgetProperty namesb propertymsg /gt
- Nastavení vlastnosti
- ltjspsetProperty namesb propertymsg
valueAhoj /gt - ltjspsetProperty namesb propertymsg
parammessage /gt - ltjspsetProperty namesb property /gt
27Sdílení komponent
- ltjspuseBean id class scope/gt
- scopepage (implic. hodnota)
- v objektu PageContext
- viditelná pouze v rámci stránky
- scoperequest
- v objektu ServletRequest
- viditelná v rámci požadavku (požadavek muže být
zpracován více stránkami!) - scopesession
- v objektu HttpSession
- sdílená mezi ruznými požadavky v rámci sezení
jednoho uživatele - scopeapplication
- v objektu ServletContext
- sdílí se všemi servlety ve stejné aplikaci
28Úkol 3
- Upravte predchozí JSP tak, že budete z jiného
souboru predávat hodnotu parametru který bude
urcovat maximální hodnotu pro kterou se budou
druhé mocniny pocítat
29Uživatelské znacky
- Trída obslužného programu (handler)
- rozhraní javax.servlet.jsp.tagext.Tag
- metody doStartTag(), doEndTag(), od J2EE 1.3
- metoda doTag() od J2EE 1.4
- Deskriptor knihovny znacek
- soubor xxx.tld ve formátu XML
- Soubor JSP používající znacky
- lt_at_ taglib urixxx.tld prefixxxxgt
- ltxxxznacka paramgt lt/xxxznackagt
30Príklad DatumTag.java
- package ctc.tags
- import javax.servlet.jsp.
- import javax.servlet.jsp.tagext.
- public class DatumTag extends SimpleTagSupport
- public int doTag()
- JspWriter outgetJspContext().getOut()
- try
- //kód pred telem
- JspFragment fgetJspBody()
- if (f ! null) f.invoke(out)
- //kód za telem
- catch( java.io.IOException e )
- return SKIP_BODY
-
31Príklad tis-taglib.tld
- lt?xml version"1.0" encodingiso-8859-2 ?gt
- lttaglib xmlns"http//java.sun.com/xml/ns/j2ee"
xmlnsxsi"http//www.w3.org/2001/XMLSchema-insta
nce" xsischemaLocation"http//java.sun.com/xm
l/ns/j2ee http//java.sun.com/xml/ns/j2ee/web-jspt
aglibrary_2_0.xsd" version"2.0"gt - lttlibversiongt1.0lt/tlibversiongt
- ltshortnamegttislt/shortnamegt
- lturigt/ctc/datumlt/urigt
- ltinfogtKnihovna znacek pro CTClt/infogt
- ltnamegtDatumTaglt/namegt
- lttag-classgtctc.tags.DatumTaglt/tag-classgt
- ltbody-contentgtemptylt/body-contentgt
- ltattributegt
- ltnamegtformatlt/namegt
- lttypegtjava.lang.Stringlt/typegt
- lt/attributegt
- lt/taggtlt/taglibgt
32Príklad tags.jsp
- lt_at_ taglib uri"/WEB-INF/tis-taglib.tld"
prefixtis" gt - Dnes je lttisdatum/gt
33Úkol 4
- Vytvorte stránku, ve které budete ukládat do
session jméno uživatele, které zadá do formuláre. - Následne vytvorte uživatelskou znacku, která bude
toto jméno nacítat z této promenné a zobrazovat.
Pokud nebude zadáno, tak vypíše místo toho
nejakou náhradní hodnotu.
34JSTL JavaServer Standard Tag Library
- Core
- výrazy ltcout value/gt
- tok rízení ltcforEach var
items"gtlt/cforEachgt - práce s URL ltcurl var value/gt
- XML
- analýza ltxparse /gt
- transformace ltxtransform xslt xml/gt
- I18n (Internationalization)
- formátování textu ltfmtmessage
key/gt - formátování císel a data/casu ltfmtformatDate /gt
- Database
- volba zdroje dat ltsqlsetDataSource
dataSource/gt - SQL dotazy a transakce ltsqlquery
vargtlt/sqlquerygt - Function (prefix fn)
- velikost kolekce, manipulace s retezci
fnlength(items)
35Príklad
- lt_at_ page contentType"text/html encodingUTF-8"
gt - lt_at_ taglib uri"/WEB-INF/c.tld" prefix"c" gt
- ltjspuseBean id"uzivatele" classctc.SeznamUziva
telu" scope"session"gt - lt uzivatele.uloz(new Uzivatel("wal314",
"Johnny", "Walker")) gt - lt/jspuseBeangt
- lthtmlgt
- ltbodygt
- lth2gtSeznam uživatelult/h2gt
- lttable border"1"gt
- ltcforEach var"uziv" varStatus"st"
items"uzivatele.seznam"gt - lttrgt
- lttdgtltcout value"st.count"/gtlt/tdgt
- lttdgtltcout value"uziv.login"/gtlt/tdgt
- lttdgtuziv.jmeno"/gt ltcout value"uziv.prijme
ni"/gtlt/tdgt - lt/trgt
- lt/cforEachgt
- lt/tablegt
- lt/bodygt
- lt/htmlgt
36Úkol 5
- V rámci JSP stránky implementujte logiku pro
stránkování kolekce. Pro rešení použijte znacky
JSTL.
37Java Database ConnectivityJDBC
38JDBC
- rozhraní pro unifikovaný prístup k datum
- použití i mimo databáze data ve forme tabulek
(CSV, XLS, ...) - ovladace jsou k dispozici pro vetšinu
databázových systému - inspirováno rozhraním ODBC
- objektové rozhraní
- možnost spolupráce s ODBC
39Architektura JDBC
Aplikacní kód
JDBC API
java.sql.javax.sql.
Ovladac JDBC
DB API
Databáze
40Architektura JDBC
ResultSet
ResultSet
ResultSet
PreparedStatement
CallableStatement
Statement
Connection
Aplikace
DriverManager
Oracle driver
JDBC-ODBC bridge
Sybase driver
ODBC driver
41JDBC ovladac
- zprostredkování komunikace aplikaces konkrétním
typem databáze - implementován obvykle výrobcem databáze
- dotazovací jazyk SQL
- predá se databázi
- ovladac vyhodnotí prímo
- reprezentován specifickou trídou
- sun.jdbc.odbc.JdbcOdbcDriver
- org.gjt.mm.mysql.Driver
42Typy JDBC ovladacu
- Typ 1
- využívá ODBC (pres JDBC-ODBC bridge)
- obtížne konfigurovatelné
- Typ 2
- komunikace s nativním ovladacem
- Typ 3
- komunikuje s centrálním serverem (Network Server)
sítovým protokolem - pro rozsáhlé heterogenní systémy
- Typ 4
- založen ciste na jazyce Java
- prímý prístup do databáze
43Registrace ovladace
- konkrétní ovladac je pevne spojen s aplikací
- new com.mysql.Driver()
- výber ovladace za behu aplikace
- String driverName com.mysql.Driver
- try
- Class.forName(driverName)
- catch( ClassNotFoundException e)
- // obsluha výjimky
-
44Identifikace spojení
- jdbcdriverdatabase
- jdbcodbcdatasourceAttrValue
- Príklad
- jdbcmysql//localhost/dais3?userdais3password
dais3useUnicodetruecharacterEncodingiso-885
9-2
45Pripojení k databázi
- Connection con DriverManager.getConnection(
- url, uživatel, heslo)
- DriverManager se dotáže všech registrovaných
ovladacu - Rozpozná-li ovladac své url, vrátí objekt
Connection
46Objekt Statement
- Reprezentuje SQL príkaz
- Statement
- PreparedStatement
- CallableStatement
- Vytvorení instance príkazu
- Statement stmt con.createStatement()
- Provedení príkazu
- ResultSet rs stmt.executeQuery(
SELECT FROM t) - int num stmt.executeUpdate(
DELETE FROM t)
47Objekt ResultSet
- Reprezentuje výsledek dotazu SELECT
- Statement stmt con.createStatement()
- ResultSet rs stmt.executeQuery(
- SELECT FROM uzivatel)
- while( rs.next() )
- String login rs.getString(login)
- String jmeno rs.getString(jmeno)
-
- rs.close()
- stmt.close()
48Ošetrení chyb
- public class SQLException extends Exception
- try
-
- catch( SQLException e)
- while( e ! null )
- System.out.println(e.getMessage())
- System.out.println(e.getSQLState())
- System.out.println(e.getErrorCode())
- e e.getNextException()
-
49Parametrizované príkazy
- Možnost predkompilace opakované provedení
príkazu - Parametry
- oznacené znakem ?
- indexované od 1
- INSERT INTO uzivatel(login,jmeno)VALUES(?, ?)
50Parametrizované príkazy
- PreparedStatement pstmt con.prepareStatement(
- INSERT VALUES(?,?))
- pstmt.clearParameters()
- pstmt.setString(1, wal007)
- pstmt.setNull(2, Types.VARCHAR)
51Transakce
- try
- con.setAutoCommit(false)
- stmt.executeUpdate()
-
- con.commit()
- catch( SQLException e )
- con.rollback()
52Príklad
- import java.sql.
- import java.io.
- public class TestJDBC
- public static final void main(String args)
throws Exception -
- new com.mysql.Driver()
- String url "jdbcmysql//win456.vsb.cz/tis?u
seUnicodetruecharacterEncodingUTF-8" - Connection con DriverManager.getConnection(
url, ctc", ctc") - Statement stmt con.createStatement()
- ResultSet rs stmt.executeQuery("SELECT
FROM menu ORDER BY id") - while( rs.next() )
- System.out.print(rs.getInt(1))
- System.out.print(" ")
- System.out.println(rs.getString(2))
-
- rs.close()
- stmt.close()
53Príklad 2
-
- psmt con.prepareStatement("insert into osoby
(login,jmeno,prijmeni) values(?,?,?)") - psmt.setString(1,args0)
- psmt.setString(2,args1)
- psmt.setString(3,args2)
- if (psmt.executeUpdate() 0)
- throw new Exception("Nepodarilo se
vlozit zaznam") - else
- System.out.println("Vlozen zaznam"
args0 "" args1 "" args2) -
- psmt.close()
- con.close()
54Úkol 6
- Vytvorte jednoduchou aplikaci, která bude mít
následující funkcnost - Zobrazí stránku s obsahem tabulky menu
- Budete mít možnost do této tabulky vkládat
záznamy, a upravovat je a mazat. Tyto operace
budete provádet pomocí servletu.
55TechnologieEnterprise Java Beans
56Obsah prednášky
- Popis technologie EJB
- J2EE aplikace
- Typy komponent
- Entity Beans
- Session Beans
- Message-Driven Beans
- Java Messaging Service (JMS)
- Záver
57Enterprise Java Beans (EJB)
- Specifikace architektury pro vývoj a nasazení
distribuovaných transakcních objektových
komponent na strane serveru - Konvence sada rozhraní (EJB API)
- Cíl zajištení kompatibility mezi produkty
ruzných výrobcu - komponenty
- kontejner
58EJB kontejner
- prostredí, v nemž beží komponenty
- vzdálený prístup
- bezpecnost
- transakce
- soubežný prístup
- prístup ke zdrojum a jejich sdílení
- izolace komponent od aplikací
- nezávislost na dodavateli kontejneru
- zjednodušení tvorby aplikací
59EJB kontejner
klient
požadavek
transakce perzistence bezpecnost
EJBContext, JNDI ENC
Bean
callback metody
Zdroj www.jguru.com
60Aplikacní komponenty v J2EE
- Klienti aplikace
- samostatné programy s vlastním uživatelským
rozhraním - Aplety
- vizuální komponenty spouštené obvykle v prostredí
webového prohlížece - Webové komponenty
- servlety, stránky JSP, filtry, ...
- beží obvykle v prostredí webového serveru
- Komponenty EJB
- aplikacní (business) logika
61Aplikacní komponenty v J2EE
Databáze
datová vrstva
aplikacní logika
EJB kontejner
EJB
prezentacní logika
Webový kontejner
servlet
EJB
Webový prohlížec
Kontejner klienta
Klient
Aplet
prezentace
Webový prohlížec
HTML stránka
Zdroj ZN
62Struktura aplikace J2EE
- J2EE modul
- základní stavební jednotka
- popsán deskriptorem (Deployment Descriptor)
- reprezentován souborem .jar, .war, .rar
- EJB modul, webový modul, modul klienta aplikace,
modul pro adaptéry - J2EE aplikace
- deskriptor aplikace /META-INF/application.xml
- soubor .ear
63Role pri vývoji EJB aplikací
- Tvurce komponent EJB
- príprava komponent a deskriptoru
- duraz na znovupoužitelnost
- Sestavitel aplikace
- skládá komponenty do vetších celku
- Odborník na nasazení
- nasazení komponent do konkrétního prostredí
- konfigurace, príprava zdroju, bezpecnostní
politika
64Role pri vývoji EJB aplikací
- Dodavatel EJB serveru
- operacní systém (Sun, IBM, HP)
- middleware technologie (Borland, IONA)
- databázový systém (Oracle, Sybase)
- Dodavatel EJB kontejneru
- nástroje pro nasazení EJB komponent
- vlastní behové prostredí pro instance EJB
- Administrátor systému
- konfigurace a administrace infrastruktury
- dohled za behu aplikace
65Vlastnosti komponent EJB
- obsahují aplikacní logiku
- instance se vytvárí a spravuje kontejnerem
- možnost prizpusobení zmenou DD
- nastavení atributu oddeleno od implementace
- prenositelnost beanu mezi kontejnery
- možnost práce s beanem bez nutnosti úpravy
zdrojového kódu nebo rekompilace
66Typy komponent EJB
- Session Beans
- bezstavové služby
- stavové objekty v rámci sezení
- Entity Beans
- perzistentní objekty spravované uživatelem (BMP)
- perzistentní objekty spravované kontejnerem (CMP)
- Message-Driven Beans
- bezstavové služby volané asynchronne príchodem
JMS zpráv
67Typy klientu
- Lokální klient
- v rámci stejného stroje JVM
- prímý prístup ke komponente
- efektivnejší prístup
- Vzdálený klient
- v jiném procesu než komponenta
- využívá standardní Java RMI rozhraní
- vyžaduje serializaci / deserializaci
68Cíle EJB 3.0
- EJB 2.1 je upovídané
- Mnoho rozhraní na implementaci
- XML peklo príliš mnoho velkých XML deployment
deskriptoru - API je príliš rozvlácné
- API je príliš složité
- Zjednodušení EJB modelu
- Zamereno na jednodušší proramování
- Jednodušší pro prumerné programátory
- Zvýšení základny vývojáru
69Session Beans
- zapouzdrení logiky do neperzistentních objektu
- možnost odstranení instance (timeout, pád
kontejneru, systémová výjimka) - možnost docasného uložení stavu
- stavové (state) / bezstavové (stateless)
- zachování stavu po dobu existence relace
- nejsou urceny pro sdílení více klienty
- serializace prístupu
70Cíle EJB 3.0 u Session Beanu
- Zrušení nepotrebných rozhraní
- Zrušení nepotrebných posluchacu
- Volitelné deployment descriptory.
- Beany vycházejí z POJO objektu
71Potrebné rozhraní
- Není Homeless rozhraní
- Metody nepoužívají vyjímky RemoteException
- Žádné implementace rozhraní
_at_Remote public interface Calculator public int
add(int x, int y) public int subtract(int x, int
y) _at_Stateless public class CalculatorBean
implements Calculator public int add(int x, int
y) return x y public int subtract(int x,
int y) Return x y
72Stateful Beans
- Still homeless
- Created as they are looked up
- _at_Remove replaces EJBObject.remove
- Stateful bean is removed after method called
_at_Remote public interface ShoppingCart public
void addItem(int prodId, int quantity) public
void checkout() _at_Stateful public class
ShoppingCartBean implements ShoppingCart
_at_Remove public void checkout()
73EJB 3.0 Dependency Injection
- Bean class specifies dependencies instead of
lookup - Facilitates Test Driven Development
- Possible to test EJBs outside of container
_at_Stateful public class ShoppingCartBean
implements ShoppingCart _at_Inject private
SessionContext ctx _at_EJB(nameCreditProcessorEJB
) private CreditCardProcessor processor private
DataSource jdbc _at_Resource(jndiNamejava/Defau
ltDS) public void setDataSource(DataSource db)
this.jdbc db
74Entity Beans
- Pohled na perzistentní entitu
- obvykle v relacní databázi
- Sdílený prístup více uživatelu
- Perzistentní identita instance
- primární klíc
- prežívá i restart kontejneru
- Zajištení správy perzistentního stavu
- Container Managed Persistence (CMP)
- Bean Managed Persistence (BMP)
75Message-Driven Beans
- Nove definovány specifikací EJB 2.0
- Volají se asynchronne jako výsledek prijetí JMS
zpráv - nemají rozhraní pro klienty
- metoda onMessage(Message msg)
- Neudržují si stav týkající se klienta
- Všechny instance jsou ekvivalentní
- príchozí požadavek muže zpracovat libovolná
instance
76MDBs
- Just implements MessageListener
- XML turns to annotations
_at_MessageDriven( activationConfigActivati
onConfigProperty(namedestination,
valuequeue/email)) public class EmailBean
implements MessageListener void
onMessage(Message msg) public int add(int x,
int y) return x y
77Java Messaging Service (JMS)
- Systém pro zasílání zpráv
- Vlastnosti
- minimální vazba komunikujících aplikací
- asynchronnost
- spolehlivost
- Prvky architektury JMS
- JMS poskytovatel soucást J2EE produktu
- Klienti (JMS nebo nativní)
- Zprávy
- Administrované objekty destinations, connection
factories
78Zpusoby komunikace v JMS
- Komunikace bod-bod (point-to-point)
- fronty zpráv (queues)
- zpráva adresována do jedné fronty
- príjemce si vybírá zprávy z fronty
- príjemce potvrzuje úspešné prijetí zprávy
- Producent/predplatitel (publish/subscribe)
- zpráva adresována nejakému cíli (topic)
- distribuce zprávy všem predplatitelum
79Vztahy mezi JMS objekty
Connection Factory
Cílový kanál
Queue Topic
QueueConnectionFactory TopicConnectionFactory
zasílá zprávy
prijímá zprávy
Message Producer
Message Consumer
vytvárí
QueueSender TopicPublisher
vytvárí
vytvárí
QueueReceiver TopicSubscriber
Connection
Session
QueueSession TopicSession
vytvárí
vytvárí
QueueConnection TopicConnection
Message TextMessage ...
Message
80Záver
- Duvody k nasazení J2EE
- prenositelnost (74 )
- otevrenost standardu (28 )
- škálovatelnost (24 )
- snadnost vývoje (22 )
- výkon (16 )
- Problémy nasazení J2EE
- prekrocení plánované doby vývoje (22/50)
- prekrocení rozpoctu na projekt (23/50)
81Záver
- Nejvetší problémy pri vývoji J2EE aplikací
- nedostatecná zkušenost s podobnými projekty (24
) - zmeny ve specifikaci (22 )
- nezvládnuté rízení projektu vývoje (20 )
- Spokojenost s volbou 92 zákazníku
- Zdroj Forrester Research, cervenec 2001, ZN