JSP. Tilstander og synkronisering

Like dokumenter
JavaServer Pages (JSP)

Resymé: Leksjonen omhandler grunnlaget for JSP, nemlig Java Servlets. I tillegg gjennomgås de mest grunnleggende elementene i JSP..

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

1 JSP. 1.1 Innledning. 1.2 JSP og web-tjener. Innhold

1. Tilstandsinformasjon på klientsiden

1 Introduksjon til web-programmering med JSP

HØGSKOLEN I SØR-TRØNDELAG

Eksamen i Internetteknologi Fagkode: ITE1526

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

En bedre verden med AJAX

J2EE. CMP Entity Beans, Transaksjoner, JSP

Web-programmering med JSP Løsningsforslag leksjon 4

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

Oblig 4Hybelhus litt mer tips enn i oppgaven

Socket og ServerSocket

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

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Løsningsforslag Test 2

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

1. Finn klassene (hvilke objekter er det i problemet) 1. Dataene som beskriver problemet (hvilke objekter har vi og hvor mange klasser er det?

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

Antall oppgaver: 6. Alle trykte og skrevne hjelpemidler

Eksamen i Internetteknologi Fagkode: IVA1379

6107 Operativsystemer og nettverk

EKSAMEN Webpublisering

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

Innledende Analyse Del 1: Prosjektbeskrivelse (versjon 2)

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

1. Installasjon av web-tjener og teori

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

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring -

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I Løsningsforslag

Innføring i bruk av CGI4VB

Web-programmering med JSP Løsningsforslag leksjon 3

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) Løsningsforslag

Kap 3: Anvendelser av Internett

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

HØGSKOLEN I SØR-TRØNDELAG

GUI («Graphical User Interface») del 2

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

INF1010. grensesni-et Comparable<T> grensesni-et Iterable<T> rekursjon

INF1010. Grensesnittet Comparable<T>

HØGSKOLEN I SØR-TRØNDELAG

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

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; }

UNIVERSITETET I OSLO

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

Videregående programmering 6

Innføring i bruk av CGI4VB

TOD063 Datastrukturer og algoritmer

HØGSKOLEN I SØR-TRØNDELAG

2. Lage ASP.NET sider

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I

Wise Regnskap NO versjon , dato

LC191D Videregående programmering Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring. Else Lervik, januar 2012.

Universitetet i Oslo Institutt for informatikk. avmystifisert i INF102. Kvile

Leksjon 7. Filer og unntak

Kom i gang med E-Site - Med E-Site er det enkelt og trygt å redigere dine websider

Å lese tall fra en fil, klassen Scanner

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

Innledende Analyse Del 1.2

GUI («Graphical User Interface») del 2

Sikkerhet i Pindena Påmeldingssystem

Algoritmer og datastrukturer E Løkker i Java

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

6105 Windows Server og datanett

Introduksjon til programmering og programmeringsspråk. Henrik Lieng Høgskolen i Oslo og Akershus

INF1010 våren 2018 tirsdag 23. januar

Tell sekunder. Introduksjon. Skrevet av: Teodor Heggelund. I denne oppgaven skal vi lage vårt eget spill!

Http- og WebServices funksjoner

Programmering i C++ Løsningsforslag Eksamen høsten 2005

INF1010 siste begreper før oblig 2

Oppgave 1. Oppgavenr A B C

IN Notat om I/O i Java

Nettverkstilgang - problemstilling

1. NetBeans IDE: Lage en enkel mobilapplikasjon

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

6105 Windows Server og datanett

INF Løsning på seminaropppgaver til uke 8

Løse reelle problemer

INF Notat om I/O i Java

IN1010 våren Repetisjon av tråder. 15. mai 2018

INF Uke 10. Ukesoppgaver oktober 2012

1. Installering av webtjener. Litt teori

Introduksjon til programmering og programmeringsspråk

VEILEDER MOTTA FJERNHJELP

User Input / Output Handling. Innocent Code kap 3-4 INF-329 Øystein Lervik Larsen oysteinl@ii.uib.no 7/11-05

Sikkerhet i Pindena Påmeldingssystem

Kursdokumentasjon for Dreamweaver

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

Leksjon 7. Filer og unntak

HØGSKOLEN I SØR-TRØNDELAG

Synkronisering I. Kapittel 6. Tråd A. ferdig. t.varsle() u.vente() Tråd B. ferdig. tid

Oppdatering av eget innhold på venteromsskjermer BRUKERVEILEDNING

Tell sekunder. Steg 0: Hva er forskjellig fra før? Introduksjon. I denne oppgaven skal vi lage vårt eget spill!

Dagens tema Kapittel 8: Objekter og klasser

CSS: Style nettsider. Introduksjon. Skrevet av: Arve Seljebu

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

Transkript:

JSP Tilstander og synkronisering

Tilstandsinformasjon Fire måter å gjøre det på omskriving av URL cookies hidden fields (gjemte felt) tjenersidelagring (sessions)

se kreativbrukavurl.jsp Kreativ bruk av URL Lager URL som inneholder informasjon (kreative URL er) <a href=min.jsp?farge=hvit> hvit <a href=min.jsp?farge=rød> rød Handler på grunnlag av info i URL String farge = request.getparameter( farge ); if (farge.equals( hvit ) bakgrunn = white ;... <BODY BGCOLOR= <%= bakgrunn %> >

</BODY> </HTML> <% String farge = request.getparameter("farge"); //får tak i fargen valgt String bakgrunnsfarge ="green"; if (farge!= null){ if (farge.equals("white") farge.equals("red") farge.equals("green")){ bakgrunnsfarge=farge; //bestemmer fargen } } %> <HTML> <HEAD></HEAD> <BODY BGCOLOR="<%=bakgrunnsFarge%>"> <H1> Du får den fargen du vil </H1> <A HREF=kreativBrukAvUrl.jsp?farge=white> HVIT </A> <BR> <A HREF=kreativBrukAvUrl.jsp?farge=red> RØD </A> <BR> <A HREF=kreativBrukAvUrl.jsp?farge=green> GRØNN </A> <BR>

Omskriving av URL Skriver om URL en hver gang => dynamisk JSP en <a href= omskrivingurl.jsp?farge= <%=bakgrunnsfarge%> > se omskrivingurl.jsp

omskrivingurl.jsp <% String tmp = request.getparameter("farge"); String bakgrunnsfarge = "green"; %> if (tmp!= null) bakgrunnsfarge = tmp; if (bakgrunnsfarge.equals("green")){ bakgrunnsfarge="red"; }else{ bakgrunnsfarge="green"; } <HTML> <BODY BGCOLOR="<%=bakgrunnsFarge%>"> <H1> Du får den fargen du vil </H1> <A HREF=omskrivingURL.jsp?farge=<%=bakgrunnsFarge%> > SKIFT BAKGRUNNSFARGE </A> </BODY></HTML>

Problemet med omskriving URL Varigheten er dårlig. Lukker nettleser => tilstand borte Må konfigurere på nytt hver gang! Løsning cookies. Her lagres informasjonen på fil på klienten og blir derfor ikke borte hvis nettleseren lukkes.

Cookies Tekstfil som lagres på klienten Sendes med til tjeneren ved hver forespørsel til tjeneren som lagde cookie en Laget av JSP en: http://localhost/test/test.jsp Cookie blir synlig også i underkataloger http://localhost/test/underkatalog/../min.jsp //synlig her Ikke synlig her http://localhost/minkatalog/en.jsp

Spes.tegn hvite tegn samt []()=,/?@:; Lag cookie new Cookie(String navn, String verdi) Cookie kake = new Cookie( navn, verdi ); cookie.setmaxage(3600); // levetid i sekunder cookie.setversion(1); // går bra med spes.tegn response.addcookie(kake); //blir med i HTTPforsend

Les inn cookie String cookienavn = KAKE ; Cookie cookie = null; Cookie[] tabell = request.getcookies(); // henter inn de cookie'ene som kommer fra nettleser // går igjennom cookie'ene og finner vår cookie for (int i=0; i<tabell.length; i++){ cookie = tabell[i]; if (cookie.getname().equals(cookienavn)){ cookiefarge = cookie.getvalue(); } }

Hvordan finne cookie Hvordan finne cookies på maskinen din? Navnet på cookie-filen settes automatisk! Lese innhold => tekstfil =>notepad? Netscape Edit/Preferences/Advanced/Cookies/View Stored Cookies ser også innholdet IE må lete fram til cookies forskjellig fra OS til OS win2000 c:\ Documents and Settings\brukernavn (tomash) XP c:\ Documents and Settings\brukernavn\Cookies win98 c:\windows/cookies

Klient Tjener Bok.html Cookie The Shadow Rising forepørsel Cookie betal.jsp betal.jsp respons betal.jsp Tomas Holt Blåbærv. 11 tomash@idb.hist.no forepørsel resultat.jsp respons

Bruksområder for cookies Identifikasjon av bruker i E-handel inneholder en unik ID Unngå brukernavn og passord lagres i cookie, slipper å skrive disse inn må ikke brukes hvis sikkerhet er viktig!! Skreddersy web-sider personlige innstillinger Spesifisert reklame husker oppførselen til brukeren og kan gi relevant reklame annonsøren får mer valuta for pengene bruker mer fornøyd

Fakta om cookies Nettleser kan settes til å nekte cookies! Kan gi problemer hvis vi lager løsning som kun baserer seg på cookies! Kan bruke omskriving av URL! Nettlesere har begrensninger på hvor mange cookies som aksepteres. Typisk 20 pr. område 300 totalt Størrelsen begrenses til 4 kb. disk fylles ikke opp

Inkludering av filer Hvorfor inkludering? se valgbokser.jsp i leksjon To typer: statisk => direktiv include dynamisk => hendelse include Statisk: inkludering skjer kun en gang! Evt. oppdateringer i inkludert fil vil ikke bli med Dynamisk: inkludering skjer hver gang. Oppdateringer i inkludert fil vises. statisk <%@ include file= relativ URL %> dynamisk : <jsp:include page= logo.html flush= true />

<HTML> <HEAD></HEAD> <BODY> direktiv_include.jsp <%@ include file="logo.html" %> <P><H1> Dette er velkomstsiden </H1> <P> blabla... logo.html <IMG SRC="logo1.bmp" ALIGN=RIGHT BORDER= <A HREF="http://laura.net"> Forsiden </A> <A HREF="mailto:laura@investements.com"> E-post Laura </A> <BR CLEAR=all> </BODY> </HTML> Resulterende servlet Til klient public class KlokkeServlet extends HttpServlet { public void service(httpservletrequest req, HttpServletResponse res) throws IOException, ServletException { res.setcontenttype("text/html"); PrintWriter out = res.getwriter(); out.println( <HTML> <HEAD></HEAD> <BODY> <IMG SRC="logo1.bmp" ALIGN=RIGHT BORDER=1> <A HREF="http://laura.net"> Forsiden </A> <A HREF="mailto:laura@investements.com">E-post Laura </A> <BR CLEAR=all> <P><H1> Dette er velkomstsiden </H1> <P> blabla... </BODY> </HTML> ); } }

<HTML> <HEAD></HEAD> <BODY> direktiv_include.jsp <jsp:include page= logo.html flush= true /> <P> <H1> Dette er velkomstsiden </H1> <P> blabla... logo.html <IMG SRC="logo1.bmp" ALIGN=RIGHT BORDER=1> <A HREF="http://laura.net"> Forsiden </A> <A HREF="mailto:laura@investements.com"> E-post Laura </A> <BR CLEAR=all> </BODY> </HTML> import javax.servlet.http.*; import javax.servlet.*; import java.io.*; Resulterende servlet Til klient public class KlokkeServlet extends HttpServlet { public void service(httpservletrequest req, HttpServletResponse res) throws IOException, ServletException { res.setcontenttype("text/html"); PrintWriter out = res.getwriter(); out.println( <HTML> <HEAD></HEAD> <BODY> <p align=center> REFERANSE</p> <H1 align=center> Dette er velkomstsiden </H1> <p> blabla... </BODY> </HTML> ); }

Konklusjon inkludering Ved statisk inkludering kan en bruke kode fra den andre filen f.eks. metoder. Bruke dynamisk inkludering når du ikke har to JSP er som bruker kode fra hverandre er veldig opptatt av ytelse. Statisk inkludering vil være raskere da inludering skjer en gang og kompileres inn i koden til servlet en.

Sesjoner Tilstandslagring på tjenersiden Kan lagre objekter og tabeller! ikke tilfellet for de andre teknikkene Innebygget objekt i JSP session-objektet Kan med dette objektet ta vare på tilstander for et web-sted web-sted er en samling web-sider som hører sammen (bokhandel)

Klient Web-sted Velkommen.jsp Sessionobjekteter SessionID=1 brukernavn = tomas SesjonsID= 1... SesjonsID= 56 Nyheter.jsp... Klient Musikk.jsp SessionID=56 brukernavn = arne

Bruk av session-objektet SesjonsID <% session.getid() %> Ny eller gammel sesjon <% session.isnew() %> Lagre tilstandsinformasjon <% session.setattribute(string navn, Object obj) %> f.eks. String brukernavn = request.getparameter( navn ); session.setattribute( navn, brukernavn); henter ut verdien med <% session.getattribute(string navn) %> f.eks. session.getattribute( navn );

taimot.jsp <%-- taimot.jsp ; navne-info og lagrer --%> <html><body> <% String navnvar = request.getparameter("navn"); if (navnvar!= null &&!navnvar.equals("")){ //ta vare på navnet til senere session.setattribute("navn",navnvar); out.println("navnet lagret"); }else out.println("ikke noe navn å ta vare på"); %> <p> <a href=./skrivutnavn.jsp> Gå til en skrivut.jsp for å se navnet du oppga </a> </body></html>

skrivut.jsp <%-- skrivutnavn.jsp ; skriver ut lagret navn --%> <html><body> Ditt navn er: <%= session.getattribute("navn") %> </body> </html>

Varighet av en sesjon Varigheten er avhengig av varigheten på klientside og tjenerside Klientside: cookies/omskriving URL På tjenerside har web-tjeneren en default verdi for hvor lang tid det går fra siste livstegn til sessionobjektet slettes. kan sette dette selv i JSP en <% session.setmaxinactiveinterval(5*60); //5 min. %> kan også fjerne session-ojektet eksplisitt <% session.invalidate(); %> kan også fjerne et objekt fra session-objektet <% session.removeattribute( navn ); %>

Sesjoner uten cookies I stedet for cookies kan sesjonsid sendes ved omskriving av URL. egen metode for dette i forb. med sesjoner response.encodeurl( url.jsp ); eksempel: Vanligvis bruker vi <form action= url.jsp > For å støtte omskriving av URL gjør vi <form action= <%= response.encodeurl( url.jsp ) %> > vi gjør dette på alle URL er i JSP en vår => sikret i tilfelle nettleser ikke aksepterer cookies.

Konklusjon sesjoner Sesjoner er et kraftig verktøy Tenk igjennom hvor lenge sesjonsinformasjon skal tas vare på husk denne informasjonen ligger i minnet på tjeneren Får du problemer med ytelsen på tjeneren kan du bruke en av disse metodene cookies omskriving av URL gjemte felt disse tar ikke opp minne i tjeneren!

Application-objektet Er veldig likt session-objektet, men det finnes kun et application-objekt pr. web-sted. Kan her lagre ting som skal være tilgjengelig i alle JSP er for alle klienter f.eks. kanskje vi skal skrive ut en teller på alle websidene på dette web-stedet. Kan også lage teller med bruk av fil ulempe må lese/skriv til fil hele tiden application-objektet er i minnet! Bruk fil ved statisk informasjon. Application-objektet på samme måte som sessionobjektet med setattribute() og getattribute()

Synkronisering Problemer når en får flere oppdateringer av application-objektet samtidig. vis kjøring av application.jsp <% Integer tmpteller = (Integer)application.getAttribute("teller"); int tmp = tmpteller.intvalue(); application.setattribute("teller", new Integer(tmp+1)); //oppdaterer verdien i application-objektet %>

Løsning isthreadsafe Direktivet isthreadsafe <%@ page isthreadsafe=false %> defaultverdi = true nå kjører kun en likedan JSP på en gang (service-metoden til generert servlet) Merk at isthreadsafe ikke hindrer to ulike JSP er (servlets) til å nå application-objektet samtidig!

Synkronisering av applicationobjektet Kan sørge for å synkronisere applicationobjektet slik at kun en forespørsel blir behandlet av det samtidig. <% synchronized(application){ Integer tmpteller = (Integer)application.getAttribute("teller"); int tmp = tmpteller.intvalue(); application.setattribute("teller", new Integer(tmp+1)); //oppdaterer verdien i application-objektet }

Deklarering inne i scriptlet <% int tall = 0 %> Overgang til servlet public class enservlet extends HttpServlet{ public void service(..){ int tall = 0; }

<%! int tall = 0 %> Objektvariabler Overgang til servlet public class enservlet extends HttpServlet{ int tall = 0; public void service( ){... }

Synkronisering av objektvariabler <%! int teller = 0; %> <%= "Oppstart av JSP: " + new java.util.date() %> <BR> <%= "Verdien på telleren ved oppstart " + teller %> <% syncronized(this){ int tmp = teller teller = tmp + 1; } %> <BR> <%= "Ny verdi til teller: " + teller %>

Initialisering av en JSP Vi kan initialisere en JSP-med å lage oss metoden jspinit() i JSP en. Denne metoden vil kun kjøres ved første forespørsel til denne JSP en. Det finnes også en maken jspdestroy() som kan brukes til opprydding i det JSP en (servlet en) fjernes. typisk når web-tjeneren avsluttes.

Eksempel initialisering <%! %> Date dato; public void jspinit(){ dato = new java.util.date(); } <%= Første besøk var: + dato %>