J2EE og distribuerte systemer Leksjon 9: Session Beans

Størrelse: px
Begynne med side:

Download "J2EE og distribuerte systemer Leksjon 9: Session Beans"

Transkript

1 J2EE og distribuerte systemer Leksjon 9: Session Beans Leksjonen er forfatters eiendom. Som kursdeltaker kan du fritt bruke leksjonen til eget personlige bruk. Kursdeltakere som ønsker å bruke leksjonene f.eks. til undervisning eller kursformål må ta direkte kontakt med forfatter for nærmere avtale. Copyright: Tomas Holt/TISIP Publisert Frist innlevering av øvingsoppgaver Innhold 1 KOMMENTAR TIL LEKSJONEN DATASOURCE-OBJEKTER ANDRE DATABASESYSTEMER ENN CLOUDSCAPE NOEN ORD OM JNDI JNDI OG DATASOURCE-OBJEKTER JNDI OG MILJØVARIABLER SESSION BEANS MED TILSTANDER TILSTANDSLØSE SESSION BEANS FLERBRUKERPROBLEMATIKK OG SYNKRONISERING SESSION BEANS MED TILSTANDER EJBCREATE() HVORDAN SER EN TFSB UT? METODEN EJBPASSIVATE() HVORDAN BEHANDLE UNNTAK EKSEMPEL PÅ SESSION BEAN MED TILSTANDER OPPGAVE / BRUK AV EN SESSION BEAN SOM CACHE PROBLEMER?...24

2 1 Kommentar til leksjonen Vi har nå kommet ditt at du er i stand til å lage J2EE-applikasjoner. I forrige leksjon/øving brukte vi tilstandsløse Session Beans. Vi skal nå se på hva Session Beans med tilstander kan gjøre for oss, og hva som vil være forskjellen på disse i forhold til de tilstandsløse. I tillegg skal vi se på noen triks i forhold til JNDI, og ikke minst må vi se litt nærmere på hvordan vi behandler unntak (Exceptions) i en EJB. Leksjon 7 og 8 har innbefattet en god del teori. Dette er nødvendig for å skape forståelse. I denne uken blir det imidlertid mindre teori og mer praksis. Øvingen vil være litt større enn tidligere. Leksjonen omhandler kapittel 6 i boka. 2 DataSource-objekter Bruk av databaser blir viktig i fortsettelsen av dette kurset. I forbindelse med J2EE bruker man DataSource-objekter som grensesnitt mot en database, se figuren under. Et slikt DataSource-objekt vil være koblet mot en bestemt database og vite hvilken driver som skal brukes. Som programmerer vil du bruke JNDI for å finne et slikt DataSource-objekt og så kalle getconnection() på dette objektet. Objektet vil da returnere et Connection-objekt som kan brukes mot databasen (det er med andre ord opp til DataSource-objektet å lage selve oppkobligen mot databasen). Merk at dette DataSource-objeket kan holde styr på en pool av (dvs. flere) oppkoblinger mot databasen. Når en klient kaller getconnection() på objektet returneres et av de ledige Connection-objektene. Merk at det ikke er nødvendig å sette opp en ny oppkobling mot databasen i dette tilfellet, oppkoblingen er allerede laget og kan brukes direkte. Når klienten er ferdig med Connection-objektet så kalles metoden close() på objektet. Dette vil føre til at oppkoblingen returneres til DataSource-objektet som kan gi Connectionobjektet til en annen klient. Selve oppkoblingen (Connection) mot databasen vil derfor aldri bli lukket. Dette er en stor fordel fordi det er ressurskrevende å lage slik oppkoblinger mot databasen (du har sikkert sett at oppkobling mot en database tar lang tid. Dette kommer som oftest av at det tar lang tid å koble opp mot databasen. Selve spørringen tar ofte lite tid). I tillegg så er det en fordel at klientene deler på oppkoblingene mot databasen fordi man på denne måten unngår å ha en oppkobling pr. klient. Det er to grunner til at dette kan være uønsket. Lisenser for bruk av databasesystemet betales ofte etter hvor mange samtidige oppkoblinger man har mot systemet. Færre oppkoblinger gir billigere lisens. Mange oppkoblinger mot databasesystemet bruker ekstra ressurser, noe som kan gjøre databasesystemet tregere. Det går altså ressurser på å holde styr på mange oppkoblinger, i stedet for å bruke disse ressursene på å gjøre databaserelaterte oppgaver.

3 DataSource-objekt Connection-objekter Oppkoblinger Database... Klientkode: DataSource ds =...;//Bruk JNDI for å finne objektet Connection con = ds.getconnection();//låner et av Connection-objektene //Gjør databasekall... con.close(); //Gir Connection-objektet tilbake til DataSource-objektet 3 Andre databasesystemer enn cloudscape I utgangspunktet vil applikasjonstjeneren sørge for å opprette et DataSource-objekt for cloudscape. Du kan imidlertid sørge for at applikasjonstjeneren oppretter DataSourceobjekter for andre databasesystemer. F.eks. kan det være aktuelt å bruke en oracle database i stedet for cloudscape. For at dette skal gå må du først få tak i en databasedriver som støtter connection-pooling. Denne driveren må legges på katalogen <j2ee-home>\lib\system. Nå må du velge Tools > Server Configuration > Standard i deploytool.

4 Ved å velge Add for JDBC Drivers i skjermbildet over kan du legge til en ny driver-klasse. Den nederste av de to har jeg lagt til for å kunne bruke oracle. Når driveren for databasesystemet er lagt til kan du sørge for at det blir laget et DataSource-objekt for databasesystemet, og hvilket JNDI-navn objektet skal ha. Trykk Add for Datasources. I venstre del av tabellen må du angi JNDI-navn (valgfritt, men bør starte med jdbc/) og i høyre del må du angi JDBC URL. Denne vil være forskjellig for ulike databasesystemer. I figuren over kan du se at jeg har laget et DataSource-objekt med JNDI-navn jdbc/oracle. Tilslutt må du gå inn i filen <j2ee-home>\bin\userconfig.bat og endre denne slik at J2EE_CLASSPATH settes til å peke på jar-filen databasedriveren ligger i. Hos meg blir da filen som vist under. De endringene jeg har gjort er med uthevet skrift. REM REM Copyright 2002 Sun Microsystems, Inc. All rights reserved. REM SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. REM rem J2EE_CLASSPATH is appended to the classpath referenced by the EJB server. rem J2EE_CLASSPATH must include the location of the JDBC driver classes rem (except for the Cloudscape driver shipped with this release). rem Each directory is delimited by a semicolon. rem set J2EE_CLASSPATH=d:\j2ee\lib\system\ojdbc14.jar rem rem JAVA_HOME refers to the directory where the Java(tm) 2 SDK rem Standard Edition software is installed. rem rem set JAVA_HOME= rem Før du tar i bruk ditt nye DataSource-objekt må du restarte applikasjonstjeneren. Du vil ved oppstart av tjeneren se hvilke DataSource-objekter som blir opprettet (og hvilket navn de får).

5 4 Noen ord om JNDI Vi har tidligere vært inne på at JNDI kan brukes til mange forskjellige typer oppslag (DNS, filer osv.). Når vi bruker JNDI i forbindelse med J2EE-applikasjoner gjøres dette på en litt særegen måte. 4.1 JNDI og DataSource-objekter JNDI brukes for å finne DataSource-objekter. Når vi lager EJB er som skal koble opp mot en database vil vi altså gjøre en JNDI-lookup for å finne et DataSource-objekt. I forrige leksjon ble det beskrevet at for å unngå problemer når det gjelder JNDI-navn så får hver enkelt J2EEapplikasjon sin egen JNDI-kontekst. Når vi gjør en lookup etter en EJB gjør vi derfor noe slik: InitialContext kontekst = new InitialContext(); Object obj = kontekst.lookup( java:comp/env/ejb/helloworld ); HelloWorldHome home = (HelloWorldHome)PortableRemoteObject.narrow(obj,HelloWorldHome.class); Som forklart i forrige leksjon kan strengen java:comp/env/ejb/helloworld mappes til et globalt JNDI-navn (altså et navn som er unikt i denne navnetjeneren). Dette gjør at hver enkelt applikasjon kan ha ulike navn for samme EJB (noe som hindrer navnekonflikter). Det samme gjelder når vi skal bruke databaser. Når en EJB skal ha kontakt med en database så vil man ikke bruke det globale JNDI-navnet. Man bruker et navn som starter med java:comp/env/jdbc. La oss tenke oss at vi har en EJB som gjør databasekall mot tabellen Konto. Utvikleren av EJB en har valgt å gjøre følgende JNDI-oppslag for å finne databasen. InitialContext kontekst = new InitialContext(); DataSource ds = (DataSource)kontekst.lookup( java:comp/env/jdbc/kontodb );

6 Merk at i dette tilfellet så kan vi caste direkte. Du har nettopp kjøpt denne EJB en, men har ingen database på applikasjonstjeneren din som heter dette. Du har imidlertid cloudscape kjørende og du har opprettet tabellen Konto. Du ønsker følgelig å bruke den databasen som du allerede har. For å gjøre dette må du sørge for å mappe navnet java:comp/env/jdbc/kontodb til det globale JNDI-navnet jdbc/cloudscape (dette er det globale navnet for DataSourceobjektet til cloudscape når vi bruker j2ee-tjeneren). For å gjøre denne mappingen må vi bruke deploytool, se figur under. Først finner du EJB en som skal bruke DataSource-objektet. Trykk så på skillearket for Resource Refs. Skriv inn navnet som blir brukt i EJB en. Her blir det jdbc/kontodb (java:comp/env er implisitt gitt). Velg Type til å være DataSource og velg sharable for best ytelse (deler oppkoblinger med andre). Nå har du gitt beskjed om hvilket navn EJB en bruker. Du må nå sørge for å få mappet dette navnet til det globale JNDI-navnet for databasen i systemet (jdbc/cloudscape). I feltet for JNDI Name velger du jdbc/cloudscape. Nå vil EJB en bruke cloudscape som database. Dersom databasesystemet krever brukernavn og passord (cloudscape gjør det ikke) så må du også fylle inn feltene User Name og Password. Ved å trykke på jar-filen for komponenten (se figuren under) og velge skillearket for JNDI, kan du se hvilke JNDI-navn osv. som brukes for denne komponenten.

7 4.2 JNDI og miljøvariabler Vi kan også ha bruk for JNDI i våre EJB er i andre sammenhenger. Se på koden vist under. Her har jeg laget en generell klasse som implementerer SessionBean-interfacet. I forrige leksjon observerte vi at de fleste metodene i dette interfacet godt kan være tomme. Det er derfor greit å lage seg en klasse som vi kan arve fra i stedet for å ha alle metodene i hver EJB vi lager. Du kan se at hver metode skriver ut en streng som kan brukes for debugging. I dette tilfellet vil utskriften havne i konsollvinduet hvor applikasjonstjeneren kjører. Dette kan være svært nyttig når ting ikke går helt som planlagt, og merk mine ord, det vil du oppleve i fortsettelsen. Ok, se spesielt på metoden log(). Det er denne metoden som sørger for å skrive ut, men utskrift skjer kun hvis variabelen debug=true. Grunnen til dette er at vi kun vil ha utskrift når vi selv ønsker det (tro det eller ei men utskrift til konsollvindu er ganske ressurskrevende i Java). Spørsmålet er hvordan endrer vi variabelen debug uten å måtte rekompilere klassen? Jo, vi bruker en miljøvariabel som inneholder verdien vi ønsker. Vi finner denne miljøvariabelen ved å bruke JNDI. I en EJB vil bestandig metoden setsesisoncontext() være den metoden som blir kalt først. Vi finner derfor verdien til miljøvariabelen debug i denne metoden. Merk at vi også tar vare på en referanse til et SessionContext-objekt. Dette er faktisk en referanse til EJB-objektet, men vil ikke brukes så ofte i forbindelse med SessionBeans.

8 import javax.ejb.*; import javax.naming.*; public class GeneriskSessionBean implements SessionBean{ private String klassenavn = ""; private boolean debug = true; protected SessionContext context; protected void setklassenavn(string navn){ klassenavn = navn; protected void setdebug(boolean debug){ this.debug = debug; protected void log(string str){ if(debug) System.out.println(klassenavn + " " + str); public void ejbremove(){ log("ejbremove()"); public void ejbactivate(){ log("ejbactivate()"); public void ejbpassivate(){ log("ejbpassivate()"); public void setsessioncontext(sessioncontext ctx){ InitialContext init = new InitialContext(); Boolean tmp = (Boolean)init.lookup("java:comp/env/debug"); debug = tmp.booleanvalue(); catch(namingexception e){ debug = true; log("setsesisoncontext()"); context = ctx; Det vi trenger nå er en måte å angi verdien til debug på. Dette gjør vi ved å bruke deploytool, se figuren under. Velg den aktuelle EJB en og trykk på skillearket for Env. Entries. Trykk så Add og velg navnet på miljøvariabelen. Igjen er java:comp/env implisitt gitt. Velg hva slags type variabelen det er snakk om og verdien til variabelen. Når vi nå legger applikasjonen ut på web-tjeneren vil denne verdien være tilgjengelig for EJB en.

9 Hvis du vil teste bruken av miljøvariabler selv, kan du bruke spill.ear vedlagt leksjonen (se lenger ned for gjennomgang av denne applikasjonen). Her benyttes miljøvariabler og du kan teste hva som skjer når de endres. 5 Session Beans med tilstander La oss først ta et lite tilbakeblikk på tilstandsløse Session Beans. 5.1 Tilstandsløse Session Beans I forrige leksjon gikk vi igjennom hvordan en TLSB (tilstandsløs Session Bean) kunne lages. Som vi var inne på så vil aldri en TLSB kunne huske hva klienten har gjort tidligere. Hvorfor er det slik? La oss si at du lager en TLSB. Denne har forretningsmetodene økteller() og hentteller(). Metodene sørger hhv. for å øke en objektvariabel med 1 og å hente ut verdien i objektvariabelen. Du sørger for å legge denne ut på applikasjonstjeneren, som igjen sørger for å opprette 4 objekter av EJB-implementasjonenklassen. Det vil nå finnes 4 objekter som kan ta i mot forespørslene fra klientene. La oss si at vi har 1 klient i systemet vårt. Vi starter opp klienten vår. Klienten finner EJB-objektet til EJB en og kaller metoden økteller() 10 ganger. For hver gang hentes verdien på telleren ut med metoden hentteller(). Du forventer kanskje nå at verdien siste gang blir 10? Det viser seg imidlertid at verdien bare er 3. Hva har skjedd? Det har seg sånn at når vi bruker tilstandsløse Session Beans så vil klienten kunne betjenes av hvilket som helst av objektene opprettet av EJB-implementasjonsklassen. Dette fører til at klienten ikke nødvendigvis kommuniserer med samme EJB-implementasjonobjekt ved hvert kall. Figuren under viser hvordan to kall til økteller() kan betjenes av tjeneren. Riktig nok så vil hver enkelt EJB-implementasjonsobjekt kunne ha sin egen teller, men i.o.m at klienten

10 aldri vet akkurat hvilket objekt han kommuniserer med, så vil det være helt bortkastet at EJB en tar vare på informasjon på vegne av klienten. Container EJB-implementasjon 1: økteller() EJB-implementasjon 1: økteller() Klient 2: økteller() EJBobjekt EJB-implementasjon 2: økteller() EJB-implementasjon Pool av 4 tilstandsløse Session Beans Det at det aldri spiller noen rolle hvilket EJB-implementasjonsobjekt som betjener klienten gjør at TLSB kan tilby god ytelse. 5.2 Flerbrukerproblematikk og synkronisering Det virker kanskje rart at metodene i en EJB-implementasjonsklasse ikke er synkroniserte. Saken er at det er containeren sin oppgave å håndtere flerbrukerproblematikk. Dette gjøres ved at det aldri er mer enn en klient som betjenes av et EJB-implementasjonsobjekt. Følgelig vil det ikke være bruk for oss som programmerere å ta høyde for flerbrukerproblematikk. 5.3 Session Beans med tilstander. I det øyeblikket vi vil at EJB en faktisk skal huske informasjon (tilstander) som er knyttet til en bestemt klient, må vi velge å bruke TFSB (tilstandsfull Session Bean). I dette tilfellet vil hver enkelt klient ha sitt eget EJB-implementasjonsobjekt. Fordelen med en slik løsning er at EJB en er i stand til å huske på de kallene klienten har gjort tidligere. La oss se på eksemplet fra forrige kapittel på nytt. Klienten kaller økteller() 10 ganger, og kaller så hentteller(). I dette tilfellet vil det bestandig returneres tallet 10. Telleren er altså knyttet direkte til hvor mange ganger klienten kaller metoden.

11 Container EJB-implementasjon Klient 1: økteller() 2: økteller() EJBobjekt 1: økteller() 2: økteller() 1 Session Bean for hver klient Styrken til TFSB er også dens svakhet. Det at hver enkelt klient må ha sitt eget EJBimplementasjonsobjekt gjør at det fort kan bli veldig mange slik objekter. Har vi 500 klienter må vi også ha 500 EJB-implementajonsobjekter. Bruker vi TLSB kan det være at vi klarer oss med 10 EJB-implementasjonsobjekter. Tilstander er derfor ressurskrevende, og man bør vurdere om man trenger det. 5.4 ejbcreate() Av de to foregående kapitlene kan man utlede at å kalle create()-metoden på en tilstandsløs Session EJB (home-objektet), faktisk ikke nødvendigvis fører til opprettelsen av et nytt EJBimplementasjonsobjekt. Det er derfor i dette tilfellet ikke noen sammenheng mellom hvor mange ganger en klient kaller create() og hvor mange ganger metoden ejbcreate() faktisk blir utført (det opprettes nye implementasjonsobjekter kun når man trenger det). Når vi bruker TFSB blir saken en helt annen. I dette tilfellet skal hver enkelt klient ha sitt eget EJB-implementasjonsobjekt og følgelig vil ejbcreate() kalles for hver gang create() blir kalt på home-objektet. For TLSB vil aldri ejbcreate() ha noen argumenter. Når vi bruker Session Beans med tilstander kan vi ha flere ejbcreate() metoder, og selv bestemme hvilke argrumenter metoden skal ta. Create() metodene i Home-interfacet må også i dette tilfellet ha tilsvarende argumenter. 5.5 Hvordan ser en TFSB ut? Session Beans med og uten tilstander ser veldig like ut. Vi implementerer i begge tilfellene interfacet SessionBean. Faktisk så kan koden være akkurat lik i begge tilfellene (selv om dette nok vil være meningsløst). Vi angir om det er en TLSB eller TFSB i deploytool når vi lager jar-filen for EJB en. Skjermbildet under viser at du har valget mellom Stateless og Statefull som gir hhv. TLSB og TFSB.

12 Figur 1: TFSB eller TLSB? I forrige leksjon brukte vi EJB en HelloWorld. Denne hadde flere metoder som ikke gjorde noe. Disse var: ejbactivate() ejbpassivate() ejbremove() setsessioncontext() Som forklart skal ikke verken ejbactivate() eller ejbpassivate() ha noen implementasjon i en tilstandsløs Session Bean. Grunnen er at disse metodene aldri vil bli kalt! Når vi snakker om en Session Bean med tilstander blir det hele litt annerledes. I dette tilfellet kan ma n komme i den situasjonen at det ikke lenger er nok minne i maskinen til å holde alle EJB ene i minnet (husk at vi ikke har noen kontroll over hvor mange objekter som blir opprettet, det er klientene som bestemmer dette). Hvis man skulle komme i en situasjon der man ikke lenger kan holde EJB-implementasjonsobjektet i minnet, må man sørge for å lagre det på harddisken. Dette er imidlertid ikke bestandig en rett fram oppgave. Serialiserbare objekter kan enkelt lagres på denne måten, men hva om man har referanser til ikkeserialiserbare objekter? Disse kan helt klart ikke lagres på harddisken, og det er derfor nødvendig å bestemme hva som skal gjøres hvis man kommer i en slik situasjon.

13 Hvis applikasjonstjeneren finner ut at den må lagre et EJB-implementasjonsobjekt på disk så vil den sørge for å kalle metoden ejbpassivate() før lagringen finner sted. Dette gjør at du som programmerer får sjansen til å fjerne referanser til ikke-serialiserbare objekter. Når objektet hentes fra disk vil ejbactivate() kalles slik at man kan sette opp nye referanser til de ikke serialiserbare objektene. Merk at det er viktig at alle referanser til ikke-serialiserbare objekter settes til null i ejbpassivate(). Hva slags objekter er ikke serialiserbare? For å ta et realistisk eksempel så kan vi nevne database Connection-objekter. Koden under viser en Session Bean med tilstander. Du kan se at vi har referansen forbindelse. Dette er en oppkobling mot en database. Man har laget EJB en slik at det blir satt opp en forbindelse mot databasen når EJB en blir opprettet. Dette gjør at man ikke trenger å sette opp en ny forbindelse mot databasen ved hvert kall til gjørnoemeddatabase(). Dette vil igjen sørge for at denne metoden utføres raskere. Problemet oppstår hvis EJB en må midlertidig lagres til disk. Da må vi sørge for at alt som ikke kan serialiseres er satt til null. Forbindelse settes til null i ejbpassivate(). En ny oppkobling blir laget i det metoden ejbactivate() blir kalt. import javax.ejb.*; import java.sql.*; public class EksempelBean implements GeneriskSessionBean{ Connection forbindelse = null; //holder oppkobling mot DB slik at vi ikke trenger langsom oppkobling //ved hver spørring mot DB. public void ejbcreate() throws CreateException{ lagdbconnection(); //lager oppkobling mot Database catch(exception e){ //unntaksbehandling public void gjørnoemeddatabase(){ Statement setning = forbindelse.createstatement(); //gjør spørring mot database catch(exception e){ //unntaksbehandling public void ejbpassivate(){ if (forbindelse!= null) forbindelse.close(); catch(exception e){ //unntakshåndtering forbindelse = null; public void ejbactivate(){ logdbconnection(); catch(exception e){ //unntakshåndtering

14 private void lagdbconnection() throws SQLException{ String databasedriver = "oracle.jdbc.driver.oracledriver"; Class.forName(databasedriver); forbindelse = DriverManager.getConnection(...); Merk at vi normalt ikke vil lage databaseoppkoblinger slik det er gjort i koden over! Vi ønsker vanligvis heller å bruke et DataSource-objekt da dette gir bedre effektivitet. DataSource-objekter er vanligvis er serialiserbare. Vi trenger derfor ikke å gjøre noe i ejbpassivate() og ejbactivate(). Ved bruk av et DataSource-objekt kan koden bli slik: import javax.ejb.*; import java.sql.*; import javax.naming.*; public class EksempelBean2 implements GeneriskSessionBean{ DataSource ds = null; public void ejbcreate() throws CreateException{ InitialContext init = InitialContext(); ds = (DataSource)init.lookup("java:comp/env/jdbc/DataSource"); catch(exception e){ //unntaksbehandling public void gjørnoemeddatabase(){ Connection forbindelse = ds.getconnection();//henter fra pool Statement setning = forbindelse.createstatement(); //gjør spørring mot database catch(exception e){ //unntaksbehandling finally{ if (setning!= null) setning.close(); if (forbindelse!= null) forbindelse.close();//tilbake til pool catch(exception e){ //trenger ikke gjøre noe i metodene ejbpassivate()/ejbactivate() //bruker derfor de arvede metodene fra GeneriskSessionBean 5.6 Metoden ejbpassivate() Som forklart over trenger vi ikke å passivisere DataSource-objekter da disse kan serialiseres. Det samme gjelder faktisk referanser til home-objekter og EJB-objekter. Dvs. at du godt kan ha referanser til andre EJB er uten at du må ta spesielle hensyn til dette.

15 6 Hvordan behandle unntak Det er to typer unntak vi må være klar over i forbindelse med J2EE. Dette er applikasjonsunntak (application exception) og systemunntak (system exception). Applikasjonsunntak er en type unntak som vi kan ta høyde for som programmerer. Dette er unntak som ikke er fatale. For eksempel kan det være at brukeren skriver inn ulovlige data. I dette tilfellet kan dette føre til at det kastes et unntak (for eksempel BadInputException). Dette er et unntak som klienten kan ta imot (catch) og sørge for å gi brukeren mulighet til å taste inn opplysningene på nytt. Systemunntak på sin side indikerer unntak som vi ikke kan komme oss ut av. For eksempel hva gjør man hvis databasen plutselig forsvinner? Hvis du har en oppkobling mot databasen vil du få et unntak, men poenget er at du ikke kan gjøre noe med problemet. For at dette problemet skal løses så må systemadministrator sørge for å få databasen opp igjen. I dette tilfellet er det beste man kan gjøre som programmerer bare å gi en fornuftig feilmelding til brukeren. Dette kan for eksempel være: Databasen systemet bruker er dessverre ikke tilgjengelig, vennligst send en e-post til... Applikasjonsunntak behandles som du er vant med. Hvis du selv skal lage slike unntak så arver du fra klassen Exception og sørger for at det i metodehodet er beskrevet at dette unntaket kan hives. Tenk deg at vi har en biblioteksapplikasjon. La oss si at du vil se alle bøker i en spesiell kategori. Metodehodet i EJB-implementasjonenklassen kan da være slik: public ArrayList getkategori(string kategori) Hva skal skje hvis klienten oppgir en kategori som ikke finnes? Er dette i tilfellet et unntak? Hvis brukeren selv skriver inn kategorien som er ønsket, er sannsynligheten stor for at det faktisk er en skrivefeil som gjør at gal kategori blir forespurt. Tenker man slik, kan det være naturlig å hive et unntak tilbake til klienten som spesifiserer at kategorien faktisk ikke finnes. Det andre alternativet er selvsagt bare å returnere en tom ArrayList og la klienten finne ut av dette selv. La oss si at vi velger metoden med å hive et unntak. Vi lager oss en unntaksklassen FeilKagetoriException som arver fra Exception. Vi endrer så metodehodet slik: public ArrayList getkategori(string kategori) throws FeilKategoriException Metodehodet beskriver nå at det fra denne metoden kan komme et applikasjonsunntak, som klienten bør være i stand til å behandle. Merk at vi også må sørge for at beskrivelsen av metoden i Remote-interfacet til metoden endres til å hive unntaket. Systemunntak derimot tar vi imot inne i EJB en. Disse kan hives videre som en EJBException(). Her er et kort eksempel på en metode som ligger i en EJB: public enellerannenmetode(){ //lag oppkobling mot en database //gjør en spørring mot databasen //gjør noe med dataene fra databasen catch(sqlexception e){ System.out.println( Unntak i enellerannenmetode() + e); throw new EJBException(e);

16 Som du ser av koden så sørger vi for å putte all databasekommunikasjonen i en try/catchblokk. Hvis det skulle oppstå problemer skriver vi ut en beskrivelse. Denne utskriften er kun ment som logging på tjeneren slik at vi kan se hva som har skjedd. Klienten vil ikke se noe av denne utskriften. Nå sørger vi for å hive unntaket videre som en EJBException. Hva dette fører til er imidlertid situasjonsavhengig. Det er nå opp til applikasjonstjeneren å vurdere unntaket. Kanskje er det et unntak som applikasjonstjeneren kan gjøre noe med selv. I dette tilfellet blir det ikke sent feilmelding til klienten. Hvis applikasjonstjeneren ikke selv kan gjøre noe med unntaket vil det bli sent videre til klienten som en RemoteException (husk at alle fjernmetoder kan kaste dette unntaket). I de fleste tilfeller vil det nok være fornuftig at EJB ene som klienten kommuniserer med hiver spesifiserte unntak i stedet for EJBException(). Klientene har mer bruk for en enkel forklaring på hva problemet er, enn en kryptisk feilmelding. Du må derfor selv vurdere når de det er fornuftig å lage egne unntaksklasser og når du vil bruke EJBException. Eksempler på ulike måter å gjøre dette på kommer etter hvert. Er du i tvil kan du bruke EJBException. 7 Eksempel på Session Bean med tilstander La oss se et eksempel på en TFSB. Vi skal lage et enkelt spill. Poenget er at spillet skal generere et tilfeldig tall. Klienten skal så få et bestemt antall forsøk til å tippe riktig tall. For hver gang klienten tipper et tall så vil EJB en gi beskjed om tallet er større eller mindre enn tippet. Hele poenget her er at EJB en må ha tilstand. For det første må EJB en holde styr på hvor mange ganger klienten har tippet, og for det andre må den også vite hvilket tilfeldig tall som ble generert i utgangspunktet. La oss først se på Home-interfacet: import javax.ejb.*; import java.rmi.*; public interface GjettTallSpillHome extends EJBHome{ GjettTallSpill create() throws CreateException, RemoteException; GjettTallSpill create(int antallforsok) throws CreateException, RemoteException; Som du kan se har vi i dette tilfellet to create()-metoder. Dette kan vi gjøre fordi dette er en TFSB. Vi får tilsvarende ejbcreate()-metoder i implementasjonsklassen. Bruker vi create()- metoden uten argument vil vi bruke et forutbestemt antall forsøk på å tippe tallet. Bruker vi den andre create()-metoden kan klienten selv bestemme hvor mange forsøk man skal ha. Remote-interfacet blir slik: import javax.ejb.*; import java.rmi.*; public interface GjettTallSpill extends EJBObject{ int gjett(int tall) throws RemoteException; boolean fleresjanser() throws RemoteException;

17 Her har vi to metoder som utgjør selve forretningslogikken. En metode for å tippe et tall. Denne metoden vil returnere et negativt tall om tallet er mindre enn tippet, positivt hvis tallet er større enn tippet og null hvis de er like. Metoden fleresjanser() gir klienten mulighet til å finne ut om han har flere sjanser til å tippe. EJB-implementasjonsklassen blir slik: import javax.ejb.*; import javax.naming.*; //JNDI import javax.rmi.*; //PortableRemoteObject import java.util.*; public class GjettTallSpillBean extends GeneriskSessionBean{ int antallforsok; int riktigtall; int storstemuligetall = 50; public void ejbcreate() throws CreateException{ setklassenavn("gjetttallspillbean");//for debug output log("ejbcreate()"); riktigtall = lagtilfeldigtall(); //henter antall forsøk fra en miljøvariabel med JNDI-oppslag InitialContext init = new InitialContext(); Object obj = init.lookup("java:comp/env/antallforsok"); Integer tmpint = (Integer)PortableRemoteObject.narrow(obj, Integer.class); antallforsok = tmpint.intvalue(); catch(exception e){ log("ejbcreate() " + e); throw new CreateException("Problemer med å lage EJB'en " + e); //klienten oppgir antall forsøk.. public void ejbcreate(int startantallforsok) throws CreateException{ setklassenavn("gjetttallspillbean");//for debug output log("ejbcreate()"); antallforsok = startantallforsok; riktigtall = lagtilfeldigtall(); catch(illegalargumentexception e){ log("ejbcreate(int) " + e); throw new CreateException("Feil med tall. Oppgi en gyldig int"); //returnerer 0 hvis riktg, større enn 0 hvis tallet er større en tippet dvs. det må tippes et større tall //mindre enn 0 hvis det må tippes et mindre tall //merk at vi ikke legger oss bort i presentasjonen her, det blir opp til klienten!!! public int gjett(int tall){ antallforsok--; //har brukt nok et forsøk return riktigtall - tall; public boolean fleresjanser(){ if (antallforsok > 0) return true; else return false; //returnerer et tall mellom 1 og storstemuligetall

18 private int lagtilfeldigtall(){ Random random = new Random(); return random.nextint(storstemuligetall) + 1; Først legg merke til at klassen arver fra GeneriskSessionBean, noe som gjør at vi slipper å implementere alle metodene i Session-interfacet. Deretter kan du merke deg teksten i uthevet skrift. Her bruker vi en miljøvariabel til å bestemme hvor mange forsøk klienten skal ha til å tippe. Vi må altså sørge for å sette verdien til denne i deploytool som vist under. Resten av koden bør være ganske selvforklarende. Jeg vil imidlertid nevne at man ikke trenger å kalle lagtilfeldigtall() i begge ejbcreate()-metodene. Vi er selvsagt avhengig av å lage et tilfeldig tall ved opprettelsen av et EJB-implementasjonsobjekt, men dette kan like godt ligge i setsessioncontext()-metoden (arves fra GenersikSessionBean). Denne metoden utføres faktisk før ejbcreate()-metoden og gjør derfor samme nytten. Fordelen er at den utføres uansett hvilken ejbcreate()-metode som blir kalt. Ok, da er det bare klienten igjen.

19 import javax.rmi.*; import javax.naming.*; import java.io.*; public class GjettTallKlient{ public static void main(string args[]){ BufferedReader les = new BufferedReader(new InputStreamReader(System.in)); InitialContext init = new InitialContext(); Object obj = init.lookup("java:comp/env/ejb/gjetttallspill"); GjettTallSpillHome home = (GjettTallSpillHome)PortableRemoteObject.narrow(obj, GjettTallSpillHome.class); GjettTallSpill spill = home.create(); boolean riktiggjettet = false; do{ //går i løkke til brukeren har gjettet riktig eller brukt opp sine forsøk System.out.print("Tipp et tall mellom 1 og 50: "); String strtall = les.readline(); int tall = Integer.parseInt(strTall); int svar = spill.gjett(tall); if (svar > 0){ System.out.println("Tallet er større enn " + tall); else if (svar < 0){ System.out.println("Tallet er mindre enn " + tall); else{ riktiggjettet = true; catch(numberformatexception e){ System.out.println("Skjerpings. Tallet er ikke gyldig!"); while (spill.fleresjanser() &&!riktiggjettet); // har fortsatt flere sjanser igjen if (riktiggjettet){ System.out.println("Gratulerer du har gjettet riktig"); else{ System.out.println("Sorry. Du har brukt opp dine sjanser"); spill.remove();//frigjør ressurser på tjeneren!! catch(exception e){ System.out.println("Feil i klienten: " + e); Koden er vedlagt eksempelfilene til leksjonen. Ear-filen til applikasjonen er også lagt ved slik at du kan åpne denne direkte i deploytool. Kjør eksemplet. Prøv også å forandre miljøvariabelen for antall forsøk. Du må legge ut applikasjonen på nytt (deploy) for at virkningen skal tre i kraft. 8 Oppgave / bruk av en Session Bean som cache Tenk deg at du har en database som inneholder mange bøker. Hver bok har et isbn-nummer (unikt for boka), tittel og pris. Det er ønske om å lage en Session Bean som henter ut bøkene fra databasen og returner bøkene i en ArrayList. Klienten kan så bruke denne listen til å vise fram bøkene til brukeren.

20 Vi har flere mulige løsninger her. Den første og kanskje mest nærliggende løsningen er å lage en TLSB som ser noe slik ut (dette er ikke fullstendig kode): public class BokOversikt extends GeneriskSessionBean{ private ArrayList bøker = null; public void ejbcreate() throws CreateException{ //finn database og opprett oppkobling ResultSet res = //spørring som henter alle bøker (select * from bok) while (res.next()){ String isbn = res.getstring("isbn"); String tittel = res.getstring("tittel"); int pris = res.getint(pris); Bok bok = new Bok(isbn,tittel,pris); //oppretter et hjelpeobjekt til å holde verdiene til en bok bøker.add(bok); //legger til boken i listen over alle bøkene catch(...){ //unntakshåndtering //metode som returnerer alle bøkene. public ArrayList hentbøker(){ return bøker; //evt. flere metoder... Merk at bøkene blir hentet ut fra databasen kun en gang (i ejbcreate()). Det gir effektivitet, i motsetning til å hente ut bøkene hver gang en klient ønsker å se bøkene. EJB en vil derfor i dette tilfellet fungere som en cache. Klassen Bok som brukes i koden over er en hjelpeklasse for å holde på verdiene til en bok. Den vil da typisk se noe slik ut: public class Bok{ private String isbn; private String tittel; private int pris; public Bok(String isbn, String tittel, int pris){ this.isbn = isbn; this.tittel = tittel; this.pris = pris; public String hentisbn(){ return isbn; public String henttittel(){ return tittel; public int hentpris(){

21 return pris; Klienten vil altså få en ArrayList fylt med Bok-objekter ved å kalle hentbøker() på EJB en. Klassen Bok er altså bare en hjelpeklasse for å samle alle verdiene til en bok. I forbindelse med J2EE vil man ofte kalle et slik hjelpeobjekt for et verdiobjekt (value object). Man vil derfor ofte gi et navn som gjenspeiler dette, f.eks. BokVO (nå er det ikke mulig å mistolke dette som et Remote-interface). Klienten kan nå vise fram alle bøkene til brukeren. Hva er så problemet med denne løsningen? Hva om det er snakk om 1000 bøker eller kanskje 1 million bøker? Det tar tid å overføre så mange bøker over et nettverk. Ingen er vel heller interessert i å bla igjennom så mange bøker. Det vi trenger er en måte å begrense hvor mange bøker klienten får. La oss si at vi gir klienten 10 og 10 bøker som den kan vise fram. Denne løsningen er helt klart mer fornuftig i dette tilfellet. Problemet er at nå må EJB en hele tiden holde styr på hvilke bøker i boklista som skal returneres neste gang. Dette må gjøres for hver enkelt klient. Nå har du jo allerede lært hvordan du skal lage en TFSB, så du klarer å løse også dette problemet. Før du går i gang og lager løsningen din er det imidlertid en ting du må huske på. Hver klient vil ha sitt eget EJB-implementasjonsobjekt. Dvs. at om du skulle lage en TFSB som ser noe slik ut public class BokOversikt extends GeneriskSessionBean{ private ArrayList bøker = null; private int hvorerjegilista; public void ejbcreate() throws CreateException{ //finn database og opprett oppkobling ResultSet res = //spørring som henter alle bøker (select * from bok) while (res.next()){ String isbn = res.getstring("isbn"); String tittel = res.getstring("tittel"); int pris = res.getint(pris); Bok bok = new Bok(isbn,tittel,pris); //oppretter et hjelpeobjekt til å holde verdiene til en bok bøker.add(bok); //legger til boken i listen over alle bøkene catch(...){ //unntakshåndtering //metode som returnerer neste 10 bøker. public ArrayList hentnestebøker(){ //lag en ny ArrayList med de 10 neste bøkene (hentes fra lista bøker) //oppdatere hvorerjegilista slik at vi kan hente ut riktige bøker neste gang så vil du ha like mange EJB-implementasjonsobjekter av klassen over som du har klienter! La oss si at du har 1000 klienter og at det er bøker. Det gjør at det nå i systemet må lagres

22 10 millioner Bok-objekter! Problemet her er selvsagt at alle EJB ene inneholder en fullstendig liste over alle bøkene. Løsningen på problemet er rett og slett å bruke flere EJB er i kombinasjon. Vi bruker en TLSB som inneholder lista med bøker. I denne TLSB en har vi en metode som heter hentbøker(int fraindeks, int tilindeks) Metoden vil returnere en ArrayList med det aktuelle utvalget av bøker. I tillegg så lager vi en TFSB som hele tiden holder styr på hvor klienten befinner seg i lista. Denne må da også ha en metode som klienten kan kalle, f.eks. hentnestebøker(). Denne må da sørge for å kalle metoden hentbøker() på TLSB en med riktig parametere (fraindeks og tilindeks). Klienten vil altså hele tiden forholde seg til sin egen TFSB, som igjen forholder seg til TLSB en. Vedlagt eksempelfilene til denne leksjonen finner du også nødvendige filer for TLSB en. Klienten som er brukt i løsningsforslaget er også lagt ved (du kan selvsagt lage din egen om du vil). Oppgaven din blir å lage TFSB en SideIterator som knytter det hele sammen. Du må selv sørge for å lage en J2EE-applikasjon som tester det hele ut. Ear-fil for applikasjonen og java-filer skal leveres. Tips: Du er avhengig av at EJB en din bruker min TLSB som heter CacheBean. For å få til dette må EJB en din gjøre en JNDI-lookup() for å finne min. Dette kan f.eks. bli noe slik: InitialContext init = new InitialContext(); CacheLocalHome home = (CacheLocalHome)init.lookup( java:comp/env/ejb/bokcache ); Dette blir altså som vanlig. Du kan se at jeg ikke har PortableRemoteObject.narrow() til å caste referansen. Dette er et bevist valg fordi jeg har valgt å lage lokale-interface i dette tilfellet. Du må så sørge for å opprette mapping for java:comp/env/ejb/bokcache til riktig EJB (se figuren under). I deploytool velger jeg da EJB en SideIteratorBean og velger skillearket EJB Refs. Her velger jeg Coded Name brukt for å finne den andre EJB en, hvilken Type EJB jeg forventer å finne osv. Vær obs på at du under Interfaces må velge Local (bruker lokaleinterface), og så må du oppgi navnene på de lokale interfacene (her CacheLocalHome og CacheLocal). Når vi bruker lokale interface velger vi ikke JNDI-navn, men velger riktig klasse direkte fra listen i Enterprise Bean Name.

23 Databasen som brukes i eksemplet finner du i den vedlagte filen bok.sql. Lag denne databasen i cloudscape ved å utføre bok.sql. Du må også sørge for at mapping mellom JNDI-navnet CacheBean bruker på databasen og jdbc/cloudscape. Filene som allerede er laget er: CacheBean BokVO (hjelpeobjekt som holder verdiene på en bok). BokKlient (klienten til applikasjonen). Du må altså lage filene: SideIteratorBean SideIterator (Remote-interface) SideIteratorHome (Home-interface) CacheLocal (lokalt interface) CacheLocalHome (lokalt home-interface) Du kan godt lage to Jar-filer i applikasjonen din. En for hver EJB. (Du kan også lage bare en). Husk at CacheBean bruker BokVO. Legg derfor til BokVO sammen med de andre klassene/interfacene når du oppretter JAR-filen for CacheBean. Se også figuren under.

24 9 Problemer? Det er fort gjort å komme opp i problemer når du lager J2EE-applikasjoner. Hvis du får feil ved utlegging av applikasjonen sørg først for å sjekke Tools > Verifier som forklart i forrige leksjon. Hvis at dette verktøyet fortsetter å plage deg med feilmeldinger etter at du selv mener du har rettet dem opp problemet, kan du prøve å trykke Update og så Delpoy for å se om dette gjør ting bedre. Hjelper ikke dette kan det være nødvendig å restarte applikasjonstjeneren (plagsomt men sant). Du kan også komme opp i situasjoner der du ikke får lagt ut applikasjonen din på applikasjonstjeneren, men Verifier ikke rapporterer noen feil. I dette tilfellet kan du ty til konsollvinduet til applikasjonstjeneren. Her vil det vises evt. feilmeldinger under kompilering av stub-klasser osv. Hvis ikke noe av det over hjelper, kan du prøve å lukke deploytool, applikasjonstjeneren og skrive cleanup på kommandolinjen. Da vil alle gamle filer i applikasjonstjeneren bli slettet, og du kan legge ut en fersk applikasjon (uten at noen av de gamle filene henger igjen). Siste utvei er rett og slett å starte maskinen på nytt.

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

Repetisjon J2EE. Fullstendig skisse. JNDI og EJB. Session Beans Entity Beans (BMP) J2EE Session Beans Entity Beans (BMP) Repetisjon TLSB (tilsandsløse Session Beans). Husk: Remote-interface => EJB-objekt gethelloworldstring() Home-interface => home-objekt create() Implementasjonsklasse

Detaljer

J2EE. CMP Entity Beans, Transaksjoner, JSP

J2EE. CMP Entity Beans, Transaksjoner, JSP 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.

Detaljer

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

J2EE og distribuerte systemer Leksjon 10: Entity Beans (BMP) J2EE og distribuerte systemer Leksjon 10: Entity Beans (BMP) Leksjonen er forfatters eiendom. Som kursdeltaker kan du fritt bruke leksjonen til eget personlige bruk. Kursdeltakere som ønsker å bruke leksjonene

Detaljer

J2EE. Katalogtjenester, JNDI og Enterprise Beans

J2EE. Katalogtjenester, JNDI og Enterprise Beans J2EE Katalogtjenester, JNDI og Enterprise Beans Navnetjeneste Rmiregistry er en navnetjeneste Mapper et navn til en objektreferanse MittObjekt obj = (MittObjekt)Naming.lookup( rmi://tjener.no/lotto );

Detaljer

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

Løsningsskisse, eksamen J2EE og distribuerte systemer 19.mai 2004 Løsningsskisse, eksamen J2EE og distribuerte systemer 19.mai 2004 Oppgave 1 RMI-tjenerobjekt (databasewrapper) A Sentral tjenermaskin med database, RMi-register og RMI-tjenerprogram vis kart gjør bestilling

Detaljer

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

J2EE og distribuerte systemer Leksjon 11: Entity Beans (CMP) J2EE og distribuerte systemer Leksjon 11: Entity Beans (CMP) Leksjonen er forfatters eiendom. Som kursdeltaker kan du fritt bruke leksjonen til eget personlige bruk. Kursdeltakere som ønsker å bruke leksjonene

Detaljer

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring Kandidatnr: Eksamensdato: 10.desember 2008 Varighet: 0900 1200 Fagnummer: Fagnavn: LO346D Java EE og distribuerte systemer Klasse(r): NETT

Detaljer

Videregående programmering 6

Videregående programmering 6 Videregående programmering 6 1. Feilkontroll i klasser uten unntaksobjekter Klasser skal lages sikre. Argumentverdier skal kontrolleres, og eventuelle feil skal rapporteres til klienten. I praksis har

Detaljer

Eksamen i Internetteknologi Fagkode: ITE1526

Eksamen i Internetteknologi Fagkode: ITE1526 Datateknikk Side 1 av 8 Eksamen i Internetteknologi Fagkode: ITE1526 Tid: Mandag, 23.05.05, 9:00-12:00 Tillatte hjelpemidler: Alle trykte og skrevne hjelpemidler tillatt. Eksamen består av 3 oppgaver og

Detaljer

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL Kandidatnr: Eksamensdato: 4.mai 2011 Varighet: 0900-1300 Emnekode: Emnenavn: Klasse(r): LO191D / LC191D Campus: LC191D Videregående

Detaljer

Installasjonsveiledning

Installasjonsveiledning Installasjonsveiledning Magne Rodem og Jan-Erik Strøm 18. juni 2006 Innhold 1 Installasjon av Web Service 3 1.1 Krav........................................... 3 1.2 Installasjon av Sun Java System Application

Detaljer

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

J2EE og distribuerte systemer Leksjon 7: Installasjon av applikasjonstjener og JNDI J2EE og distribuerte systemer Leksjon 7: Installasjon av applikasjonstjener og JNDI Leksjonen er forfatters eiendom. Som kursdeltaker kan du fritt bruke leksjonen til eget personlige bruk. Kursdeltakere

Detaljer

2 Om statiske variable/konstanter og statiske metoder.

2 Om statiske variable/konstanter og statiske metoder. Litt om datastrukturer i Java Av Stein Gjessing, Institutt for informatikk, Universitetet i Oslo 1 Innledning Dette notatet beskriver noe av det som foregår i primærlageret når et Javaprogram utføres.

Detaljer

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

JSP - 2. Fra sist. Hvordan fungerer web? Tjenerside script HTML. Installasjon av Web-tjener Et enkelt JSP-script. Ønsker dynamiske nettsider: Fra sist JSP - 2 Installasjon av Web-tjener Et enkelt JSP-script HTML statisk Forms Tags Ønsker dynamiske nettsider: Klientside-script/programmering Javascript, vbscript, applets Tjenerside-script/programmering

Detaljer

Løsningsforslag Test 2

Løsningsforslag Test 2 Løsningsforslag Test 2 Oppgave 1.1: Interface definerer et grensesnitt som kan implementeres av flere klasser. Dette gir en standardisert måte å kommunisere med objekter av en eller flere relaterte klasser.

Detaljer

TDT4100 Objektorientert programmering

TDT4100 Objektorientert programmering Eksamensoppgave i TDT4100 Objektorientert programmering Torsdag 12. august 2010, kl. 09:00-13:00 Oppgaven er utarbeidet av faglærer Hallvard Trætteberg og kvalitetssikret av Svein Erik Bratsberg. Kontaktperson

Detaljer

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

J2EE og distribuerte systemer Leksjon 8: Oppbygning av J2EE-applikasjoner J2EE og distribuerte systemer Leksjon 8: Oppbygning av J2EE-applikasjoner Leksjonen er forfatters eiendom. Som kursdeltaker kan du fritt bruke leksjonen til eget personlige bruk. Kursdeltakere som ønsker

Detaljer

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

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF1000 - Høst 2011) Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF1000 - Høst 2011) Løsningsforslag til oppgave 7, 8, og 9 mangler Klasser og objekter (kap. 8.1-8.14 i "Rett på Java" 3. utg.) NB! Legg merke til at disse

Detaljer

TOD063 Datastrukturer og algoritmer

TOD063 Datastrukturer og algoritmer TOD063 Datastrukturer og algoritmer Øving : 3 Utlevert : Uke 7 Innleveringsfrist : 26. februar 2010 Klasse : 1 Data og 1 Informasjonsteknologi Gruppearbeid: 2-3 personer pr. gruppe. Oppgave 1 Vi skal lage

Detaljer

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1 Delkapittel 3.1 Grensesnittet Liste Side 1 av 11 Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1 3.1 En beholder 3.1.1 En beholder En pappeske er en beholder En beholder er noe vi kan legge ting

Detaljer

Eksamen. Objektorientert Programmering IGR 1372

Eksamen. Objektorientert Programmering IGR 1372 + JVNROHQL1DUYLN $YGHOLQJIRU7HNQRORJL Eksamen i Objektorientert Programmering IGR 1372 7LG'HVHPEHU± 7LOODWWHKMHOSHPLGOHU 6NULYHVDNHU2UGE NHU -DYD6RIWZDUH6ROXWLRQV)RXQGDWLRQVRI3URJUDP 'HVLJQVNUHYHWDY/HZLV

Detaljer

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring Kandidatnr: Eksamensdato: 14.desember 2007 Varighet: 0900-1200 Fagnummer: Fagnavn: Klasser: LO347D Web-applikasjoner med Java EE Nettstudenter

Detaljer

Løse reelle problemer

Løse reelle problemer Løse reelle problemer Litt mer om løkker, metoder med returverdier, innlesing fra fil og strenger INF1000, uke5 Ragnhild Kobro Runde MER OM LØKKER Repetisjon fra forrige uke: while Syntaks: while (condition)

Detaljer

IN1000 Obligatorisk innlevering 7

IN1000 Obligatorisk innlevering 7 IN1000 Obligatorisk innlevering 7 Frist for innlevering: 23.10. kl 12:00 Introduksjon I denne innleveringen skal du lage et program som simulerer cellers liv og død. Dette skal du gjøre ved hjelp av en

Detaljer

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

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først) INF1010 våren 2019 Onsdag 30. januar Mer om unntak i Java (med litt repetisjon av I/O først) Stein Gjessing Lesing fra terminal og fil navn: mininn Bruk Scanner: Scanner mininn = new Scanner(); Type:

Detaljer

Forelesning inf Java 4

Forelesning inf Java 4 Forelesning inf1000 - Java 4 Tema: Løkker Arrayer Metoder Ole Christian Lingjærde, 12. september 2012 Ole Chr. Lingjærde Institutt for informatikk, 29. august 2012 1 Repetisjon: arrayer Deklarere og opprette

Detaljer

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4 Forelesning inf - Java 4 Repetisjon: arrayer Tema: Løkker Arrayer Metoder Ole Christian Lingjærde,. september Deklarere og opprette array - eksempler: int[] a = new int[]; String[] a = new String[]; I

Detaljer

Argumenter fra kommandolinjen

Argumenter fra kommandolinjen Argumenter fra kommandolinjen Denne veiledningen er laget for å vise hvordan man kan overføre argumenter fra kommandolinjen til et program. Hvordan transportere data fra en kommandolinje slik at dataene

Detaljer

Løse reelle problemer

Løse reelle problemer Løse reelle problemer Litt mer om løkker, metoder med returverdier og innlesing fra fil INF1000, uke4 Geir Kjetil Sandve Repetisjon fra forrige uke: while Syntaks: while (condition) do1; do2;... Eksempel:

Detaljer

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

INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java INF1010 våren 2017 Onsdag 25. januar Litt om unntak i Java Stein Gjessing Nytt tema: Feilhåndtering (IO: Innlesing/Utskrift) n En metode som kan komme til å gjøre en IO-feil på fil må enten behandle denne

Detaljer

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

23.09.2015. Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert. Grunnkurs i objektorientert programmering Introduksjon til objektorientert programmering INF1000 Høst 2015 Siri Moe Jensen INF1000 - Høst 2015 uke 5 1 Siri Moe Jensen INF1000 - Høst 2015 uke 5 2 Kristen

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i: INF1010 Objektorientert programmering Dato: 9. juni 2016 Tid for eksamen: 09.00 15.00 (6 timer) Oppgavesettet er på 7 sider.

Detaljer

Leksjon 7. Filer og unntak

Leksjon 7. Filer og unntak 6108 Programmering i Java Leksjon 7 Filer og unntak Del2: 7.2 og 7.4 Roy M. Istad 2015 Fil: Permanent lagring av data PrintWriter(filnavn) throws Exception usjekkede/sjekkede unntak? skriver.println(data-i-tekstlinje)

Detaljer

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; } Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; Hva skrives ut på skjermen når følgende kode utføres? int [] tallene =

Detaljer

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - Kandidatnr: AITeL Eksamensdato: 2.desember 2009 Varighet: 0900-1300 Emnekode: Emnenavn: Klasse(r): LO191D / LC191D LO191D Videregående programmering

Detaljer

Installere JBuilder Foundation i Windows XP

Installere JBuilder Foundation i Windows XP Installere JBuilder Foundation i Windows XP Installasjon av JBuilder Foundation på Windows (dekker her spesifikt fremgangen ved bruk av Microsoft Windows XP Professional, men det vil mest trolig ikke være

Detaljer

Enkle generiske klasser i Java

Enkle generiske klasser i Java Enkle generiske klasser i Java Oslo, 7/1-13 Av Stein Gjessing, Institutt for informatikk, Universitetet i Oslo Del 1: Enkle pekere Før vi tar fatt på det som er nytt i dette notatet, skal vi repetere litt

Detaljer

INF1000 Metoder. Marit Nybakken marnybak@ifi.uio.no 16. februar 2004

INF1000 Metoder. Marit Nybakken marnybak@ifi.uio.no 16. februar 2004 INF1000 Metoder Marit Nybakken marnybak@ifi.uio.no 16. februar 2004 Motivasjon Når man begynner å skrive store programmer, vil man fort oppleve at programmene blir uoversiktlige. Det blir vanskeligere

Detaljer

En algoritme for permutasjonsgenerering

En algoritme for permutasjonsgenerering Innledning La oss tenke oss at vi har en grunnskole-klasse på 25 elever der enkelte av elever er uvenner med hverandre. Hvis uvenner sitter nær hverandre blir det bråk og slåssing. Er det mulig å plassere

Detaljer

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

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus // class Bygning Oppgave 1 System.out.println( Bolighus ); // class Bolighus Hva blir utskriften fra dette programmet? class Blokk extends Bolighus{ // class Blokk IN105subclassesII-1 Eksekveringsrekkefølgen

Detaljer

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

BOKMÅL Side 1 av 7. KONTINUASJONSEKSAMEN I FAG TDT4100 Objektorientert programmering / IT1104 Programmering, videregående kurs BOKMÅL Side 1 av 7 NTNU Norges teknisk-naturvitenskapelige universitet Fakultet for informasjonsteknologi, matematikk og elektroteknikk Institutt for datateknikk og informasjonsvitenskap KONTINUASJONSEKSAMEN

Detaljer

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

Forklaring til programmet AbstraktKontoTest.java med tilhørende filer Konto.java, KredittKonto.java, SpareKonto.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 Forklaring til programmet AbstraktKontoTest.java med tilhørende

Detaljer

Tilkobling og Triggere

Tilkobling og Triggere Tilkobling og Triggere Lars Vidar Magnusson October 12, 2011 Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 1 / 25 Tilkobling med PHP PHP bruker databasespesifike moduler til å koble

Detaljer

PG4200 Algoritmer og datastrukturer Lab 1. 8.januar 2014. I dag skal vi undersøke en rekke velkjente databeholdere i Java:

PG4200 Algoritmer og datastrukturer Lab 1. 8.januar 2014. I dag skal vi undersøke en rekke velkjente databeholdere i Java: PG4200 Algoritmer og datastrukturer Lab 1 8.januar 2014 Innledning I dag skal vi undersøke en rekke velkjente databeholdere i Java: java.util.arraylist java.util.linkedlist java.util.hashset java.util.treeset

Detaljer

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

INF 1010, vår 2005 Løsningsforslag uke 11 INF 1010, vår 2005 uke 11 Anders Brunland 11. april 2005 Oppgave 1 Oppgave 1 i kapittel 19, Rett på Java Er følgende metoder lovlige? Hovorfor/hvorfor ikke? a) void koknverter ( int mnd ) { konverterdato

Detaljer

Kapittel 8: Programutvikling

Kapittel 8: Programutvikling Kapittel 8: Programutvikling Redigert av: Khalid Azim Mughal (khalid@ii.uib.no) Kilde: Java som første programmeringsspråk (3. utgave) Khalid Azim Mughal, Torill Hamre, Rolf W. Rasmussen Cappelen Akademisk

Detaljer

Jentetreff INF1000 Debugging i Java

Jentetreff INF1000 Debugging i Java Jentetreff INF1000 Debugging i Java Ingrid Grønlie Guren ingridgg@student.matnat.uio.no 11. november 2013 Kort om feilmeldinger i Java Java har to ulike type feilmeldinger som man kan få når man skriver

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO Bokmål UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i: INF1000 Grunnkurs i objektorientert programmering Eksamensdag: Fredag 4. desember 2015 Tid for eksamen: 14.30 (4 timer)

Detaljer

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet TGA Et større programeksempel Hvordan løse et reelt problem med en objektorientert fremgangsmåte En større problemstilling I uke 4 skrev vi et program for å sjekke om et gen (en tekstfil) inneholdt ordet "TGA"

Detaljer

INF1000 Prøveeksamen Oppgave 7 og 9

INF1000 Prøveeksamen Oppgave 7 og 9 INF1000 Prøveeksamen Oppgave 7 og 9 Høst 2015 Siri Moe Jensen 7a) Skriv en klasse Gave med to variabler som forteller hva som er i gaven, og hvor mye den har kostet. Klassen skal ha en konstruktør med

Detaljer

NB!!! Veldig korte svar er gitt her. Disse burde det vært skrevet mer på ved en eksamen..

NB!!! Veldig korte svar er gitt her. Disse burde det vært skrevet mer på ved en eksamen.. Løsningsforslag Eksamen V2007 Oppgave 1 NB!!! Veldig korte svar er gitt her. Disse burde det vært skrevet mer på ved en eksamen.. Oppgave 1.1 Klasse som pakke rinne n primitiv datatype, slik at vi kan

Detaljer

INF1000 - Løsning på seminaropppgaver til uke 8

INF1000 - Løsning på seminaropppgaver til uke 8 INF1000 - Løsning på seminaropppgaver til uke 8 Oppgave 1 a) for(string nokkel : studenter.keyset){ System.out.println(nokkel); Studenten sitt navn blir skrevet ut. b) for(student dennestudenten : studenter.values()){

Detaljer

Hva er Derby og Java DB? Denne forelesningen. Java Database Connectivity (JDBC) Hva er Derby og Java DB?

Hva er Derby og Java DB? Denne forelesningen. Java Database Connectivity (JDBC) Hva er Derby og Java DB? 1 2 Java Database Connectivity (JDBC) Norvald H. Ryeng ryeng@idi.ntnu.no 3 4 Denne forelesningen Hva er Derby og Java DB? Hva er Derby og Java DB? Hva er JDBC? Slik fungerer det Slik gjør dere det (kokebok)

Detaljer

Bli Kjent med Datamaskinen Introduksjon ComputerCraft PDF

Bli Kjent med Datamaskinen Introduksjon ComputerCraft PDF Bli Kjent med Datamaskinen Introduksjon ComputerCraft PDF Introduksjon Vi begynner med å bygge en enkel datamaskin. Etter å ha brukt litt tid på å bli kjent med hvordan datamaskinen virker, bruker vi den

Detaljer

Å bruke Java API-et til å sortere tabeller/arraylister der elementene er (referanser til) objekter

Å bruke Java API-et til å sortere tabeller/arraylister der elementene er (referanser til) objekter Sortering og søking i Java-API-et Tabeller og Arraylister Comaparable Comparator equals() LC9D Videregående programmering Semesterplan: http://aitel.hist.no/fag/vprg/index_lc9d.php Høgskolen i Sør-Trøndelag,

Detaljer

INF1000 HashMap. Marit Nybakken marnybak@ifi.uio.no 2. november 2003

INF1000 HashMap. Marit Nybakken marnybak@ifi.uio.no 2. november 2003 INF1000 HashMap Marit Nybakken marnybak@ifi.uio.no 2. november 2003 Dette dokumentet skal tas med en klype salt og forfatteren sier fra seg alt ansvar. Dere bør ikke bruke definisjonene i dette dokumentet

Detaljer

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Dagens tema Lister og generiske klasser, del I Array-er og ArrayList (Big Java 6.1 & 6.8) Ulike lagringsformer (Collection) i Java (Big Java 15.1) Klasser med typeparametre («generiske klasser») (Big Java

Detaljer

Fra Python til Java, del 2

Fra Python til Java, del 2 Fra Python til Java, del 2 Hvordan kjøre Java? På Ifis maskiner På egen maskin Et eksempel Array-er For-setninger Lesing og skriving Metoder Biblioteket Hva trenger vi egentlig? Å kjøre Java For å kunne

Detaljer

Del 3: Evaluere uttrykk

Del 3: Evaluere uttrykk Del 3: Evaluere uttrykk Hva skal vi gjøre? Hvordan lagre Asp-verdier Hvilke operasjoner må jeg implementere? Er operasjonen lovlig? Utføre operasjonen Strukturen til interpreten vår f.asp 3&4 Interpret

Detaljer

INF Notater. Veronika Heimsbakk 10. juni 2012

INF Notater. Veronika Heimsbakk 10. juni 2012 INF1010 - Notater Veronika Heimsbakk veronahe@student.matnat.uio.no 10. juni 2012 1 Tilgangsnivåer 2 CompareTo Modifier Class Package Subclass World public Y Y Y Y protected Y Y Y N no modifier Y Y N N

Detaljer

Å lese tall fra en fil, klassen Scanner

Å lese tall fra en fil, klassen Scanner Å lese tall fra en fil, klassen Scanner 1. Et Scanner-objekt kan knyttes til et strømobjekt eller til en streng. 2. Kan skanne teksten etter data av ulike typer. 3. Kan kun skanne framover i teksten. Vis

Detaljer

Algoritmer og datastrukturer E Løkker i Java

Algoritmer og datastrukturer E Løkker i Java Vedlegg E Løkker i Java Side 1 av 6 Algoritmer og datastrukturer E Løkker i Java E Løkker i Java E.1 For-løkker En for-løkke består av de fire delene initialisering, betingelse, oppdatering og kropp (eng:

Detaljer

Oblig 4Hybelhus litt mer tips enn i oppgaven

Oblig 4Hybelhus litt mer tips enn i oppgaven Oblig 4Hybelhus litt mer tips enn i oppgaven lørdag 19. okt 2013 Arne Maus Obligatorisk oppgave 4 Gulbrand Grås husleiesystem I denne oppgaven skal vi se på hans studenthus Utsyn. Utsyn består av 3 etasjer,

Detaljer

INF1010 - Seminaroppgaver til uke 3

INF1010 - Seminaroppgaver til uke 3 INF1010 - Seminaroppgaver til uke 3 Oppgave 1 I denne oppgaven skal vi lage et klassehiearki av drikker. Alle klassene i hiearkiet skal implementere følgende grensesnitt p u b l i c i n t e r f a c e Drikkbar

Detaljer

Kapittel 9: Sortering og søking Kort versjon

Kapittel 9: Sortering og søking Kort versjon Kapittel 9: Sortering og søking Kort versjon Redigert av: Khalid Azim Mughal (khalid@ii.uib.no) Kilde: Java som første programmeringsspråk (3. utgave) Khalid Azim Mughal, Torill Hamre, Rolf W. Rasmussen

Detaljer

INF1000 : Forelesning 4

INF1000 : Forelesning 4 INF1000 : Forelesning 4 Kort repetisjon av doble (nestede) løkker Mer om 1D-arrayer Introduksjon til 2D-arrayer Metoder Ole Christian Lingjærde Biomedisinsk forskningsgruppe Institutt for informatikk Universitetet

Detaljer

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

La oss først se på problemet med objektorientert tankegang. Se figuren under. Konto Øving 11 - del b Oppgave 1 fasade av Session Beans. Denne oppgaven kan også gjøres samtidig som oppgave 2 (det er imidlertid enklere å holde oversikten om du gjør en ting i gangen). Du skal nå lage en

Detaljer

INF1010 våren 2018 tirsdag 23. januar

INF1010 våren 2018 tirsdag 23. januar INF1010 våren 2018 tirsdag 23. januar I/O og litt om bruk av unntak i Java Stein Gjessing Lesing fra terminal og fil navn: mininn Bruk Scanner: Scanner mininn = new Scanner(); Type: Scanner boolean

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i INF1010 Objektorientert programmering Dato: 9. juni 2016 Tid for eksamen: 09.00 15.00 (6 timer) Oppgavesettet er på 7 sider. Vedlegg:

Detaljer

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4 Repetisjon: nesting av løkker Kort repetisjon av doble (nestede) løkker Mer om D-arrayer Introduksjon til D-arrayer Metoder Ole Christian Lingjærde Biomedisinsk forskningsgruppe Institutt for informatikk

Detaljer

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller. Dagens forelesning Java 13 Design av større programmer : fordeling av roller INF 101-13. mars 2003 Flere eksempler på bruk av objekter MVC-prinsippet MVC-prinsippet Flere eksempler på programmer med objekter

Detaljer

INF1000 - Uke 10. Ukesoppgaver 10 24. oktober 2012

INF1000 - Uke 10. Ukesoppgaver 10 24. oktober 2012 INF1000 - Uke 10 Ukesoppgaver 10 24. oktober 2012 Vanlige ukesoppgaver De første 4 oppgavene (Oppgave 1-4) handler om HashMap og bør absolutt gjøres før du starter på Oblig 4. Deretter er det en del repetisjonsoppgaver

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i INF1000 Grunnkurs i objektorientert programmering Eksamensdag: 11. juni 2004 Tid for eksamen: 9.00 12.00 Oppgavesettet er på 8

Detaljer

Dagens tema: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn?

Dagens tema: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn? Dagens tema: 12 gode råd for en kompilatorskriver Hva skal gjøres med navn? Sjekking av navn Hvordan sjekke navn? Testutskrifter 12 gode råd En kompilator må også sjekke riktig navnebruk: Det må ikke forekomme

Detaljer

Kapittel 9. Distribusjon. Fjernbruker. Tjenermaskin LAN WAN. Nærbruker. Figur 9-1: En enkel klient/tjener distribusjon

Kapittel 9. Distribusjon. Fjernbruker. Tjenermaskin LAN WAN. Nærbruker. Figur 9-1: En enkel klient/tjener distribusjon Kapittel 9 Distribusjon Tjenermaskin Fjernbruker LAN Nærbruker WAN Figur 9-1: En enkel klient/tjener distribusjon 195 Tjenermaskin Fjernbruker LAN Replikert tjener Nærbruker WAN Figur 9-2: Klient/tjener-konfigurasjon

Detaljer

praktiske eksempler DOM Document Object Model DOM og Høst 2013 Informasjonsteknologi 2 Læreplansmål Gløer Olav Langslet Sandvika VGS

praktiske eksempler DOM Document Object Model DOM og Høst 2013 Informasjonsteknologi 2 Læreplansmål Gløer Olav Langslet Sandvika VGS DOM og praktiske eksempler Gløer Olav Langslet Sandvika VGS Høst 2013 Informasjonsteknologi 2 DOM Document Object Model Læreplansmål Eleven skal kunne programmere med enkle og indekserte variabler eller

Detaljer

Programmeringsspråket C

Programmeringsspråket C Programmeringsspråket C Bakgrunn Implementasjon av Unix ved AT&Ts laboratorium i Palo Alto 1960 75. Navnet kommer fra BCPL B C. Opphavsmannnen heter Dennis Ritchie. ANSI standard i 1988; omtrent alle følger

Detaljer

Dagens tema: 12 gode råd for en kompilatorskriver

Dagens tema: 12 gode råd for en kompilatorskriver Dagens tema: 12 gode råd for en kompilatorskriver Hvordan sjekke navn? Testutskrifter 12 gode råd Hva skal gjøres med navn? Sjekking av navn En kompilator må også sjekke riktig navnebruk: Det må ikke forekomme

Detaljer

TDT4100 Objektorientert programmering

TDT4100 Objektorientert programmering Eksamensoppgave i TDT4100 Objektorientert programmering Tirsdag 2. juni 2009, kl. 09:00-13:00 Oppgaven er utarbeidet av faglærer Hallvard Trætteberg og kvalitetssikrer Trond Aalberg. Kontaktperson under

Detaljer

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr Fra Python til Java En introduksjon til programmeringsspråkenes verden dag@ifi.uio.no Oversikt Introduksjon Python Java Noe er likt Noe bare ser anderledes ut Noe er helt forskjellig Et eksempel Klasser

Detaljer

Socket og ServerSocket

Socket og ServerSocket Side 1 av 5, socket og klient-tjener, V. Holmstedt, HiO 2006 Dette dokumentet er revidert den 29.8.2006, kl:12:30. Det er foretatt rettelser i begge versjoner av klassen A_Server. Socket og ServerSocket

Detaljer

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr IN1010 Fra Python til Java En introduksjon til programmeringsspråkenes verden dag@ifi.uio.no Oversikt Introduksjon Python Java Noe er likt Noe bare ser anderledes ut Noe er helt forskjellig Et par eksempler

Detaljer

Algoritmer og datastrukturer A.1 BitInputStream

Algoritmer og datastrukturer A.1 BitInputStream Vedlegg A.1 BitInputStream Side 1 av 8 Algoritmer og datastrukturer A.1 BitInputStream A.1 BitInputStream A.1.1 Instansiering BitInputStream har fire konstruktører og to konstruksjonsmetoder (eng: factory

Detaljer

INF1010. Grensesnittet Comparable<T>

INF1010. Grensesnittet Comparable<T> INF1010 21. februar 2013 Grensesnittet Comparable Stein Michael Storleer Institutt for Informatikk Universitetet i Oslo Interface med parametre interface Utkledd { // T er klassen jeg er utkledd

Detaljer

INF1010 Sortering. Marit Nybakken 1. mars 2004

INF1010 Sortering. Marit Nybakken 1. mars 2004 INF1010 Sortering Marit Nybakken marnybak@ifi.uio.no 1. mars 2004 Dette dokumentet skal tas med en klype salt og forfatter sier fra seg alt ansvar. Dere bør ikke bruke definisjonene i dette dokumentet

Detaljer

Tilstandsmaskiner med UML og Java

Tilstandsmaskiner med UML og Java Tilstandsmaskiner med UML og Java DAT2160 DAT2160 Høst Høst 2002 2002 Tilstandsmaskiner Tilstandsmaskiner med med UML UML og og Java Java Hva er en (endelig) tilstandsmaskin? En tilstandsmaskin kan sees

Detaljer

Intentor Helpdesk - Installasjon Step #3: Microsoft Reporting Services

Intentor Helpdesk - Installasjon Step #3: Microsoft Reporting Services Intentor Helpdesk - Installasjon Step #3: Microsoft Reporting Services Dokumentasjon levert av: Prosjekt: Norsk Data Senter AS Installasjon av Intentor Helpdesk Norsk Data Senter AS e-post info@nds.no

Detaljer

Kanter, kanter, mange mangekanter

Kanter, kanter, mange mangekanter Kanter, kanter, mange mangekanter Nybegynner Processing PDF Introduksjon: Her skal vi se på litt mer avansert opptegning og bevegelse. Vi skal ta utgangspunkt i oppgaven om den sprettende ballen, men bytte

Detaljer

JavaServer Pages (JSP)

JavaServer Pages (JSP) JavaServer Pages (JSP) Forelesning 1 Klient/tjener-systemer, installasjon av tjener, og intro til JSP. Statisk Web = HTML Overskrift

Detaljer

Mattespill Nybegynner Python PDF

Mattespill Nybegynner Python PDF Mattespill Nybegynner Python PDF Introduksjon I denne leksjonen vil vi se litt nærmere på hvordan Python jobber med tall, og vi vil lage et enkelt mattespill. Vi vil også se hvordan vi kan gjøre ting tilfeldige.

Detaljer

Hittil har programmene kommunisert med omverden via tastatur og skjerm Ønskelig at data kan leve fra en kjøring til neste

Hittil har programmene kommunisert med omverden via tastatur og skjerm Ønskelig at data kan leve fra en kjøring til neste Datafiler og serialisering Tekstfiler Scanner klassen Binær overføring av data Direkte tilgang til filinnholdet Serialisering LC191D Videregående programmering Semesterplan: http://aitel.hist.no/fag/vprg/index_lc191d.php

Detaljer

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr IN1010 Fra Python til Java En introduksjon til programmeringsspråkenes verden dag@ifi.uio.no Oversikt Introduksjon Python Java Noe er likt Noe bare ser anderledes ut Noe er helt forskjellig Et par eksempler

Detaljer

Bruk av NetBeans i JSP-delen av Web-applikasjoner med JSP og JSF

Bruk av NetBeans i JSP-delen av Web-applikasjoner med JSP og JSF Bruk av NetBeans i JSP-delen av Web-applikasjoner med JSP og JSF Else Lervik, august 2010 (Av hensyn til JSF-delen av kurset anbefaler vi at du sørger for å ha NetBeans-versjon 6.9.) I den grad denne veiledningen

Detaljer

Avdeling for ingeniørutdanning Institutt for teknologi

Avdeling for ingeniørutdanning Institutt for teknologi Avdeling for ingeniørutdanning Institutt for teknologi Oppgavetittel: Lab Fag(nr./navn): DOPS2021 - Operativsystemer Gruppemedlemmer: T. Alexander Lystad Faglærer: Karoline Moholth Dato: 15. oktober 2009

Detaljer

Seminaroppgaver IN1010, uke 2

Seminaroppgaver IN1010, uke 2 Seminaroppgaver IN1010, uke 2 1.a: Skriv en klasse HeiVerden.java. Klassen skal inneholde en main- metode (se på notatet fra tidligere). Inne i main -metoden skal programmet først la brukeren oppgi en

Detaljer

JDBC. Java DataBase Connectivity SQL i Java Læreboken: 8.5, s Forelesning i TDT4145, 9. mars 2004 Av Gisle Grimen

JDBC. Java DataBase Connectivity SQL i Java Læreboken: 8.5, s Forelesning i TDT4145, 9. mars 2004 Av Gisle Grimen JDBC Java DataBase Connectivity SQL i Java Læreboken: 8.5, s. 393-397 Forelesning i TDT4145, 9. mars 2004 Av Gisle Grimen JDBCs treenighet Databaseoppkobling java.sql.connection Utføre SQL java.sql.statement

Detaljer

2. Beskrivelse av installasjon av SQL Server 2005 og hvordan lage databasen som trengs av administrasjonsprogrammet:

2. Beskrivelse av installasjon av SQL Server 2005 og hvordan lage databasen som trengs av administrasjonsprogrammet: Workaround for DFS Administrasjonssystem og Windows Vista NB! Dette er IKKE en installasjon av systemet, men en måte for å få det til å virke på Windows Vista. Denne veiledningen er laget for litt avanserte

Detaljer

Introduksjon til objektorientert programmering

Introduksjon til objektorientert programmering Introduksjon til objektorientert programmering Samt litt mer om strenger og variable INF1000, uke6 Ragnhild Kobro Runde Grunnkurs i objektorientert programmering Strategi: Splitt og hersk Metoder kan brukes

Detaljer

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 7 Filer og unntak ( exceptions ) Professor Alf Inge Wang Stipendiat Lars Bungum

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 7 Filer og unntak ( exceptions ) Professor Alf Inge Wang Stipendiat Lars Bungum 1 TDT4110 Informasjonsteknologi grunnkurs: Kapittel 7 Filer og unntak ( exceptions ) Professor Alf Inge Wang Stipendiat Lars Bungum 2 Læringsmål Mål Introduksjon til filer (som inndata og utdata) Å bruke

Detaljer

Klasser skal lages slik at de i minst mulig grad er avhengig av at klienten gjør bestemte ting STOL ALDRI PÅ KLIENTEN!

Klasser skal lages slik at de i minst mulig grad er avhengig av at klienten gjør bestemte ting STOL ALDRI PÅ KLIENTEN! Å lage sikre klasser Unntaksklassene i Java-API-et Unntakshåndtering i databasesammenheng try-catch-finally-setningen Trelagsarkitektur; egen databaseklasse Transaksjonshåndtering LC191D Videregående programmering

Detaljer