J2EE. CMP Entity Beans, Transaksjoner, JSP



Like dokumenter
J2EE og distribuerte systemer Leksjon 11: Entity Beans (CMP)

J2EE og distribuerte systemer Leksjon 10: Entity Beans (BMP)

Repetisjon J2EE. Fullstendig skisse. JNDI og EJB. Session Beans Entity Beans (BMP)

La oss først se på problemet med objektorientert tankegang. Se figuren under. Konto

J2EE og distribuerte systemer Leksjon 9: Session Beans

J2EE. Katalogtjenester, JNDI og Enterprise Beans

Løsningsskisse, eksamen J2EE og distribuerte systemer 19.mai 2004

HØGSKOLEN I SØR-TRØNDELAG

Eksamen i Internetteknologi Fagkode: ITE1526

Videregående programmering 6

INF Seminaroppgaver til uke 3

Kapittel 7: Mer om arv

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

UNIVERSITETET I OSLO

OPPGAVE 5b og 8b Java Kode

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

Java RMI. Introduksjon. Markus Foss Hans-Gunnar Vold

INF1010 Eksamenstips. Løsningsforslag prøveeksamen del 1.

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

INF1010 Arv. Marit Nybakken 2. februar 2004

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

TOD063 Datastrukturer og algoritmer

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

Transaksjoner og flerbrukerproblematikk. Transaksjoner

Norges Informasjonsteknologiske Høgskole

EKSAMEN. Objektorientert programmering

Transaksjoner og flerbrukerproblematikk. Transaksjoner

Repitisjonskurs. Arv, Subklasser og Grensesnitt

INF1010. Grensesnittet Comparable<T>

Distributed Component Object Model. Utvikling av distribuerte applikasjoner. Utvidelse av COM for støtte av distribuerte objekter

Eksamen. Objektorientert Programmering IGR 1372

Spesifikasjon av Lag emne

Repetisjon. INF gruppe 13

(MVC - Model, View, Control)

Dagens tema Kapittel 8: Objekter og klasser

HØGSKOLEN I SØR-TRØNDELAG

Ansvarsdrevet OO: CRC og UML Sekvensdiagrammer

INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java

INF 1010, vår 2005 Løsningsforslag uke 11

INF1010 våren Arv og subklasser - del 2

Utførelse av programmer, metoder og synlighet av variabler i JSP

Introduksjon til objektorientert programmering

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Antall sider (inkl. forsiden): 7. Alle trykte og håndskrevne

J2EE og distribuerte systemer Leksjon 8: Oppbygning av J2EE-applikasjoner

Løse reelle problemer

UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet

INF Uke 10. Ukesoppgaver oktober 2012

TDT4100 Objektorientert programmering

Diverse eksamensgaver

EKSAMEN I FAG TDT4100 Objektorientert programmering. Fredag 6. juni 2008 Kl

INF1000 Prøveeksamen Oppgave 7 og 9

IN1010 våren 2018 Tirsdag 15. mai. Repetisjon av subklasser og tråder. Stein Gjessing Institutt for informatikk Universitetet i Oslo

Læringsmål for forelesningen

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Løsningsforslag Test 2

Oversikt. Feil i programmet hva skjer? Array indeks utenfor sine grenser. Inf1010 Våren Feilsituasjoner og unntak i Java

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

Kapittel 13 Advanced Hypertext Implementation. Martin Lie Ole Kristian Heggøy

G høgskolen i oslo. Emne: Algoritmer og datastrukturer. Emnekode: 80131A. Faglig veileder: UlfUttersrud. Gruppe(r) : Dato:

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

BOKMÅL Side 1 av 7. KONTINUASJONSEKSAMEN I FAG TDT4100 Objektorientert programmering / IT1104 Programmering, videregående kurs

Ordliste. Obligatorisk oppgave 1 - Inf 1020

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

INF1000: Forelesning 7

Innhold uke 7. Objektorientert programmering i Python: Introduksjon. Lite tilbakeblikk: Programflyt og skop. Lite tilbakeblikk: Funksjoner er uttrykk

INF Uke 10. Løsningsforslag ukesoppgaver oktober 2012

Installasjonsveiledning

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

Det finnes ingenting. som kan gjøres med interface. men som ikke kan gjøres uten

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

OO-eksempel. Modellen ser slik ut: Studenter + antstudenter : int = 0

Kapittel 9: Sortering og søking Kort versjon

Enkle generiske klasser i Java

Post-it spørsmål fra timen (Arv og subklasser)

Forklaring til programmet AbstraktKontoTest.java med tilhørende filer Konto.java, KredittKonto.java, SpareKonto.java

Dagens tema: Mer av det dere trenger til del 1

JSP - 2. Fra sist. Hvordan fungerer web? Tjenerside script HTML. Installasjon av Web-tjener Et enkelt JSP-script. Ønsker dynamiske nettsider:

Eksamen Objektorientert Programmering 2013

Avdeling for ingeniørutdanning Institutt for teknologi

UNIVERSITETET I OSLO

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

Del 3: Evaluere uttrykk

LO191D/LC191D Videregående programmering

UNIVERSITETET I OSLO

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

GUI-programmering, del 3 Vinduslyttere Dialogvinduer GUI-komponenten JTable Egne datamodellklasser. En oversikt over kapittel 19 i boka

INF1000: Forelesning 7. Konstruktører Static

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

J2EE og distribuerte systemer Leksjon 7: Installasjon av applikasjonstjener og JNDI

INF1000: Forelesning 6. Klasser og objekter del 1

Å lese tall fra en fil, klassen Scanner

Graphics. Grafikk. Praktisk sett: Koordinatsystemet. kodeeksempel

import java.io.*; import java.util.*; import javagently.text;

Transkript:

J2EE CMP Entity Beans, Transaksjoner, JSP

CMP Entity Beans Container Managed Persistence Container sin oppgave å lagre innholdet i EJB til varig lager (typisk DB). Implementasjonsklassen lages abstrakt. container lager sub-klasse som implementerer metodene ejbload() ejbstore() Har ikke objektvariabler kontonr og saldo => bare abstrakte get/set-metoder for variablene Forretningslogikk metodene bruker get/setmetodene for å endre dataene i EJB en.

Impl. KontoCMPBean import javax.ejb.*; import java.util.*; public abstract class KontoCMPBean implements EntityBean{ private EntityContext ctx; /**************** SET/GET-metoder ********************/ public abstract void setkontonr(integer kontonr); public abstract Integer getkontonr(); public abstract void setfornavn(string fornavn); public abstract String getfornavn(); public abstract void setetternavn(string etternavn); public abstract String getetternavn(); public abstract void setsaldo(double nysaldo); public abstract int getsaldo(); /************* ENTITY METODER **********************/ public void setentitycontext(entitycontext ctx){ this.ctx = ctx; public Integer ejbcreate(integer kontonr, String fornavn, String etternavn) throws CreateException{ if (kontonr == null kontonr.intvalue() < 1) throw new CreateException("Kontonr må være et positivt tall"); if (fornavn == null fornavn.equals("")) throw new CreateException("Eier av konto må ha et fornavn"); if (etternavn == null etternavn.equals("")) throw new CreateException("Eier av konto må ha et etternavn"); setkontonr(kontonr); setfornavn(fornavn); setetternavn(etternavn); setsaldo(0); return null; //gjøres når det er snakk om CMP. Containeren lager nøkkelen

forts. KontoCMP public void unsetentitycontext(){ public void ejbpostcreate(integer kontonr, String fornavn, String etternavn){ public void ejbload(){ public void ejbstore(){ public void ejbactivate(){ public void ejbpassivate(){ public void ejbremove(){ /******* Foretningslogikk ***********************/ public void settinn(int belop){ int saldo = getsaldo(); setsaldo(saldo + belop); public void taut(int belop) throws KontoException{ int saldo = getsaldo(); if (saldo - belop < 0) throw new KontoException("Ikke dekning på konto"); setsaldo(saldo - belop); public int hentsaldo(){ return getsaldo();

Finn-metodene public interface KontoCMPHome extends EJBHome{ public KontoCMP create(integer nyttkontonr, String fornavn, String etternavn) throws RemoteException, CreateException; public KontoCMP findbyprimarykey(integer kontonr) throws RemoteException, FinderException; public Collection findbysaldooverbeløp(int saldo) throws RemoteException, FinderException; //home-metode public int beregnantallkontoer() throws RemoteException, Beskrives i Home-interfacet (som vanlig) ingen implementasjon findbyprimarykey(integer kontonr) findbysaldooverbeløp(int saldo) findallekontoer() ikke med over

Finnmetoder Hvordan kan container lage spørring for findbysaldooverbeløp()? må ha hjelp av deg, til å spesifisere spørringen. container returnerer alltid en/flere EJB er som resultat til finn-metodene! For alle finn metoder spesifiserer vi EJB- SL spørringer i dd (via deploytool).

dd <guery> <query-method> <method-name>findbysaldooverbeløp</method-name> <method-params> <method-param>int</method-param> </method-params> </query-method> <ejb-ql>select object(o) from KontoSkjema o where o.saldo?1</ejb-ql> </query> Klient findbysaldooverbeløp(2) Home- Obj. SQL:select. Prim.nøkkel: 2,5,6 DB Collection EJB-obj. Prim.nøkkel 2 EJB-obj. Prim.nøkkel 5 EJB-obj. Prim.nøkkel 6

Home-metoder Ønsker å finne ut hvor mange kontoer som finnes. Hvordan gjøres dette? Collection findallekontoer() //finnmetode int beregnantallkontoer() //home-metode Home-metoder beskrives i home-interface + implementasjon i impl.klassen. Metode som ikke er knyttet til en spesiell instans (sees på som klassemetode)

Home-metode Home-interfacet int beregnantallkontoer() throws RemoteEx. Impl-klassen int ejbhomeberegnantallkontoer() Hvordan beregner vi hvor mange kontoer som finnes? må gjøre spørring mot DB, men ikke finnmetode

Select-metoder Ved å lage metoder som begynner med ejbselect i impl. klassen angir du at dette er en metode det skal kobles en EJB-QL spørring mot! Collection ejbselectallekontoer() int ejbhomeberegnantallkontoer(){ Collection kontoer = ejbselectallekontoer(); return kontoer.size();

Forhold mellom Entity Beans Person 1 0..* Konto

Databasetabeller for EJB er Personnummer Fornavn Etternavn 231288 45254 Ola Normann 010199 11111 Kari Normann Kontonr Saldo Fremmednøkkel 1 2 3 1000 2000 1 231288 45254 231288 45254 010199 11111 Ola har to kontoer. Fremmednøkkel ligger i mange delen av relasjonen. Hvordan kan container lage tabellene automatisk? Vi må angi forholdet/relasjonen mellom EJB ene (deploytool).

Problemer med distribuerte transaksjoner Vi skal overføre penger mellom en konto i DNB og SB1 => to DB-systemer overfør(int frakonto, tilkonto, beløp){ try{ //sørg for at autocommit er false forbindelsednb = //hent DB-forbindelse forbindelsesb1 = //hent DB-forbindelse forbindelsednb.taut(beløp); forbindelsesb1.settinn(beløp);.. catch(..) Problemet ligger i at vi får to transaksjoner her. Databasesystemene kan ikke hjelpe oss slik at overføringen blir en transaksjon (i stedet for 2). => Overføringen er ikke automisk. Det blir ikke alt eller ingenting her. En av transaksjonene kan gå mens den andre feiler.

To-fase commit. Bruker applikasjonstjeneren som sjef/monitor i transaksjonen. Objektene som inngår i transaksjonen rapporterer til tjeneren. public void overfør(int frakonto, int tilkonto, beløp){ //start transaksjon, alt som kommer etter ligger i en transaksjon //finn objektet (EJB) for frakonto //finn objektet (EJB) for tilkonto //gi objektet for frakonto beskjed om å sjekke om det er mulig å trekke beløp //gi objektet for tilkonto beskjed om å sjekke om det er mulig å sette inn beløp //hvis alt OK så gir applikasjonstjeneren beskjed om å utføre handlingen, dvs. commit. //hvis ikke gi objektene beskjed om å ikke utføre endringer => rollback()

Fasade av Session Beans Metoder i Entity Beans er alltid i en transaksjon (enten alene eller som del av en annen transaksjon). Spesifiseres i deploytool Containeren sørger for utførelsen I en Session Bean er det valgfritt om en metode skal være en transaksjon eller ikke. Spesifiseres i deploytool Container kan sørge for utførelsen (kan også gjøres manuelt).

Klient taut(100) KontoCMP Saldo = 100 (0) settinn(100) KontoCMP Saldo = 100 (200) DB Container overfør(,100) Klient Session Bean overfør(){ starttrans taut(100) KontoCMP Saldo = 100 (0) DB slutttrans settinn(100) KontoCMP Saldo = 100 (200)

Isolering mellom transaksjoner DB Konto 1 (EJB) Konto 1 (EJB) 100 ejbload() => saldo = 100 100 saldo = saldo + 100 100 ejbload() => saldo = 100 200 200 ejbstore() => saldo = 200 saldo = saldo + 100 200 ejbstore() => saldo = 200

Kommentar isolering Problemet ligger i at to transaksjoner (EJB er) får tilgang til å lese innholdet i DB-samtidig. Vi må altså spesifisere hvordan databasesystemet skal forholde seg til samtidighet READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ SERIALIZABLE (transaksjoner utføres i serie, liten samtidighet). To/tre måter å unngå dette: 1. forbindelse.settransactionisolation(int level) 2. Sett isolering på databasenivå. Dette gjøres da via databaseadministrasjonsverktøy. For cloudscape kan man for eksempel gjøre slik <isql> CALL PropertyInfo.setDatabaseProperty( 'cloudscape.language.defaultisolationlevel, 'SERIALIZABLE'); 3. Konfigurasjon i applikasjonstjeneren (best løsning) Metode 1 fungerer ikke sammen med containerens transaksjonshåndtering! Man skal aldri endre isolasjonsnivå i en transaksjon!! overfør(){ //container starter transaksjon forbindelse.settransactionisolation(.) //endring inne i transaksjon!!

Unntak Hiv EJBException() i EJB-metodene setentitycontext() ejbload() ejbstore() osv.. I andre metoder er det ofte best å hive egne unntak (lag egne unntaksklasser). EJBException() gjør at eventuelle transaksjoner rulles tilbake. Andre unntak gjør ikke dette => må gjøres manuelt overfør( ){ try{ //finn EJB for frakonto //trekk beløp; hiver KontoException hvis det ikke er dekning //finn EJB for tilkonto //sett inn beløp catch(kontoexception e){ kontekst.setrollbackonly(); //VIKTIG

J2EE og web J2EE-applikasjoner kan bestå av JSP-klienter i stedet for java-klienter eller begge deler. gjøres enkelt i deploytool Gjør at fordelene fra J2EE kan brukes også i forbindelse med web. Komponentene blir de samme uansett hvilken klient vi bruker. Gjenbruk. Jsp: <%.. InitialContext init = new InitialContext(); Object obj = init.lookup("java:comp/env/ejb/gjetttallspill"); GjettTallSpillHome home = (GjettTallSpillHome)PortableRemoteObject.narrow(obj, GjettTallSpillHome.class); spill = home.create(); session.setattribute("spill", spill); %>

Verktøy for J2EE Utviklingsverktøy Jbuilder Sun ONE Enterprise osv Applikasjonstjenere WebLogic (kommersiell) Jboss (open source) osv. Ant Verktøy for å kompilere kode m.m. (deploy) Uansett verktøy => prinsippene blir de samme Husk at ear/jar-filene dere lager skal være universelle. De skal fungere uansett hvilken tjener man velger.