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