Download Slide 1

Document related concepts
no text concepts found
Transcript
Programmēšana datortīklu vidē
RTU studiju programmas
“Datorsistēmas” pilnveidošana
absolventu profesionālās konkurētspējas
paaugstināšanai
Līguma Nr.
2006/0238/VPD1/ESF/PIAA/06/APK/3.2.3.2./0015/0007
Programmēšana datortīklu vidē
Lekciju materiāls
Pieteicējs: ass. profesore Eleonora Latiševa
Docētājs: lektors Aloizs Ratnieks
Rīgas Tehniskā universitāte
Datorzinātnes un Informācijas Tehnoloģijas
fakultāte
Informātikas un Programmēšanas katedra
Tēmas
•
•
•
•
•
IEVADS: tehnoloģijas J2EE priekšrocības, arhitektūra
MVC, lietojumprogrammas J2EE līmeņi, tehnologijas
J2EE interfeisi.
TEHNOLOĢIJA JAVA SERVLET: servleta funkcijas,
klienta un servera mijiedarbība, klienta pieprasījumu
apkalpošana, servleta dzīves cikls, Multi – MIME tipi,
seansa vadība, pieprasījumu dispetčerizācija.
TEHNOLOĢIJA JAVA SERVER PAGES: komentāri,
direktīvas, definīcijas, skriptleti, izteiksmes, darbības,
kļūdu apstrāde, lietotāja tagu bibliotēkas, tagu
bibliotēkasa deskriptors.
TEHNOLOĢIJA ENTERPRIZE JAVABEANS: seansu
un objektu komponenti, komponentu dzīves cikls,
attālināta metožu izsaukšana (Remote Method
Invocation).
INTEGRĒTĀS IZSTRĀDES VIDES: Borland JBuilder,
IEVADS(1)
Tehnoloģijas J2EE priekšrocības:
•
•
•
•
•
vienkārša pielikumu mēroga izmainīšana
atkarībā no pieprasījuma;
viegla integrācija ar esošām informācijas
sistēmām;
elastīgs drošības modelis;
serveru un komponentu brīva izvēle;
vienkārša arhitektūra un izstrādes modelis,
kurš dod iespēju noteikt uzvešanos
pielikuma piegādes laikā un atbalsta darba
dalīšanu.
IEVADS(2)
IEVADS(3)
Lietojumprogrammas J2EE līmeni:
•
•
•
•
klientu līmenis;
Web līmenis;
biznesa līmenis;
datu līmenis.
IEVADS(4)
Tehnologijas J2EE interfeisi:
•
•
•
•
•
•
JDBC - darbam ar datu bāzēm;
Java Transaction API - transakciju vadībai;
Java Naming and Directory Interface (JNDI) dažādu objektu meklēšanai;
Java Message Service(JMS) - ziņojumu
sūtīšanai un saņemšanai;
JavaMail - pasta ziņojumu sūtīšanai un
saņemšanai;
JavaIDL - mijiedarbībai ar CORBA dienestiem.
TEHNOLOĢIJA JAVA SERVLET (1)
Servleta funkcijas. Servleti tika radīti, lai
paplašinātu Web serveru iespējas. Tie
organizē klienta un servera mijiedarbību,
apstrādā klientu pieprasījumus,vada
seansu un pieprasījumu dispetčerizāciju,
izpilda ievadītu datu pārbaudi un citas
funkcijas. Servleta izpildes beigu posmā
tas ģenerē atbildi pārlūkprogrammai.
TEHNOLOĢIJA JAVA SERVLET (2)
Klienta un servera mijiedarbība. Pēc pieprasījuma
saņemšanas servletu konteineris izsauc metodi
service(), kura noskaidro pieprasījuma tipu un
izsauc metodi doGet() GET pieprasījuma
gadījumā un metodi doPost() POST pieprasījuma
gadījumā. Šo metožu pirmais HttpServletRequest
tipa parametrs satur visu informāciju par klienta
pieprasījumu, bet otrais HttpServletResponse tipa
parametrs ir paredzēts atbildes izvietošanai, kura
tiks pārraidīta pārlūkprogrammai (klientam).
TEHNOLOĢIJA JAVA SERVLET (3)
Interfeisa Servlet metode service.
Metode service() tiek izsaukta katram pieprasījumam:
public void service(ServletRequest req,
ServletResponse res) throws
ServletException, IOException;
Klasē HttpServlet šī metode realizēta kā dispetčeris, kurš atkarībā
no pieprasījuma tipa izsauc vienu speciālu metodi:
• doGet – GET pieprasījumam;
• doPost – POST pieprasījumam;
• doPut – PUT pieprasījumam;
• doDelete – DELETE pieprasījumam.
Servlets var izpildīt dažas metodes service() vienlaicīgi.
TEHNOLOĢIJA JAVA SERVLET (4)
Klienta pieprasījumu apkalpošana. Lai apkalpotu
klienta pieprasījumu teorētiski var pārlādēt metodi
service(), bet ir ieteikts pārlādēt metodi doGet(), vai
metodi doPost(), vai abas šīs metodes. Dažos
gadījumos ir vienādi jāapstrādā POST un GET
pieprasījumi. Šajā gadījumā ir jāizsauc metodi
doGet no metodes doPost vai otrādi:
protected void doPost(httpServletRequest
req, HttpServletResponse res)
throws ServletEXception, IOException
{doGet(req, res); }
TEXNOLOĢIJA JAVA SERVLET (5)
Atbildes pārraidīšana klientam. Lai pārraidītu atbildi
klientam, var ģenerēt HTML lappusi un izvietot to tieši izejas
plūsmā. Atbildes pārraidīšanai var izmantot plūsmu
ServletOutputStream, kuru var izveidot veidā:
ServletOutputStream out = res.getOutputStream();
vai plūsmu PrintWriter, kuru var izveidot veidā:
PrintWriter out = response.getWriter();
Izmantojot iegūto atsauci, HTML lappusi var izvietot izejas
plūsmā: out.println(“<HTML><HEAD><TITLE>”); ...Pēc
lappuses izvietošanas izejas plūsmā PrintWriter, to ir jāaizver:
out.close();
TEHNOLOĢIJA JAVA SERVLET (6)
Vienkārša servleta piemērs.
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloServlet extends HTTPServlet {
public void doGet(HttpServletRequest req,
HttpServletResponse res)throws
ServletException, IOException {
PrintWriter out = null;
res.setContentType(“text/htnl”);
out = res.getWriter();
out.println(“<html>”);
out.println(“<head><title>Sample</title></head>”);
out.println(“<body>”);
out.println(“Hello World!”);
out.println(“</body>”);
out.println(“</html>”);
} }
TEHNOLOĢIJA JAVA SERVLET (7)
Multi – MIME tipi. Daudzmērķīgs pasta
paplašinājumu Internet protokols (Multipurpose
Internet Mail Extension – MIME) tiek izmantots
lai pārsūtītu binārus un multimedia datus un
datus, kas sastāv no dažādām daļām, kas ir
attēlotas dažādos formātos. Web pārlūks
izmanto MIME – tipus, lai noskaidrotu datu
attēlošanas veidu. Pirms atbildes izvietošanas
izejas plūsmā ir jānorāda atbildes MIME – tipu
veidā:
response.setContentType(“text/html”);
TEHNOLOĢIJA JAVA SERVLET(8)
Dažu dokumentu MIME – tipi:
•
•
•
•
•
•
teksts vai HTML fails – text/html;
pasta ziņojums vai ziņas – text/plain;
attēls fofmātā gif – Application/gif;
worda dokuments – Application/msword;
mūzikas faili MIDI – audio/midi;
nezināmais tips,baitu plūsma – Application /octed –
stream.
TEHNOLOĢIJA JAVA SERVLET (9)
Servleta dzīves cikls. Pirms pirmā pieprasījuma
apstrādes serveris izsauc interfeisa Servlet metodi init():
Public void init(ServletConfig config)
throws ServletException {...}
Klase HttpServlet satur šīs metodes realizāciju, kas der
vienkāršu servletu vairākumam: tā saglabā informāciju
par servleta konfigurāciju un apstiprina inicializācijas
faktu darba protokolā. Pēc servleta inicializācijas tas ir
gatavs apkalpot klienta pieprasījumus. Metode service()
tiek izsaukta katra pieprasījuma apkalpošanai. Lai
atbrīvotu resursus pēc pieprasījuma apkalpošanas, tiek
izsaukta metode public void destroy().
TEHNOLOGIJA JAVA SERVLET (10)
Interfeis ServletConfig. Metodes init() parametru
ServletConfig piedāvā servletu konteineris pēc servleta klases
apstrādes. Ar metodi
ServletConfig sc = getServletConfig();
var saņemt atsauci, kas norāda uz interfeisa ServletConfig
realizācijas objektu. Ar šīs atsauces palīdzību var saņemt
informāciju par servleta inicializācijas parametriem un piekļūt
pie objekta ServletContext:
• String
s = sc.getInitParameter(String param) ;
• ServletContext cont = sc.getServletContext();
TEHNOLOĢIJA JAVA SERVLET (11)
Metode init(). Jā ir nepieciešams nodibināt sakarus ar datu
bāzi, izveidot jaunu objektu seansa laikā, sameklēt
objektu nosaukumu dienestā un t.t., metodi init() var
pārlādēt. Šajā gadījumā servleta metodes init() pašā
sākumā ir jāizsauc metodi super.init(config).
Atšķirībā no metodes service(), metodes init()
sinhronizācijas jautājumi nav būtiski, tāpēc ka serveris
izsauc metodi init() pirms servleta izmantošanas.
Visi servleti parasti tiek izpildīti daudzplūsmu vidē. Ja tas
nav vēlams, servleti var realizēt arī interfeisu
SingleThreadModel. Šajā gadījumā serveris nevarēs
iedarbināt vairākas metodes service() plūsmas.
TEHNOLOĢIJA JAVA SERVLET (12)
Seansa vadība Protokols HTTP nesaglabā savu
stāvokli. Tāpēc Web serverim nav jāsaglabā informācija
par iepriekšējiem pieprasījumiem. Bet dažos gadījumos,
piemēram komercijas lietojumprogrammās, ir jāglabā
informācija par iepriekšējiem pieprasījumiem. Pretējā
gadījumā pircējam būtu jāievada savs loģiskais vārds un
parole pirms katra pieprasījuma, ja pieprasījuma garums
pārsniedz vienas lappuses garumu.
Par seansu sauc viena lietotāja pieprasījumu secību, kas
tika pārraidīta no tās pat pārlūkprogrammas.
TEHNOLOĢIJA JAVA SERVLET (13)
Seansa vadības līdzekļi Lai saglabātu seansa stāvokli,
var izmantot sekojošus līdzekļus:
• formas noslēptus laukus;
• URL modifikāciju;
• nemainīgus cookies;
• seansu kontroles API.
Noslēptu lauku izmantošanas gadījumā servlets var
ierakstīt informāciju par seansa stāvokli Web – lappusē ,
kura tiks atgriezta klientam pēc iepriekšējā pieprasījuma
apstrādes. Kad lietotājs pārraida nākošo pieprasījumu
jaunā Web – lappusē, visa formas informācija, ieskaitot
noslēptos laukus, tiek pārraidīta serverim.
TEHNOLOĢIJA JAVA SERVLET (14)
Seansu vadības līdzekli Iepriekšējā paņēmiena
trūkums: lietotājs var apskatīt lappuses kodu un
noskaidrot informāciju, kas ir ierakstīta noslēptos laukos.
URL modifikācijas gadījumā servlets papildina visu
hiperatsauču pieprasījumus, kur lietotājs var izdarīt peles
klikšķi, ar parametriem. Piemēram, lietotājam var
nozīmēt identifikācijas numuru 673, papildinot
hiperatsauču URL ar parametru ID= 673:
http://myServer/servlets/app?ID=673&...
Šī panēmiena trūkumi:
• Lietotājs var apskatīt UTL;
• Pieprasījuma GET garums ir ierobežots.
TEHNOLOĢIJA JAVA SERVLET (15)
Nemainīgie cookies Cookies – tie ir nelieli tekstveida
informācijas bloki, kurus Web – serveris pārraida
pārlūkam, bet pārlūks atgriež tos neizmainītā veidā
serverim, kad apmeklē to pašu Web – saitu vai domenu.
Neizmainītais cookies liecina par to, ka tas pieder
iepriekš reģistrētām lietotājam un serveris atļauj tā
piekļūšanu neuzrādot reģistrācijas vārdu un paroli.
Cookies neapdraud sistēmas drošību, bet tie ievērojami
apdraud informācijas konfidencialitāti. Tāpēc cookies
nedrīkst izmantot slepenai informācijai.
TEHNOLOĢIJA JAVA SERVLET (16)
Nemainīgie cookies Izveidot cookie var ar konstruktoru
Cookie cookie = new Cookie(“nosaukums”,“teksts”);
Lai papildinātu atbildes virsrakstu ar cookie, vispirms
jāpapildina atbilde ar cookie izmantojot operatoru
response.addCookie(cookie);
un tikai pēc tam atbildē var izvietot datus. Fragmenta piemērs:
res.addCookie(new Cookie(“c1”,“ My first cookie”));
res.addCookie(new Cookie(“c2”, “My second cookie”));
PrintWriter out = res.getWriter();
0ut.println(“<html>”); ...
TEXNOLOĢIJA JAVA SERVLET (17)
Nemainīģie cookies Lai saņemtu informāciju par cookie,
no sākuma ir jāizveido visu cookie masīvu:
Cookie [] cookies = request.getCookies();
Pēc tam var saņemt cookie nosaukumu un tā vērtību ar
indeksa palīdzību:
For(int i = ; i < cookies.length; i++) {
String name = cookies[i].getName();
String value = cookies[i].getValue();
} Cookies trūkumi:
• Dažas pārlūkprogrammas neatbalsta Cookie;
• Lai neapdraudētu informācijas konfidencialitāti, daži lietotāji
aizliedz cookies izmantošanu.
TEHNOLOĢIJA JAVA SERVLET (18)
Seansu kontroles API Seansu kontroles API ir realizēts
interfeisā HttpSession. Sesijas organizācijai šis interfeis
izmanto scookie vai URL modifikāciju. URL modifikācija tiek
izmantota, kad pārlūks neatbalsta cookies vai tie ir aizliegti.
Interfeisa HttpSession izmantošanas gadījumā
programmētājam nav jāiedziļinās šī mehanisma sīkumos.
Sesiju var izveidot ar operatoru:
HttpSession session = request.getSession(true);
Pēc sesijas objekta izveidošanas tajā var ierakstīt informāciju
ar metodi setAttribute(String, Object), nolasīt
informāciju ar metodi getAttribute(String), kura dod
atpakaļ null, ja neeksistē objekts ar tādu nosaukumu.
TEHNOLOĢIJA JAVA SERVLET (19)
Seansu kontroles API Saņemt visu parametru
nosaukumus var ar metodi getAttributeNames().
Metode getId() dod atpakaļ unikālo tekošā seansa
identifikatoru. Metode getServletContext() dod
atpakaļ kontekstu, kuram pieder tekošais seans. Metode
setMaxInactiveInterval(int) uzdod maksimālo
laiku sekundēs starp klienta pieprasījumiem, pēc kura
servletu konteinerim ir jāaizver tekošais seans. Metode
invalidate() aizver seansu un atbrīvo visus saistītos
ar seansu objektus.
TEHNOLOĢIJA JAVA SERVLET (20)
. Pieprasījumu dispetčerizācija Parasti pieprasījums
tiek pārraidīts servletam, tāpēc ka pieprasījuma parametru
pārbaudei un bean – komponentu iestatīšanai jāizmanto
programmēšanas līdzekļus, kurus ērtāk izmantot servletā.
Pēc tam pieprasījums tiek pāradresēts JSP lappusei. Tā
atvieglo HTML atbildes ģenerāciju. Bet JSP lappusei atbilst
vienīgs rezultējošs priekšstats. Tāpēc dažāda tipa
pieprasījumus ir jāpāradresē atbilstošām JSP lappusēm.
Pieprasījumu pāradresēšanai ir paredzēta interfeisa
RequestDispatcher metode forward.
RequestDispatcher objekta atsauci var saņemt ar
metodes getRequestDispatcher() palīdzību.
TEHNOLOĢIJA JAVA SERVLET (21)
Pieprasījumu dispetčerizācija
Metode getRequestDispatcher() ir kā objektā
ServletContext, tā arī objektā ServletRequest.
Šīs metodes atšķirās ar to,ka metodei
ServletContext.getRequestDispatcher() ir
jānorāda maršruts attiecīgi konteksta saknes katalogam,bet
metodei ServletRequest.getRequestDispatcher() ir
jānorāda maršruts attiecīgi tekošā pieprasījuma saknes
katalogam. Piemērs: Ja servletTest ir definēts veidā:
public class servletTest extends HttpServlet{
public void doGet(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException{
TEHNOLOĢIJA JAVA SERVLET (22)
Pieprasījumu dispetčerizācija Pēc dažu darbību izpildes
mēs varam pāradresēt pieprasījumu citam servletam vai JSP
lappusei:
ServletContext sc = this.getServletContext();
RequestDispatcer rd =
sc.getRequestDispatcher(“/jspFile.jsp”);
If(rd != null){
try{ rd.forvard(req, res); }
catch(Exception e){//iznēmuma apstrāde}
Interfeisā RequestDispatcher ir vēl viena ļoti lietderīga metode
– include(). Šī metode dod iespēju iekļaut atbildē resursa
kontekstu ( servletu, JSP – lappusi, HTML – failu).
TEHNOLOĢIJA JAVA SERVLET (23)
Pieprasījumu dispetčerizācija Piemērs: iekļaut servletā
JavaScript scenāriju, kas ir izvietots ārējā failā.
ServletContext sc = this.getServletContext();
RequestDispatcher rd =
sc.getRequestDispatcher(“/javascriptFile.js”);
If(rd != null) {
try{rd.include(req, res);}
catch(Exception e){System.out.
ptintln(“Exception: “+e.getMessage());
}
}
TEHNOLOĢIJA JAVA SERVLET (24)
Pieprasījumu dispetčerizācija Piemērs: no viena servleta izsaukt citu
servletu ar parametru nodošanu.
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SourceServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse rezult)
throws ServletException,IOEsception {
request.getSession().setAttribute(
“rezultString”, “Hello, World!”);
getServletContext().getRequestDispatcher(
“/servlet/DestServlet”).forward(request,result);
}
}
TEHNOLOĢIJA JAVA SERVLET (25)
Pieprasījumu dispetčerizācija Izsaucamais servlets:
import java .io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class DestServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
out. Println(“<html><head>”
“<title> Target Servlet </title></head>”
“<body bgcolor = #fff1df>”
“<h1> Called Servlet </h1>”
request.getSession().getAttribute(“rezultString”)
“</body></html>”);
out.close();
}
}
+
+
+
+
+
TEHNOLOĢIJA JAVA SERVLET (26)
Pieprasījumu dispetčerizācija Iepriekšējā piemēra
izpildes rezultāts:
Called Servlet
Hello, World !
Parametru nodošanai var izmantot konstrukciju:
session.setAttribute(“Name”, “Value”);
Bet parametra saņemšanai var izmantot konstrukciju:
HttpSession session = request.getSession();
String value = session.getAttribute(“Name”);
TEHNOLOĢIJA JAVASERVER
PAGES (1)
JavaServer Pages raksturojums JSP
lappuses izskatās kā HTML lappuses, kas ir
papildinātas ar jauniem tagiem, kuros tiek
izvietoti dinamiski dati. Pēc JSP lappuses
kompilācijas tiek iegūts servlets, kas ģenerē
HTML atbildi klientam. Šīs atbildes
dinamisko datu kpmplekts ir atkarīgs no
konkrētā pieprasījuma.
TEHNOLOĢIJA JAVASERVER
PAGES(2)
JSP tagu saraksts
• <! - - HTML komentārs [<% = izteiksme %>] - - >
• <% - - JSP komentārs - - %>
• <%@ direktīva %>
• <%! definīcija %>
• <% skriptlets %>
• <%= izteiksme %>
• <jsp:darbība />
HTML komentārus klienti redz kā HTML tekstu.
JSP komentārs nav redzams HTML lappusē.
TEHNOLOĢIJA JAVASERVER PAGES (3)
Direktīvas Direktīvas ir ziņojumi JSP konteinerim. Tās var ietvert
dažus parametrus. Piemērs:
<%@ page
•
[ language
= “java” ]
•
•
•
•
•
•
•
•
•
•
•
[ extends
[ import
[ session
[ buffer
[ autoFlush
[ isThreadSafe
[ info
[ errorPage
[ isErrorPage
[ contentType
%>
= “klases nosaukums” ]
= “resurs” ]
= “false” vai “true” ]
= “none” vai “izmērs kb” ]
= “false” vai “true” ]
= “false” vai “true” ]
= “informācija” ]
= “ziņojuma lappuses URL” ]
= “false” vai “true” ]
= “satura tips” ]
TEHNOLOĢIJA JAVASERVER PAGES (4)
Direktīvas Iekļaut statiskus datus LSP lappusē var ar direktīvu:
<%@ include file = “Iekļaujamas lappuses URL” %>
Pievienot tagu biblioteku var ar direktīvu:
<%@ taglib uri = “tagu deskriptoru bibliotekas faila izvietošanas
vieta” prefix = “tagu deskriptoru bibliotekas prefiks” %>
Šis prefiks ir jānorāda pirms jebkura taga nosaukuma, kas ir
definēts tagu deskriptoru bibliotekas failā TLD (tag libraru
descriptor). Piemēram, ja failā TLD ir definēts tags ar
nosaukumu tag1 un parametra prefix vērtība ir test, tad HTML
failā ir jāizmanto taga nosaukums test:tag1. Šo taga
nosaukumu var izmantot vienkārši veidā <test:tag1/> vai
veidā: <test:tag1> Patvaļīgs JSP – kods </ test:tag1>, ja tags
ir definēts kā konteineris, kurš atļauj izmantot taga ķermeni.
Direktīvas neko neizvada plūsmā OUT.
TEHNOLOĢIJA JAVASERVER
PAGES (5)
Definīcijas Definīcijās tiek definētas metodes un
mainīgie, kas turpmāk tiks izmantoti JSP
lappusē. Definīciju piemēri:
<%! int i = 42; %>
<%! public int add(int x, int y)
{ return x + y ; } %>
Definīcijas neko neizvada plūsmā out.
TEHNOLOĢIJA JAVASERVER PAGES (6)
Skriptleti Skriptleti var ietvert jebkuru koda fragmentu, kas
atbilst valodai, kas tika norādīta direktīvā language. Tekstu,
HTML – tagus un JSP – elementus nedrīkst izvietot
skriptletos. Piemērs:
<% if(Calendar.getInstance().getCalendar().
AM_PM == Calendar. AM) { %>
Labrīt!
<% } else { %>
Labvakar!
<% } %>
Skriptletu fragmentiem, apvienotiem norādītajā secībā, ir
jāizveido pareizā programma. Ja lietotājs vēlās izmantot
simbolu secību %> skriptleta iekšpusē, bet nevis kā
nobeiguma tagu, tad viņam ir jāizmanto simbolu secība %\>.
TEHNOLOĢIJA JAVASERVER
PAGES (7)
Izteiksmes Izteiksmes tiek izmantotas, lai izvietotu
aprēķinātās vērtības tieši izvades plūsmā. Pirms
izvietošanas plūsmā aprēķinātās vērtības tiek
pārveidotas tekstveida rindā. Ja vērtību nav
iespējams pārveidot tekstveida rindā, tiek
ģenerēts izņēmums ClassCastEXception.
Izteiksmes izmantošanas piemērs:
Tagadējais laiks: <% = new java.util.Date() %>
TEHNOLOGIJA JAVASERVER PAGES (8)
Darbības JSP darbības ietver failu dinamisku
iestarpināšanu, ievadītu parametru pārbaudi ar
komponentu JavaBeans palīdzību, pieprasījumu
pāradresēšanu un citas darbības. Darbību sintakse
balstās uz XML valodas. Darbību tagu saraksts:
•
•
•
•
< jsp : useBeans >
< jsp : getProperty >
< jsp : setProperty >
< jsp : include >
•
•
< jsp : forward >
< jsp : plugin >
TEHNOLOĢIJA JAVASERVER PAGES (9)
Darbība < jsp : useBean > Specifikācijā JavaBeans
komponents (Bean) ir definēts kā atkārtoti izmantojams
programmatūras komponents, kuru var vadīt ar integrētās
vides instrumentiem. Klasei, kura tiks izmantota kā bean –
komponents, ir jāatbilst sekojošām prasībām:
•
klases konstruktorā nedrīkst izmantot parametrus;
•
Klasē nedrīkst izmantot mainīgos, definētus ar atslēgvārdu
public;
•
Klases mainīgā nosaukums jāsāk ar mazo burtu;
•
Lai piekļūtu pie vērtībām, kas tiek glabātas klasē, jāizmanto
metodes getXxx() (vai isXxx()) un setXxx(). Šajos metožu
nosaukumos mainīgā nosaukums jāsāk ar lielo alfabēta burtu.
TEHNOLOĢIJA JAVASERVER
PAGES (10)
Darbība <jsp:useBean>
Piemērs: dota java klase
UserInfo.
package jsparbeanparametrasanemsanu;
public class UserInfo {
private String name = “Ozols”;
public String getName() {
return name;
}
}
Jāizveido JSP lappuse, lai saņemtu klases UserInfo lauka
name vērtību.
TEHNOLOĢIJA JAVASERVER PAGES (11)
Darbība <jsp:useBeans> Saņemt lauka name vērtību.
<html>
<head>
<jsp:useBean id = “user” scope = “request”
class = “jsparbeanparametrasanemsanu.UserInfo”/>
<title>
JSP ar Bean parametra saņemšanu
</title>
</head>
<body> bgcolor = “ffffff” >
<h2><jsp:getProperty name = “user” property = “name” /></h2>
</body>
</html>
TEHNOLOĢIJA JAVASERVER PAGES (12)
Darbībā <jsp:useBean> Parametrs id = “user” norāda bean
komponenta nosaukumu JSP – lappusē, līdzīgi tam, kā faila
mainīgais norāda to failu, no kura tiks nolasīta vai kurā tiks
ierakstīta informācija. Ja Bean komponents jau bija izveidots
ar citu tagu <jsp:useBean>, tad id vērtībai ir jāsakrīt ar to
vērtību, kas tika izmantota pirmajā tagā. Parametrs scope =
“[page] | [request] | [session] | [ application]” norāda
redzamības apgabalu, kurā eksistē bean komponents un kurā
ir pieejama parametra id vērtība. Pēc noklusēšanas – page.
Parametrs class = “pakete.klase” izveido bean – komponentu
ar vārdu new un klases konstruktoru. Papildus tagā
<jsp:useBean> var izmantot sekojošus parametrus:
TEHNOLOĢIJA JAVASERVER PAGES (13)
Taga <jsp:useBean> parametri:
•
•
•
type = “pakete.klase”. Ja Bean komponents jau eksistē
redzamības apgabalā, tad parametrs nozīmēs bean –
komponentam datu tipu, kas atšķiras no tā, pēc kura tas tika
izveidots. Par type vērtību var būt klases class superklase vai
interfeis, kas tika realizēts klasē class. Ja parametrs type tiek
izmantots bez parametra class vai beanName, tad Bean
komponenta eksemplārs netiks izveidots;
Class = “pakete.klase” type = “pakete.klase” izveido norādītās
klases Bean eksemplāru un nozīmē tam norādīto datu tipu;
beanName = “{ pakete.klase | <% = izteiksme %>}”
type = “pakete.klase” />
ķermenis
</ jsp:useBean>
izveido Bean komponenta eksemplāru no klases, serializēta
šablona vai izteiksmes, kuras rezultāts ir klase vai šablons.
TEHNOLOĢIJA JAVASERVER PAGES (14)
Taga <jsp:useBean> parametri
Parametra
beanName izmantošanas gadījumā Bean komponentu
izveido metode java.bean.Beans.instantiate().
Metode pārbauda,vai klase ir šablons. Šablona gadījumā
metode Beans.instantiate() nolasa serializētu formu
(ar nosaukumu, līdzīgu package.class.ser) ar klašu ielādes
programmu. Tādejādi darbība <jsp:useBean> tiek izmantota,
lai sameklētu vai izveidotu JavaBean komponentu, kurš tiks
izmantots lappusē. No sākuma Web konteineris mēģina
sameklēt Bean komponentu pēc tā atribūtiem id un scope. Ja
tāds bean – komponents nav sameklēts, tad konteineris
izveido tā eksemplāru no klases vai serializēta šablona.
TEHNOLOGIJA JAVASERVER PAGES (15)
Darbības <jsp:useBean> raksturojums Ir jāatzīmē, ka
tags <jsp:useBean> neatbalsta Enterprize JavaBeabs. Bet lai
piekļūtu pie Enterprize Java Beans ar tagu <jsp:uzeBean>
var izsaukt standarta JavaBean komponentu, kurš savkārt var
izsaukt Enterprize JavaBeans. Var arī izveidot tādu lietotāja
tagu, kurš tieši izsauks Enterprize JavaBeans.
Lai nomainītu java klases mainīgā vērtību, JSP lappusē ir
jāizmanto sekojoša konstrukcija:
<jsp:setProperty name =“klases identifikātors id”
property = “mainīga nosaukums”
value = “mainīga vērtība” />
TEHNOLOĢIJA JAVASERVER PAGES (16)
Darbība <jsp:getProperty> Tags <jsp:getProperty>
saņem Bean komponenta īpašību, pārveido to
tekstveida rindā un izvieto to izejas plūsmā out.
Piemērs:
<jsp:useBean id = “saletax” scope = “page”
class = “beans.tax” />
<H2>
Nodoklis:<jsp:getProperty name = “saletax”
Property = “curr_tax” />
</H2>
TEHNOLOĢIJA JAVASERVER PAGES (17)
Darbība <jsp:setProperty> Tags <jsp:setProperty> iestata
vienu vai vairākas bean komponenta īpašības. Taga
<jsp:setProperty> parametra name vērtībai ir jāsakrīt ar taga
<jsp:useBean> parametra id vērtību. Taga sintakse:
<jsp:setProperty name =
“bean komponenta nosaukums jsp lappusē”
{property = “*” | property = “īpašības_nosaukums”
[param = “parametra_nosaukums] |
property = “īpašības _nosaukums” value = {rinda |
<% = izteiksme %> }“
}
/>
TEHNOLOĢIJA JAVASERVER PAGES (18)
Darbība <jsp:setProperty> Parametrs property = “*” saglabā
visus pieprasījuma parametrus, kurus lietotājs ievadīja
lappusē, atbilstošajās Bean komponenta īpašībās. Šajā
gadījumā bean komponenta īpašību nosaukumiem ir jāsakrīt
ar pieprasījuma parametru nosaukumiem. Parametrā
property = “īpašības nosaukums” [ param = parametra
nosaukums ] property nosaka Bean komponenta īpašības
nosaukumu, bet param – pieprasījuma parametra
nosaukumu. Ja Bean komponenta īpašībai un pieprasījuma
parametram ir dažādi nosaukumi, tad ir jānorāda property un
param. Ja nosaukumi ir vienādi, var norādīt tikai property.
Tagā <jsp:setProperty> nedrīkst vienlaicīgi izmantot
parametrus param un value.
TEHNOLOĢIJA JAVASERVER PAGES (19)
Darbība <jsp:setProperty> Pieprasījuma parametriem
•
•
•
•
•
•
•
vienmēr ir tips String. Lai saglabātu tos Bean komponenta
īpašībās, String tipa vērtības ir jāpārveido citos datu tipos.
Pamattipu pārveidošanas metodes:
java.lang.Boolean.valueOf(String)
java.lang.Byte.valueOf(String)
java.lang.Character.valueOf(String)
java.lang.Double.valueOf(String)
java.lang.Integer.valueOf(String)
java.lang.Float.valueOf(String)
java.lang.Long.valueOf(String)
TEHNOLOĢIJA JAVASERVER PAGES (20)
Darbība <jsp:include> Iepriekš minēta direktīva <%@ include =
“iekļaujamās lappuses URL” %> iestarpina JSP – lappusē statisku saturu
translācijas posmā. Tags <jsp:include> ļauj iestarpināt lappusē dinamisku
saturu. Ja iekļaujamais resurs starp pieprasījumiem izmainijās, tad
nākošais pieprasījums JSP – lappusei attēlos jaunu resursa saturu. Taga
sintakse:
<jsp:include page = “{relatīvs URL | <%= izteiksme %>}” flush = “true”
/>
Vai
<jsp:include page = “{ relatīvs URL | <%= izteiksme %>}” flush = “true” >
<jsp:param name = “parametra nosaukums” value = “{ parametra vērtība |
<%= izteiksme %>}” />
</ jsp:include >
Iekļaujamam resursam var nosūtīt vairākus parametrus, lietojot vairākas
izteiksmes <jsp:param>
TEHNOLOĢIJA JAVASERVER PAGES (21)
Darbība <jsp:forward> Tags <jsp:forvard> pāradresē
pieprasījumu HTML – failam, servletam vai citai JSP lappusei.
Taga sintakse:
<jsp:forvard page = “{relativs URL | <%= izteiksme %>}” />
vai
<jsp:forward page = “{relatīvs URL | <%= izteiksme %>}” >
<jsp:param name = “parametra nosaukums”
value = “{ parametra vērtība | <%= izteiksme %>}” />
</jsp:forward>
TEHNOLOĢIJA JAVASERVER PAGES (22)
Darbība <jsp:plugin> Tags <jsp:pjugin> izveido kodu, kas
ielādē lietotāja pārlūkprogrammā appletu vai komponentu
JavaBean. Taga piemērs:
<jsp:plugin type = applet code = “Module.class”
codebase = “/html” >
<jsp:params><jsp:param name = “molecule”
value = “molecules/benzene.mol” />
</jsp:params>
<jsp:fallback><p> nav iespējams ielādēt </p>
</jsp:fallback>
</jsp:plugin>
TEHNOLOĢIJA JAVASERVER PAGES (23)
Kļūdu apstrāde Direktīvai page ir parametrs errorPage, kas satur tās
lappuses relatīvo URL, kura izvada kļūdas ziņojumu. Ja lappusē notiek
izņēmums, klienta pieprasījums tiek pāradresēts atbilstošai lappusei.
Kļūdas ziņojuma lappuses parametram isErrorPage ir jāpiešķir vērtība
“true”. Tas nozīmē, ka mainīgais exception ir pieejams un norāda uz
klases java.lang.Throwable eksemplāru. Kļūdas ziņojuma lappuses
piemērs:
<%@ page isErrorPage = “true” %>
<html>
<head>
<title> kļūda </title>
</head>
<body>
Kļūda: <%= exception.toString() %>
</body>
</html>
TEHNOLOĢIJA JAVASERVER PAGES (24)
Kļūdu apstrāde Fails ar kļūdas ziņojuma lappusi ir
jāizvieto pielikuma saknes katalogā. Lai citas
lappuses varētu atsaukties uz kļūdas ziņojuma
lappusi, direktīvas page parametram errorPage ir
jānorāda uz errorPage lappusi, piemēram:
<%@page errorPage = “/jspError.jsp” %>
TEHNOLOĢIJA JAVASERVER PAGES (25)
Lietotāju tagu bibliotekas Lietotāju tagi dod iesoēju
aizvietot sarežgītas darbības servera pusē ar vienkāršiem
tagiem. Lietotāja taga izmantošanai ir nepieciešami trīs
komponenti: taga apstrādes klase, kas nosaka taga rīcību,
tagu bibliotekas deskriptors – Tag Library Descriptors (TLD),
kas nosaka atbilstību starp tagu nosaukumiem un tagu
apstrādes klasēm, un JSP fails, kurā tagu biblioteka tiek
izmantota. Taga apstrādes klasei ir jārealizē interfeisu
javax.servlet.jsp.tagext.Tag. Lai to panāktu, tagu apstrādes
klasei ir jāpaplašina klase TagSupport vai klase
BodyTagSupport. Piemērs: uzrakstīt vienkāršu tagu
apstrādes klasi, kas iestarpina tekstu “Custom tag example
(coreservlets.tags.ExampleTag)” taga izvietošanas vietā.
TEHNOLOĢIJA JAVASERVER PAGES (26)
Lietotāju tagu bibliotekas Vienkāršas tagu apstrādes klases piemērs:
package coreservlets.tags;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.io.*;
public class ExampleTag extends TagSupport {
public int doStartTag() {
try { JspWriter out = pageContext.getOut();
out.print(“coreservlets.tags.ExampleTag”);
} catch(IOException ioe) {
System.out.println(“Error in ExampleTag:“ +ioe);
}
return(SKIP_BODY);
}
}
TEHNOLOĢIJA JAVASERVER PAGES (27)
Lietotāju tagu bibliotekas Ja tagam neeksistē
ķermenis, tagu apstrādes klasei ir jāpaplašina klase
TagSupport un jāpārlādē metode doStartTag(), kura
tiek izsaukta pieprasījuma laikā, ja tiek sastapts taga
sākumelements. Lai ģenerētu izejas plūsmu, tiek
izmantots klases JspWriter eksemplārs out.
PageContext tipa laukā pageContext ir ne tikai
metode getOut(), bet arī citas metodes, kas ļauj
saņemt saistītas ar pieprasījumu datu struktūras.
Svarīgākās no tām ir getReguest(), getResponse(),
getServletContext(), un getSession().
TEHNOLOĢIJA JAVASERVER PAGES (28)
Lietotāju tagu bibliotekas Sakarā ar to, ka metode
print() var ģenerēt izņēmumu IOException, to ir
jāizvieto blokā try/catch. Lai paziņotu lietotājam par
citām kļūdām, ir jādefinē, ka metode doStartTag() var
ģenerēt izņēmumu JspException un pēc tam ģenerēt
šo izņēmumu kļūdas rasšanās gadījumā. Ja tagam
neeksistē ķermenis, metodei doStartTag() ir jādot
atpakaļ konstanti SKIP_BODY. Šī konstante norāda
sistēmai ignorēt jebkuru informāciju, kas ir izvietota
starp sākuma un beigu tagiem.
TEHNOLOĢIJA JAVASERVER PAGES (29)
Tagu bibliotekas deskriptors Tagu bibliotekas deskriptors
•
•
•
•
tiek pierakstīts XML valodā un nosaka atbilstību starp tagu
nosaukumiem un tagu apstrādes klasēm. Tagu deskriptoru
bibliotekas fails satur virsrakstu, kas nekad netiek izmainīts,
un tagu bibliotekas deskriptoru. Ja tagam nav parametru, tad
starp sākuma <tag> un beigu </tag> deskriptora elementiem
ir jānorāda čerti parametri:
name – taga nosaukums, pirms kura jsp lappusē ir jānorāda
tagu bibliotekas prefikss;
tagclass – pilns tagu apstrādes klases nosaukums;
info – uzdot īsu taga aprakstu;
bodycontent – ja tagam nav ķermeņa, tad šī parametra
vērtība ir EMPTY, bet tagam ar ķermeni – JSP.
TEHNOLOĢIJA JAVASERVER PAGES (30)
Tagu bibliotekas deskriptors Deskriptora piemērs:
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>csajsp</shortname>
<info> A tag library http://www.coreservlets.com/ </info>
<tag>
<name>example</name>
<tagclass>coreservlets.tags.ExampleTag</tagclass>
<info> example: insert one line of output </info>
<bodycontent>EMPTY</bodycontent>
p
<! -r - vēlāk definēti tagi ... - - >
o
</taglib>
c
TEHNOLOĢIJA JAVASERVER PAGES (31)
Lietotāja tagu izmantošana JSP failā
p
r
o
c
JSP – failā pirms jebkura lietotāja taga kā prefiks ir
jāizmanto tā vērtība, kas tika norādīta deskriptora tagā
<shortname>, bet pirms visiem lietotāja tagiem
jāizvieto direktīva <%@ taglib uri = “tagu deskriptoru
bibliotekas faila izvietošanas vieta” prefix = “tagu
deskriptoru bibliotekas prefiks” %>. Tag Library
Descriptors (TLD) faila izvietošanas vietu var norādīt
ar absolūto vai relatīvo URL. Ja TLD fails ir izvietots
tajā pat katalogā, kurā ir izvietots JSP – fails, var
izmantot relatīvo URL.
TEHNOLOĢIJA JAVASERVER PAGES (32)
JSP faila piemērs
<html>
<head>
<%@ taglib uri = “taglib.tld” prefix = “csajsp” %>
<title><csajsp:example/></title>
</head>
<body>
<h1><csajsp:example/>< /h1>
<csajsp:example/>
</body>
p
r
</html>
o
c
TEHNOLOGIJA JAVASERVER PAGES (33)
Lietotāja tagi ar parametriem Lietotāja tags var ietvert
neierobežotu parametru skaitu. Parametru vērtības tiek
pierakstītas apostrofos. Tagu ar parametriem piemēri:
<util:iterate times = ‘4’>
<util:iterate
times = ‘<%=izteiksme%>’>
F
f
a
Otrajā gadījumā
ai parametra vērtība tiks aprēķināta
ii e
pieprasījuma laikā.
Lai lietotāja tags atbalstītu parametru,
l
u
jāizpilda trīs darbības:
1.
2.
3.
ir
Jāpapildina tagu
p ar parametru JSP – failā.
ā bibliotekas atbilstošais deskriptors ar tagu
Jāpapildina tagu
r
<attribute>. v
a
Jārealizē metode
setParametra_nosaukums() tagu
l
apstrādes klasē.
d
ī
TEHNOLOĢIJA JAVASERVER PAGES (34)
Lietotāja tagi ar parametriem Tagu apstrādes klase var
realizēt arī neobligātu metodi getParametra_nosaukums(),
lai ieliktie tagi varētu saņemt ārējā taga parametrus.
Piemērs: ja Web lappusē ir forma ar rediģēšanas laukiem,
tad tie ir atkārtoti jāattēlo, ja lietotājs nepareizi aizpildīja kādu
no laukiem (kopā ar kļūdas ziņojumu). Rediģēšanas laukos
vēlams attēlot to tekstu, kuru iepriekš ievadīja lietotājs. No
sākuma pamēģināsim atrisināt šo problēmu sekojošā veidā:
<input type = ‘text’ size = 15 name = ‘firstName’
value = ‘<%=request.getParameter(“firstName”) %>’>
TEHNOLOĢIJA JAVASERVER PAGES (35)
Lietotāja tagi ar parametriem Parametram value tiks
piešķirta atbilstoša redigēšanas lauka vērtība. Bet šim
risinājumam ir būtisks trūkums. Ja forma tiks izmantota
pirmo reizi, metode getParameter dos atpakaļ vērtību null,
kura tiks izvadīta rediģēšanas laukā. Šo problēmu var
atrisināt ar lietotāja tagu, kurš dod atpakaļ pieprasījuma
parametru vai tukšu rindu, ja parametrs neeksistē.
Taga apstrādes klase:
package tags;
import javax.servlet.ServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
TEXNOLOĢIJA JAVASERVER PAGES (36)
Lietotāja tagi ar parametriem Taga apstrādes klase:
public class GetRequestParameterTag
extends TagSupport {
private String property;
public void setProperty(String property){
this.property = property;
}
public int doStartTag()throws JSPException {
ServletRequest req = pageContext.getRequest();
String value = req.getParameter(property);
try{pageContext.getOut().print(
value ==null ? “” : value);
}catch(java.io.IOException ex) {
throw new JspException(ex.getMessage()); }
return SKIP_BODY;
}
}
TEHNOLOĢIJA JAVASERVER PAGES (37)
Lietotāja tagi ar parametriem Tagu apstrādes klasē pirms
metodes doStartTag() ir jādefinē visu parametru set – metodes.
Set – metodes tiek izsauktas pirms metodes doStartTag() pirmā
izsaukuma. Tagu bibliotekas deskriptoram jāizskatās veidā:
<taglib>
<tag>
<name> requestParameter </name>
<tagclass>tags.GetRequestParameterTag</tagclass>
<bodycontent>empty</bodycontent>
<attribute>
<name>property</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
TEHNOLOIJA JAVASERVER PAGES (38)
Lietotāja tagi ar parametriem Iepriekšējā slaida tagā
name ir jānorāda parametra nosaukums, tagā required vērtību
true, ja parametrs ir obligāts, tagā rtexprvalue vērtību true, ja
parametra vērtību var norādīt ar JSP izteiksmi.
JSP fragmenta piemērs:
<table>
<tr>
<td> First Name: </td>
<td><input type=‘text’ size=15 name=‘firstName’
value=‘<html:requestParameter property=“firstName”/>’>
</td>
</tr>
TEHNOLOĢIJA JAVASERVER PAGES (39)
Lietotāja tagi ar parametriem
<tr>
<td>LastName:</td>
<td><input type=‘text’ size=15 name=‘lastName’
value=‘<html:requestParameter property=“lastName” />’>
</td>
</tr>
</table>
...
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (1)
Ja drošības un lietojumprogrammas mēroga izmainīšanas
aspekti ir ļoti būtiski, jāizmanto Enterprize JavaBeans (EJB).
Tehnologija EJB izmanto protokolu RMI vai interneta
protokolu Inter – ORB (RMI – IIOP) attālinātu metožu
izsaukumam un nosaukumu dienestu JNDI (Java Naming
and Directory Interface), lai sameklētu objektu pēc tā
nosaukuma. EJB objekti tiek izpildīti EJB konteinera vidē,
kas nodrošina dažādas sistēmas funkcijas: vada
transakcijas, savienojumu pūlu, datu aizsardzību un citas
funkcijas. Atšķirībā no komponenta JB, komponents EJB
tiek izvietots failu grupā. Šo failu mijiedarbība nodrošina
vajadzīgo funkcionēšanu.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (2)
Klases EJB struktūra ir atkarīga no komponenta tipa un
uzdevuma. Klase, kas realizē EJB tipa session, satur biznesmetodes, kas ir saistītas ar procesiem. Klase, kas realizē EJB
tipa entity bean, satur metodes, kas aizvieto datu bāzes datus.
Klase, kas realizē EJB tipa message – driven bean, satur biznesmetodes, kas dot iespēju apstrādāt asinhronus ziņojumus.Klients
nekad neizsauc tieši EJB metodes. Klienta mijiedarbība ar EJB
notiek ar atbilstošiem interfeisiem. Piemēram, remote interfeisā
ir definētas visas komponenta biznesmetodes, kuras var izsaukt
klients. Pēc remote interfeisa metodes izsaukšanas EJB
konteineris automātiski izveido remote EJB objektu, kas satur
nepieciešamās funkcijas un EJB realizācijas klases visu biznesa
metožu kopijas, kuras apstrādā klienta pieprasījumu.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (3)
Sakarā ar to, ka remote EJB objekts, kuru ģenerēja konteineris,
satur sistēmas funkcijas, programmētājam nav jārupējās par
transakciju vadību, datu aizsardzību un citām sistēmas
funkcijām. Interfeisā Home ir definētas EJB objektu izveidošanas,
meklēšanas un iznīcināšanas metodes. Šo interfeisu realizē
home objekti, kuri ir EJB konteinera daļa un kurus automātiski
ģenerē konteineris. Home objekts ir EJB objektu fabrikas
nosaukums (EJB objekt factory), kurš piedāvā klientam atsauci
uz remote EJB objektu. (Lai izsauktu EJB komponenta metodi,
klientam ir jāzina, kur atrodās remote EJB objekts). Papildus
home objekts dot iespēju konteineram saņemt EJB komponenta
metadatus ar interfeisu javax.ejb.EJBMetaData, kad lietojums
tiek izvietots serverī.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (4)
Lai palielinātu lietojuma ātrdarbību gadījumos,
kad klienti un komponenti ir izvietoti vienā
konteinera robežās un izmanto vienu un to
pašu java virtuālo mašīnu, specifikācija EJB
2.0 tika papildināta ar lokālu interfeisu. Lokāla
interfeisa izmantošanas gadījumā home
interfeis tiek aizvietots ar local home
interfeisu, objekts home – ar local home
objektu.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (5)
Katram EJB komponenta tipam eksistē arī standartie interfeisi,
kas atbilst komponenta īpašībām:
• interfeis javax.ejb.sessionBean - komponentam session bean;
• Interfeis javax.ejb.ēntityBean – komponentam entity bean;
• Interfeis javax.ejb.MessageDrivenBean – komponentam
message – driven bean.
Ja EJB komponenta nosaukums ir Calculator, tad tā remote
interfeis tiek definēts failā Calculator.java, home interfeis – failā
CalculatorHome.java, EJB realizācijas klase – failā
CalculatorBean.java vai CalculatorEJB.java, izvietojuma
deskriptora nosaukums vienmēr ir ejb – jar.xml. Tādejādi, EJB
komponents vienmēr tiek izvietots četros failos.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (6)
Home interfeis tiek izmantots, lai sameklētu vai izveidotu
EJB komponenta eksemplāru, remote interfeisā tiek
definētas komponenta biznesmetodes, EJB realizācijas
klasē tiek izvietotas biznesmetodes (remote interfeisa
realizācija). Izvietojuma deskriptorā tiek aprakstīta
lietojumprogrammas nepieciešamā konfigurācija. Ja tiek
izmantotas remote interfeisa metodes, parametri tiek nodoti
pēc vērtības, bet home interfeisa metožu izmantošanas
gadījumā - pēc atsauces.
Objektus EJB un objektus home automātiski ģenerē
konteinera instrumentālie līdzekļi un tie ir konteinera daļa.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (7)
Seansu komponenti Komponents Session Enterprise
JavaBean ir klienta pārstāvis lietojumprogrammu serverī. Tas
realizē biznesa loģiku, algoritmus un procesus, kas ir
raksturīgi klientam. EJB konteineris garantē, ka ja viens klients
izsauc EJB eksemplāra kādu metodi, tad neviens cits klients
nevarēs sadarboties ar to pašu eksemplāru.
Tiek izmantoti divi komponenta session bean tipi:
• Stateless session beans;
• Stateful session beans.
Komponents Stateless session bean nesaglabā informāciju
par savu stāvokli, bet komponents Stateful session bean var
saglabāt informāciju par savu stāvokli, kamēr eksistē seans.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (8)
Komponenta session bean izsaukšana Platforma J2EE
nodrošina izvietojuma caurspīdīgumu, tas ir lietojumam nav
svarīgi, kur konkrēti izvietots objekts. Objekta meklēšanai
interneta tīklā protokola RMI – IIOP izmantošanas gadījumā
klienti izmanto JNDI, CORBA klienti – CORBA Naming
Service (COS Naming). Abos gadījumos komponenta EJB
izsaukšanai ir jāizpilda darbības sekojošā secībā:
1.
Objekta meklēšana;
2.
Objekta EJB izveidošana ar objekta home palīdzību;
3.
Objekta EJB biznesmetodes izsaukšana;
4.
Objekta EJB iznīcināšana.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (9)
Objekta meklēšana
Lai būtu iespējams sameklēt EJB objektus
vai home objektus interneta tīklā,
izvietojumu deskriptorā tos ir jāsaista ar īsu,
saprotamu nosaukumu, kuru izmantojot
J2EE platforma var sameklēt objekta fizisko
izvietojumu.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (10)
Komponenta Session bean realizācijas klases standartās
metodes Komponenta Session bean standartās metodes izsauc
EJB konteineris. Metode setSessionContext (SessionContext ctx)
saista komponenta eksemplāru ar seansa kontekstu. Metodi
izmanto pirms komponenta eksemplāra inicializācijas. Metode
ejbCreate() inicializē komponenta eksemplāru. Komponentā
Stateless session bean var definēt tikai vienu metodi ejbCreate()
bez parametru. Metodes ejbActivate() un ejbPassivate()
komponentā Stateless session bean netiek izmantotas, bet
komponenta realizācijas klasē ir jādefinē tukšas metodes. Metodi
ejbRemove() konteineris izsauc pirms komponenta iznīcināšanas.
Tā atbrīvo visus resursus, kurus izmantoja komponents.
Komponents eksistē tikai klienta seansa laikā, kamēr ir atvērts
pārlūkprogrammas logs.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (11)
Statelesses session bean komponenta dzīves cikls
Par komponentu izveidošanu un iznīcināšanu atbild
konteineris. Tas var izveidot vai iznīcināt Stateless
session bean komponentu jebkurā brīdī, un tas nav
saistīts ar klienta rīcību. Komponenta dzīves cikla
sākumā konteineris izsauc metodi newInstance(),
kura izveido jaunu komponenta eksemplāru. Pēc
tam konteineris izsauc metodes setSessionContext()
un elbCreate(). Dzīves cikla beigu posmā konteineris
izsauc metodi ejbRemove().
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (12)
Piemērs Izveidot kalkulatoru divu skaitļu saskaitīšanai,
izmantojot Stateless session bean komponentu. Realizācijas
klase CalculatorBean:
package j2eebook.ejb;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.CreateException;
public class CalculatorBean implements SessionBean {
private SessionContext ctx;
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (13)
public void setSessionContext(SessionContext context) throws
RemoteException, EJBException{
ctx = context;
}
public void ejbActivate() throws EJBException{}
public void ejbPasswivate() throws EJBException{}
public void ejbRemove() throws EJBException{}
public void ejbCreate() throws CreateException, EJBException {}
public float addition(float itemOne, float itemTwo) {
return itemOne + itemTwo;
}
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (14)
Komponentam stateless session bean konstruktors
nav nepieciešams. kad izveidot un iznīcināt
komponenta eksemplāru, nolemj konteineris. Tas nav
saistīts ar metožu create() un remove() izsaukumiem.
Metodi setSessionContext() izsauc konteineris, lai
saistītu komponentu ar seansa kontekstu. Seansa
konteksts (session context) dot iespēju komponentam
sadarboties ar konteineri, lai piekļūtu pie sistēmas
funkcijām. Realizācijas klasei ir jārealizē visas biznesmetodes, kas ir definētas interfeisā remote.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (15)
Inerfeis CalculatorHome:
package j2eebook.ejb;
import javax.ejb.EJBHome;
import javax.ejb.CreateException;
import javax.ejb.EJBException;
import java.rmi.RemoteException;
public interface CalculatorHome extends EJBHome {
Calculator create() throws CreateException,
EJBException, RemoteException;
}
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (16)
Lai inicializētu EJB komponenta eksemplāru,
klientam jāizmanto home interfeiss. Home
interfeisā ir tikai metode create(). Ar šo metodi
klients var piekļūt metodei ejbCreate(), kas
pieder realizācijas klasei. Klientam nav
iespējams tieši piekļūt komponenta
eksemplāram. Komponenta eksemplāra
inicializāciju var veikt tikai ar home interfeisa
metodi create().
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (17)
Remote interfeis Calculator
package j2eebook.ejb;
import javax.ejb.EJBobjekt;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
public interface Calculator extends EJBobject{
float addition(float itemOne, float itemTwo) throws
RemoteException, EJBException;
}
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (18)
Remote interfeisā ir jādefinē visas realizācijas
klases biznesmetodes, kas ir pieejamas klientam.
Klients nevar tieši izsaukt biznesmetodes, kas
pieder komponenta realizācijas klasei. Tas tiek
panākts ar remote interfeisa palīdzību. Visi
Stateless session bean komponenti ir ekvivalenti
un var apkalpot dažādus klientus. Lai palielinātu
komponentu izmantošanas efektivitāti, konteineris
var izveidot šo komponentu pūlu un novietot tajā
dažus komponentus, kurus būs iespējams izmantot
nepieciešamības gadījumā.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (19)
Klients komponentam CalculatorBean
package j2eebook.ejb.client;
import javax.naming.Context;
import javax.naming.InitialContext;
Import javax.rmi.portableRemoteObject;
Import j2eebook.ejb.CalculatorHome;
Import j2eebook.ejb.Calculator;
Public class CalculatorClient{
Public static void main(String[] argv) {
try {
Context initial = new InitialContext();
Object objref = initial.lookup(JNDI);
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (20)
j2eebook.ejb.CalculatorHome home =
(j2eebook.ejb.CalculatorHome)
PortableRemoteObject.narrow(objref,
j2eebook.ejb.CalculatorHome.class);
j2eebook.ejb.Calculator aCalculator = home.create();
System.out.println(“3 + 5 =“ + aCalculator.sum(3, 5));
} catch(Exception ex){ ex.printStackTrace(); }
}
private final static String JNDI =
“j2eebook.ejb.CalculatorHome”;
}
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (21)
Klients izpilda sekojošas darbības:
1.
Nozīmē nosaukumu dienesta sākumkontekstu (tas ir
katalogu struktūras sākumkontekstu sakaru nodibināšanai).
2.
Sameklē komponenta EJB objektu home, kas realizē home
interfeisu, izmantojot JNDI nosaukumu un home interfeisu
j2eebook.ejb.CalculatorHome. Rezultātā klients saņem
atsauci uz hone objektu.
3.
Inicializē komponentu ar home interfeisa metodes create()
palīdzību.
4.
Ar remote interfeisa palīdzību izsauc biznesmetodi sum().
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (22)
Lai pārveidotu nepieciešamā veidā objektu, kas
tika saņemts ar tīkla resursu palīdzību,
protokola RMI – IIOP izmantošanas gadījumā,
klienta kodā jāizmanto metodi
PortableRemoteObject.narrow(). Metodes
pirmais parametrs – objekts, kas tika saņemts
no tīkla, otrais parametrs – klase, kurā ir
jāpārveido tas objekts, kas tika saņemts no
tīkla.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (23)
Komponents Stateful session bean Komponents Stateful
session bean saglabā savu stāvokli starp secīgiem
izsaukumiem un dažādām transakcijām. Ja viena biznesprocesa robežās klients izsauc kādu metodi, tad metodes
rezultāts tiks saglabāts un to var izmantot citu metožu
izsaukumiem. Seansa stāvoklis tiek saglabāts līdz seansa
pārtraukšanai vai komponenta iznīcināšanai.
Atšķiribā no stateless session bean komponentu pūla, kurā
viens komponents var apkalpot ļoti daudz klientu, katrs
Stateful session bean pūla komponents var apkalpot tikai
viena klienta seansu ar noteiktu pūla komponentu.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (24)
Komponents Stateful session bean Sakarā ar to, ka vienam
komponentam var būt ļoti daudz klientu, nav iespējams
uzglabāt pūlā visu klientu komponenta eksemplārus. Lai
samazinātu elementu skaitu operatīvajā atmiņā, konteineris
var izkraut no pūla dažus elementus un iekraut citus.
Objekta Stateful session bean atsauce, kuru klients
saņēma seansa sākumā, tiek saglabāta līdz seansa
beigām. Klientam ir atļauts izveidot sakaru seansus ar
dažādiem komponentiem. Šajā gadījumā katram
komponentam tiks izveidots atsevišķs eksemplārs, un ar
katru no tiem tiks atbalstīti sakari.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (25)
Komponents Stateful session bean Pasivācijas procesā
daži no eksemplāriem, kuri dotajā brīdī netiek izmantoti,
tiek ierakstīti magnētiskajā diskā. Pasivācijas procesu
ierosina konteineris, kad pūlā uzkrājās pārāk daudz
Stateful session bean eksemplāru. Tādejādi eksistē divi
pūli – aktīvs un pasīvs. Ir aizliegts pasivēt tos
eksemplārus, kuri piedalās transakcijās, līdz transakcijas
beigām. Kad klients izsauc komponenta eksemplāru,
kurš bija pasivēts, konteineris to automātiski aktivizē un
atjauno resursus, kuri bija atbrīvoti pasivācijas laikā.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (26)
Komponenta Stateful session bean dzīves cikls
•
Komponenta dzīves cikls sākās, kad klients izsauc
komponenta Stateful session bean interfeisa home metodi
create() ar parametriem.
•
Jauna eksemplāra izveidošanai konteineris izsauc metodi
newInstance(), kura dot atpakaļ atsauci uz izveidoto
objektu. Jauna eksemplāra izveidošanas laikā konteineris
izsauc arī metodes setSessionContext() un ejbCreate().
•
Komponenta eksemplārs atrodās pūlā un gatavs apkalpot
klienta pāradresētu pieprasījumu, kas satur metodes
izsaukumu.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (27)
Komponenta Stateful session bean dzīves cikls
•
Ja konteineris nolemj īslaicīgi pasīvēt eksemplāra stāvokli,
tiek izsaukta metode ejbPassivate(), kura ieraksta
eksemplāra stāvokli magnētiskajā diskā. Pats eksemplārs
šajā gadījumā var palikt pūlā un to var izmantot cits klients.
•
Objekta aktivizācijai tiek izsaukta metode ejbActivate().
•
Konteineris pāradresē metodes izsaukumu noteiktam
komponenta eksemplāram. Šī metode var izmainīt
eksemplāra stāvokli.
•
Konteineris var pasivēt eksemplāra stāvokli.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (28)
Komponenta Stateful session bean dzīves cikls
•
Klients izsauc komponenta Stateful sassion bean
interfeisa home metodi remove().
•
Konteineris pārtrauc eksemplāra dzīves ciklu
izsaucot metodi ejbRemove().
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (29)
Piemērs Izveidosim kalkulātoru ar atmiņu, lai iepriekšējās
operācijas rezultāts tiktu saglabāts atmiņā un to būtu
iespējams izmantot nākamajā operācijā. Pieņemsim, ka
komponents CalkulatorBean ir izvietots vienā un tajā pat
konteinerā kopā ar komponentu stateful session bean ar
nosaukumu AdvancedCalculatorBean, kuru klients izmanto,
lai izsauktu componenta Calculator Bean metodes. Sakarā
ar to, viena konteinera robežās lietderīgāk izmantot lokālos
interfeisus, home un remote interfeisu vietā izmantosim
interfeisus local home un local ar to pašu metožu sarakstu.
Realizācijas klases CalculatorBean kods, kas realizē
interfeisu SessionBean, ne ar ko neatšķiras no iepriekšējā
piemēra koda.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (30)
Local home interfeis CalculatorHome
package j2eebook.ejb;
import javax.ejb.EJBLocalHome;
import javax.ejb.FinderException;
import javax.ejb.EJBException;
import javax.ejb.CreateException;
public interface CalculatorHome extends EJBLocalHome {
Calculator create() throws CreateException, EJBException;
}
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (31)
Local interfeis Calculator
package j2eebook.ejb;
import javax.ejb.EJBLocalObject;
import javax.ejb.FinderException;
public interface Calculator extends EJBLocalObject {
float addition(float itemOne, float itemTwo) throws
EJBException;
}
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (32)
Interfeisa SessionBean realizācijas klase
package j2eebook.ejb;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.CreateException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import javax.ejb.RemoteException;
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (33)
public class AdvancedCalkulatorBean implements SessionBean {
private SessionContext ctx;
private float myResult;
private Calculator myCalculator;
static private final String calculator_ref = “calculator_ref”;
public void setSessionContext(SessionContext context) throws
RemoteException, EJBException {
ctx = context;
}
public void ejbActivate() throws EJBexception {
}
public void ejbPassivate() throws EJBException {
}
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (34)
public void ejbRemove() throws EJBException {
try {
myCalkulator.remove();
} catch (RemoteException ex) {
ex.printStackTrace();
throw new EJBException(ex.getMessage());
}
}
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (35)
public void ejbCreate(float initValue) throws
CreateException,EJBException {
myResult = initValue;
CalculatorHome home = lookup(“java:comp/env/” +
calculator_ref);
myCalculator = home.create();
if (myCalculator == null) {
throw new CreateException(“Can’t lookup Calculator
bean”);
}
}
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (36)
public float addition(float item) {
myResult = myCalcilator.addition(myResult, item);
return myResult;
}
private CalkulatorHome lookup(String jndi) {
try {
Context initial = new InitialContext();
Object objref = initial.lookup(jndi);
return
(CalculatorHome)PortableRemoteObject.narrow(objref,
CalkulatorHome.class);
} catch (Exception ex) {
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (37)
ex.printStackTrace();
throw new EJBException(ex.getMessage());
}
}
public void clear() {
myResult = 0;
}
}
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (38)
Home interfeis Advanced Calculator Home
package j2eebook.ejb;
import javax.ejb.EJBHome;
import javax.ejb.CreateException;
import javax.ejb.EJBException;
import java.rmi.RemoteException;
public interface AdvancedCalculatorHome extends EJBHome{
AdvancedCalculator create(float initValue) throws
CreateException, EJBException, RemoteException;
}
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (39)
Remote interfeis Advanced Calculator
package j2eebook.ejb;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
public interface AdvancedCalculator extends EJBObject {
float addition(float item) throws RemoteException,
EJBException;
void clear() throws RemoteException, EJBException;
}
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (40)
Lietojumprogrammas izvietošana serverī Lai izvietotu
lietojumprogrammu serverī, ir jāizpilda sekojošas darbības:
•
Jānokompilē klases CalculatorBean.java,
CalculatorHome.java, Calculator.java,
AdvancedCalculatorBean.java,
AdvancedCalculatorHome.java un AdvancedCalculator.java;
•
jāizveido piegādes deskriptorus ejb-jar.xml, application.xml un
sun-j2ee-ri.xml;
•
Jāizveido tilpfailu calculator.jar, kurā jāiepako nokompilētie
klašu faili un piegādes deskriptors ejb-jar.xml;
•
Jaizveido tilpfailu Calculator.ear, kurā jāiepako piegādes
deskriptori application.xml, sun-j2ee-ri.xml un fails
calculator.jar.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (41)
Piegādes deskriptors ejb-jar.xml
<?xml version=“1.0”?>
<!DOCTYPE ejb-jar PUBLIC ‘-//Sun Microsystems, Inc.//DTD Enterprise Java
Beans 2.0//EN’
‘http://java.sun.com/dtd/ejb-jar_2_0dtd’>
<ejb-jar>
<enterprise-beans>
<session>
<display-name></display-name>
<ejb-name>CalculatorBean</ejb-name>
<local-home>j2eebook.ejb.CalculatorHome</local-home>
<local>j2eebook.ejb.Calculator</local>
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (42)
<ejb-class>j2eebook.ejb.CalculatorBean<ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</sassion>
<session>
<display-name></display-name>
<ejb-name>AdvancedCalculatorBean</ejb-name>
<home>j2eebook.ejb.AdvancedCalculatorHome</home>
<remote>j2eebook.ejb.AdvancedCalculator</remote>
<ejb-class>j2eebook.ejb.AdvancedCalculatorBean</ejb-class>
<session-type>Stateful</session-type>
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (43)
<transaction-type>Container</transaction-type>
<ejb-local-ref>
<ejb-ref-name>cakculator</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local-home>j2eebook.ejb.CalculatorHome</local-home>
<local>j2eebook.ejb.Calculator</local>
<ejb-link>CalculatorBean</ejb-link>
</ejb-local-ref>
</session>
</enterprise-beans>
</ejb-jar>
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (44)
Piegādes deskriptors application.xml
<?xml version=“1.0”?>
<!DOCTYPE application PUBLIC “-//SunMicrosystem, Inc.//DTD
J2EE Application 1.3//EN”
http://java.sun.com/dtd/application_1_3.dtd>
<application>
<display-name>ejb</display-name>
<module>
<ejb>ejb.jar</ejb>
</module>
</application>
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (45)
Piegādes deskriptors sun-j2ee-ri.xml
<?xml version=“1.0”?>
<j2ee-ri-specific-information>
<server-name>SunEEAppServer</server-name>
<rolemapping/>
<enterprise-beans>
<module-name>ejb.jar<module-name>
<ejb>
<ejb-name>CalculatorBean</ejb-name>
<jndi-name>j2eebook.ejb.CalculatorBean</jndi-name>
</ejb>
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (46)
<ejb>
<ejb-name>AdvancedCalculatorBean</ejb-name>
<jndi-name>j2eebook.ejb.AdvancedCalculatorHome
</jndi-name>
</ejb>
</enterprise-beans>
</j2ee-ri-specific-information>
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (47)
Fails Calculator.ear Calculator.ear
META-INF
application.xml
sun-j2ee-ri.xml
calculator.jar
META-INF
ejb-jar.xml
j2eebook\ ejb\
AdvancedCalculator.class
AdvancedCalculatorBean.class
AdvancedCalculatorHome.class
Calculator.class
CalculatorBean.class
CalculatorHome.class
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (48)
Komponenta AdvancedCalculatorBean klients
package j2eebook.ejb.client;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import j2eebook.ejb.AdvancedCalculatorHomep;
import j2eebook.ejb.AdvancedCalculator;
public class CalculatorClient {
public static void main(String[] argv) {
try {
Context initial = new InitialContext();
Object objref = initial.lookup(JNDI);
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (49)
j2eebook.ejb.AdvancedCalculatorHome home =
(j2eebook.ejb.AdvancedCalculatorHome)
PortableRemoteObject.narrow(objref,
j2eebook.ejb.AdvancedCalculatorHome.class);
float item = 0;
float result = 0;
j2eebook.ejb.AdvancedCalculator aAdvancedCalculator =
home.create(result);
result = aAdvancedCalculator.addition(3);
System.out.println(“” + item + “ + 3 = “ + result);
item = result;
result = aAdvancedCalculator.addition(4);
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (50)
System.out.println(“” + item + “ + 4 = “ + result);
item = result;
aAdvancedCalculator.remove();
} catch (Exception ex) {
ex.printStackTrace();
}
}
private final static String JNDI =
“j2eebook.ejb.AdvancedCalculatorHome”;
}
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (51)
Klients izpilda sekojošas darbības:
•
Iestata nosaukumu dienesta sākumkontekstu (sākumpunkts
sakaru nodibināšanai ar kataloga struktūru).
•
Izmantojot komponenta JNDI nosaukumu un home interfeisu
j2eebook.ejb.AdvancedCalculatorHome, sameklē komponenta
EJB objektu home, kas realizē home interfeisu. Rezultātā
klients saņem objekta atsauci.
•
Ar metodi narrow() pārveido objektu vajadzīgajā formā.
•
Piešķir mainīgiem item un result sākumvērtības vienādas ar 0.
•
Inicializē komponentu ar home interfeisa metodi create().
•
Ar remote interfeisu izsauc biznesmetodes.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (52)
Objektu komponenti Komponenti Entity Enterprize
JavaBean ir paredzēti darbam ar datu bāzu tabulām.
Komponentu realizācijas klase ir saistīta ar datu bāzes
tabulas definīciju, bet šīs klases eksemplāri ir saistīti ar
atsevišķām tabulas rindām. Klases eksemplāra metodes
ejbCreate() izsaukšana izveido jaunu rindu datu bāzē, bet
metodes ejbRemove() izsaukšana likvidē atbilstošu rindu
datu bāzē. Tādejādi, darbs ar datu bāzes tabulas rindām
tehnoloģijā J2EE tika aizvietots ar Entiti JavaBean objektu
izmantošanu. Tas ļāva panākt EJB programmas neatkarību
no izmantojamās datu bāzes tipa: Microsoft Access,
Cloudscape, Oracle vai Microsoft SQL Server X.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (53)
Komponents message – driven bean Šis
Komponents izmanto java ziņojumu servisu (Java
Messaging Service – JMS) ziņojumu pārraidei. Java
ziņojumu serviss izmanto divus modeļus:
• point – to – point (punkts – punkts);
• publish – subscribe (publicēt – parakstīties).
Modelis point – to – point balstās uz rindu
izmantošanu. Viselastīgākais variants atbilst
gadījumam, kad ziņojumi tiek ierakstīti rindā zem
JNDI nosaukuma.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (54)
Komponents message – driven bean
Modeļa “publish – subscribe” izmantošanas gadījumā
kā ziņojumu glabātava tiek izmantota kokveida
struktūra. Ziņojuma avots pārsūta ziņojumus
kokveida struktūras mezglam (topic). Glabātavas
struktūru nosaka lietojumprogramma. Ziņojumu
saņēmējiem, lai saņemtu ziņojumus, ir jāparakstās uz
atbilstoša mezgla ziņojumiem. Kad kādā mezglā tiek
izvietots ziņojums, ziņojumu saņēmēji, kas ir
parakstījušies uz atbilstošu ziņojumu saņemšanu,
saņem paziņojumus un ziņojuma kopijas.
TEHNOLOĢIJA ENTERPRIZE
JAVABEANS (55)
Komponents message – driven bean
Tādejādi message – driven bean komponents saņem
ziņojumus no konteinera rindām (queues) vai nodaļām (topics)
un izpilda biznesa loģiku , kas atbilst ziņojuma saturam. Lai
būtu iespējams aizsūtīt ziņojumu, ziņojuma adrese ir jānorāda
piegādes deskriptora tagā <message – driven – destination>.
Klients var noskaidrot ziņojumu rindas adresi izmantojot JNDI
un inicializācijas kontekstu:
Context initialContext = new InitialContext();
Queue stockInfoQueue = (javax.jms.Queue)
initialContext.lookup(“java:com/env/jms/stockInfoQueue”);
Related documents