Title: Kun til bruk i tilknytning til l
1Web-programmering med JavaServer Pages
- Forskjellige måter å programmere for web side
2-3Servleter side 4-6Hva består JavaServer
Pages (JSP) av? side 7-12Å lese inn data fra
brukeren side 13-18Datakontroll på klientsiden
med JavaScript side 19JSP-sider som
kommuniserer med databaser side 20-24Å lagre
tilstandsinformasjon side 25-27Å programmere
cookies side 28Å programmere med
sesjonsobjekter side 29-30Problemet med
oppdatering av sider side 31
2Å søke etter hoteller på Internett?
- Du skriver inn navnet på en by og får en liste
over mulige hoteller i retur. - Du sjekker kildekoden og finner hotellnavnene i
klartekst. - Hvorfor inneholder ikke kildekoden programlogikk
som søker etter hoteller i en database? - Svaret er at HTML-koden er spesiallaget
- Web-tjeneren mottar din forespørsel om hoteller i
en bestemt by, sender forespørselen til et
program som søker i databasen, og genererer så
HTML-kode med passende hoteller. - Denne HTML-koden sendes til klienten som svar på
forespørselen. - Dette kapitlet handler om å lage slike programmer.
3Forskjellige måter å programmere for web
- Dynamikk på klientsiden, i klientens nettleser
- En applet er et program som lastes ned til
nettleseren i tilknytning til en HTML-side - Nedlastingen tar noe lenger tid enn normalt
- Nettleseren varsler i statuslinjen om at Java
startes opp - Til gjengjeld får brukeren en side med langt
større funksjonalitet enn det en statisk
HTML-side kan tilby - Ulike scriptspråk har gradvis gjort det mulig å
lage enkel dynamikk uten at det går på bekostning
av nedlastingstiden. - Brukeren kan lese kildekoden til disse scriptene.
- Dynamikk på tjenersiden
- Brukeren fyller ut et skjema og trykker på
Send-knappen. - Dataene sendes til tjenermaskinen der de blir
behandlet av et program. - Denne behandlingen kan for eksempel være det å
lage en spesielt tilpasset HTML-side som sendes
tilbake til klienten. - Vi bruker JavaServer Pages (JSP) til å lage
programmet på tjenersiden. JSP bygger på noe som
heter servleter. - Programvare
- Du trenger en web-tjener som støtter servletter
og JSP - Du trenger den tilhørende online
API-dokumentasjonen
4Servleter
Meldingen service() sendes til servlet-objektet hv
er gang en klient etterspør siden
Servlet-objektet er ute av verden fordi
web-tjeneren er stoppet, eller annen grunn.
service()
init()
service()
destroy()
objektet er initiert
død
jobber
Servlet-objektet opprettes og initieres senest
første gang en klient etterspør siden.
En servlet er et Java-objekt som kjører i en
web-tjener.
5Servlet-objektet
- Alle klientene arbeider mot det samme
servlet-objektet. - Eventuelle objektvariabler kan derfor bli
oppdatert av flere forskjellige klienter. - Metoder som behandler objektvariabler bør derfor
være synkroniserte (synchronized i metodehodet) - Eksempelvis bør den synkroniserte klassen
java.util.Vector brukes i stedet for den
usynkroniserte klassen java.util.ArrayList. - En pool av tråder blir laget når en servlet
initieres. - En klient som etterspør en servlet (egentlig
etterspørres servletens service()-metode) vil få
tildelt sin egen tråd. - Tråden leveres tilbake til poolen etter bruk.
- Hvis en servlet etterspørres, og tråd-poolen er
tom, må klienten vente, eventuelt kan
web-tjeneren være satt opp/laget slik at den
utvider poolen. - Ved å bruke en pool av tråder unngår vi
ressurskrevende initiering av tråder hver gang en
etterspørsel kommer.
6Et eksempel på programmering av tjenersiden
public class EnkelServlet extends HttpServlet
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws
ServletException, IOException se
programliste 21.1
kildekode hos web-tjeneren
lthtmlgtltheadgtlttitlegtEt eksempel på
tjenerside-programminglt/titlegtlt/headgt ltbodygt Tidsp
unkt for nedlasting Thu May 30 113500 CEST
2002 lt/bodygt lt/htmlgt
forespørselen fra klienten genererer denne
HTML-koden
nettleseren viser fram siden
Løs oppgavene side 761-762.
7JavaServer Pages (JSP)
- En jsp-fil inneholder HTML-kode med elementer av
Java-kode - Brukeren etterspør jsp-filen direkte
- Hvis dette er første etterspørsel etter denne
filen, vil den bli konvertert til en servlet. - Servleten kompileres og startes automatisk.
- Resultatet av servletens service()-metode er en
HTML-side som sendes til klienten og som der blir
presentert i nettleseren. - En jsp-side er dermed en HTML-side som er laget
av et servlet-objekt basert på en jsp-fil. - lt!--
- Tid.jsp E.L. 2002-05-30
- --!gt
- lthtmlgtltheadgtlttitlegtEt eksempel på
tjenerside-programmeringlt/titlegtlt/headgt - ltbodygt
- Tidspunkt for nedlasting lt new
java.util.Date() gt - lt/bodygt
- lt/htmlgt
8Hvorfor JSP?
- Bare for å slippe å skrive out.print() rundt
HTML-kodene? - Nei!
- HTML er presentasjon.
- En jsp-fil vil i hovedsak inneholde HTML.
- Web-designere lager HTML-kode.
- Java-programmerere lager Java-klasser som
beskriver det problemområdet som vi arbeider med. - Bare små kodesnutter med Java trengs for å lenke
jsp-filen til Java-klassene. - Imidlertid, vi jobber med programmering, ikke
webdesign. - Derfor er jsp-filene i denne boka litt utypiske,
de innholder relativt lite HTML.
Løs oppgaven side 763.
9Ferdigdefinerte objekter og uttrykk i JSP
- Ferdigdefinerte objekter
- request, type HttpServletRequest
- response, type HttpServletResponse
- out, type PrintWriter
- session, type HttpSession
- JSP-uttrykk
- Omsluttes av lt og gt
- Eksempler
- Tidspunkt for nedlasting lt new
java.util.Date() gt // Ikke semikolon! - Tjeneren regner ut 17 7 og får lt 17 7 gt
- Klientmaskinen er lt request.getRemoteHost() gt
10JSP Scriptleter
Java-kode omsluttet med lt og gt, samme eksempel
på to måter
- Her kommer fem tilfeldige tall i intervallet 1,
100 - lt
- int sum 0
- for (int i 0 i lt 5 i)
- int tall (int) (100 Math.random() 1)
- gt
- ltbrgt lt tall gt
- lt
- sum tall
-
- gt
- ltbrgt Summen er lik lt sum gt
- Her kommer fem tilfeldige tall i intervallet 1,
100 - lt
- int sum 0
- for (int i 0 i lt 5 i)
- int tall (int) (100 Math.random() 1)
- out.println("ltbrgt" tall)
- sum tall
-
- out.println("ltbrgt" "Summen er lik " sum)
- gt
Her kommer fem tilfeldige tall i intervallet 1,
100 86 7 43 91 3 Summen er lik 230
Eksempel på utskrift hos klienten
11JSP-deklarasjoner
- Lokale variabler deklareres inne i scriptleter.
Hver klient får sitt eget sett av disse. - Variabler deklarert utenfor scriptleter blir
objektvariabler (det vil si at de er felles for
alle klienter). Slike variabler må omsluttes med
lt! og gt - lt! private int antall 0 gt //
objektvariabel, felles for alle klienter - lt antall gt
- Antall lt antall gt
- ltbrgt
- lt int teller 0 gt // lokal variabel,
hver klient sin variabel - lt teller gt
- Teller lt teller gt
- Første gang servleten aksesseres får vi denne
utskriften i nettleservinduet - Antall 1
- Teller 1
- Neste gang ser det slik ut
- Antall 2
- Teller 1
- Og videre
- Antall 3
- Teller 1
- Hver gang servleten stopper, nullstilles
variabelen antall.
12Kommentarer og direktiver
- Vanlige Java-kommentarer i Java-kode
- JSP-kommentarer i JSP-kode
- lt-- dette er en JSP-kommentar, den kan gå over
flere linjer --gt - HTML-kommentarer for kommentarer som skal sendes
til nettleseren - lt!-- dette er en HTML-kommentar, den kan gå over
flere linjer --gt - Et JSP-direktiv brukes til å styre på hvilken
måte servleten blir laget. - Et direktiv omsluttes av lt_at_ og gt.
- page-direktivet
- lt_at_ page import"mittBibliotek.Bok,
java.text.NumberFormat" gt - include-direktivet medfører at kildekoden i filen
som inkluderes blir satt inn på den plassen der
direktivet står. Dette skjer før servleten lages.
Eksempel - lt_at_ include file "PersonForm.jsp"gt
Løs oppgave 1 og 2 side 767.
13Å lese inn data fra brukeren
lthtmlgtltheadgtlttitlegtEt input-feltlt/titlegtlt/headgt
ltform actionLesNavn.jsp" method"post"gt
ltpgtSkriv navnet dittltbrgt ltinput name"navn"
type"text" size"30"gt ltpgt ltinput
type"submit" name"Send" value"Send"gt ltinput
type"reset" name"Slett" value"Slett"gtlt/formgtlt
/bodygtlt/htmlgt
14Hva skjer etter at brukeren har trykket på
Send-knappen?
lthtmlgtltheadgtlttitlegtTilbakemeldinglt/titlegtlt/headgtltb
odygtltString navnet request.getParameter("navn
")if (navnet ! null) navnet
navnet.trim() if (navnet.equals(""))
out.println("Du må skrive navnet ditt!") else
out.println("Hei på deg, " navnet
"!")gtltpgtlta href "Navn.html"gtTilbakelt/agtlt/b
odygtlt/htmlgt
LesNavn.jsp
kildekode på klientsiden
lthtmlgtltheadgtlttitlegtTilbakemeldinglt/titlegtlt/headgtltb
odygt Hei på deg, Ole Olsen! ltpgt lta href
"Navn.html"gtTilbakelt/agt lt/bodygtlt/htmlgt
15Parameternavn og -verdi
ltinput name"navn" type"text" size"30"gt
parameterverdi
parameternavn
String navnet request.getParameter("navn")
16Feilmelding på samme side som input-feltet
- lt!--
- Navn2.jsp E.L. 2002-05-31
- --!gt
- lthtmlgtltheadgtlttitlegtEt input-felt med
feilkontrolllt/titlegtlt/headgt - ltform action"Navn2.jsp" method"get"gt
- ltpgtSkriv navnet ditt
- ltbrgtltinput name"navn" type"text" size"30"gt
- ltpgt
- ltinput type"submit" name"Send" value"Send"gt
- ltinput type"reset" name"Slett" value"Slett"gt
- lt/formgt
- ltpgt
- lthrgt
- lt
- String navnet request.getParameter("navn")
- if (navnet ! null) // OBS! Første gang siden
lastes ned er navnet lik null - navnet navnet.trim()
- if (navnet.equals("")) out.println("Du må
skrive navnet ditt!") - else out.println("Hei på deg, " navnet
"!")
17Hva om vi hadde brukt get i stedet for post?
- I HTML-filen skriver vi
- ltform actionNavn2.jsp" method"get"gt
- Dataene brukeren skriver inn, hektes på URLen
slik at de vises i nettleserens adressefelt. - Det er en øvre grense på antall tegn. Vanligvis
er det ingen grunn til å bruke get i stedet for
post når data skal sendes til tjeneren. - Sensitive data skal alltid sendes via post.
18Et eksempel med mange forskjellige HTML-elementer
Vis programliste 21.4 og 21.5, side 772-775.
Gjør oppgave 1, side 775.
19Datakontroll på klientsiden med JavaScript
- Et supplement til datakontroll på tjenersiden.
- Av effektivitetsgrunner bør data kontrolleres før
de sendes til tjeneren. - Ikke en erstatning for datakontroll på
tjenersiden. - Data skal alltid kontrolleres på tjenersiden.
- HTML-koden utvides med script-kode.
- JavaScript er de facto-standarden for
script-programmering på klientsiden.
- lthtmlgtltheadgtlttitlegtEt input-felt med
JavaScriptlt/titlegtltscript language"JavaScript"gt - function kontrollerData()
- if (window.document.navnInput.navn.value "")
alert("Skriv navnet ditt!") - else window.document.navnInput.submit()
-
- lt/scriptgtlt/headgt
- ltform name"navnInput" action"Navn3.jsp"
method"post"gt - ltpgtSkriv navnet dittltbrgtltinput name"navn"
type"text" size"30"gtltpgt - ltinput type"button" value "Send" onClick
"kontrollerData()"gt - ltinput type"reset" name"Slett" value"Slett"gt
- lt/formgtltpgtlthrgt
- lt
- String navnet request.getParameter("navn")
- if (navnet ! null) // OBS! Første gang siden
lastes ned er navnet lik null - navnet navnet.trim()
- if (navnet.equals("")) out.println("Du må
skrive navnet ditt!") - else out.println("Hei på deg, " navnet
"!") -
- gtlt/bodygtlt/htmlgt
20Databaser
lthtmlgtltheadgtlttitlegtEnkel databasetestlt/titlegtlt/h
eadgt ltfont size"2"gtPersoner registrert i
databasenlt/fontgt ltbrgtltbrgt lttable
bgcolor"skyblue" border"1"gt
lttrgtltthgtPersonnrlt/thgtltthgtFornavnlt/thgt
ltthgtEtternavnlt/thgtlt/trgt
lttrgtlttdgt100lt/tdgtlttdgtOLElt/tdgtlttdgtHANSENlt/tdgtlt/trgt
lttrgtlttdgt101lt/tdgtlttdgtANNE GRETHElt/tdgtlttdgtÅSlt/tdgtlt/
trgt lttrgtlttdgt102lt/tdgtlttdgtJONNYlt/tdgtlttdgtHANSENlt/td
gtlt/trgt lt/tablegt lt/bodygtlt/htmlgt
JSP-kode på tjenersiden, se neste lysbilde.
21PersonTabell.jsp
- lthtmlgtltheadgtlttitlegtEnkel databasetestlt/titlegtlt/he
adgtltbodygt - ltfont size"2"gtPersoner registrert i
databasenlt/fontgt - ltbrgtltbrgt
- lt_at_ page import"java.sql." gt
- lttable bgcolor"skyblue" border"1"gt
lttrgtltthgtPersonnrlt/thgtltthgtFornavnlt/thgt
ltthgtEtternavnlt/thgtlt/trgt - lt
- Connection forbindelse null
- Statement setning null
- try
- String dbDriver "oracle.jdbc.driver.OracleDr
iver" - String dbNavn "jdbcoraclethin_at_baron.stud.
idb.hist.no1521orcl" - Class.forName(dbDriver)
- forbindelse DriverManager.getConnection(
dbNavn, brukernavn", passord") - setning forbindelse.createStatement()
- String sql "select from person"
- ResultSet resSet setning.executeQuery(sql)
- while (resSet.next())
- out.print("lttrgtlttdgt"
resSet.getString("persnr") "lt/tdgt") - out.print("lttdgt"
resSet.getString("fornavn") "lt/tdgt")
- catch (Exception e)
- out.print("Feil ved databasetilkobling " e)
- finally
- try
- if (resSet ! null) resSet.close()
- catch (Exception e)
- out.print("Feil ved lukking av
resultatsett " e) - finally
- try
- if (setning ! null) setning.close()
- catch (Exception e)
- out.print("Feil ved lukking av
setningsobjekt " e) - finally
- try
- if (forbindelse ! null)
forbindelse.close() - catch (Exception e)
- out.print("Feil ved lukking av
databseforbindelse " e) -
-
22En web-applikasjon som jobber mot en database
Bruker databasewrapper-fabrikken fra kapittel
20.
23Rekkefølgen de ulike filene etterspørres i
Navneregister.jsp
form action
Vis program- liste 21.8, side 781-785.
BehandleValg.jsp
slett
ny
endre
include persnr, fornavn og etternavn
som gitt for person behandlendeFil
EndrePerson.jsp
include persnr ikke definert fornavn og
etternavn lik blank behandlendeFil
NyPerson.jsp
include
Slett.jsp
PersonForm.jsp
PersonForm.jsp
form action
form action
Gjør oppgave 1 og 2 side 781.
NyPerson.jsp
EndrePerson.jsp
24Å lagre tilstandsinformasjon
- HTTP er en tilstandsløs protokoll.
- Den samme klienten kan sende mange forespørsler
til web-tjeneren. - Web-tjeneren behandler hver eneste forespørsel
helt uavhengig av de andre. - Web-tjeneren husker ingenting.
- Hvordan overføre data fra en web-side til en
annen? - Bruke send-knappen og så tolke request-objektet
- Bruke skjulte felt
- Lagre data, enten på klientsiden (cookies) eller
på tjenersiden (sesjonsobjekt)
25Cookies en oversikt
- Lagres på klientsiden
- Brukes ofte for personlig informasjon, f.eks.
navn og adresse - Håndteres av nettleseren
- Maks 4kb per cookie
- Maks 20 cookies per nettsted
- Maks 400 cookies per nettleser
- Hvis du ikke har konfigurert nettleseren til ikke
å akseptere cookies, vil du helt sikkert finne en
mengde cookies på din datamaskin. Søk etter
kataloger med navn cookies og filer med navn
cookies.. - Cookies lar web-tjeneren gjenkjenne deg, men ikke
identifisere deg. - Programmer på web-tjenere bør ikke avhenge av at
cookies brukes på klientsiden. - Cookies bør være et tilbud til klienten, ikke den
eneste muligheten.
26Sesjonsobjekter en oversikt
- Lagres på tjenersiden
- En klient tildeles en sesjonsidentifikasjon når
sesjonen starter, det vil si når kontakt mellom
tjener og klient opprettes. - Dataene lagres i et sesjonsobjekt på tjenersiden,
mens sesjonsidentifikasjonen normalt lagres hos
klienten som en cookie. - Som vi skal se senere, det er mulig å bruke
sesjonsobjekter uten å bruke cookies. - Et eksempel som bruker cookies og sesjonsobjekt
- Du logger deg på en nettbutikk for å bestille
pizza og brus, og dermed får du tildelt en
sesjonsidentifikasjon som lagres på din maskin i
en cookie. - Samtidig tildeles du et sesjonsobjekt hos
web-tjeneren. - Hver gang maskinen din ber om en ny fil fra
web-tjeneren sendes sesjonsidentifikasjonen
sammen med URL-en. - Dersom du gjør bestillinger, lagres de i det
tilhørende sesjonsobjektet hos tjeneren. - Dersom web-tjeneren allerede har lagret navn,
telefon og leveringsadresse i cookies på maskinen
din, blir du bedt om å bekrefte at dette er
riktig før ordren bekreftes. - Eventuelt skriver du inn disse opplysningene, og
de blir automatisk lagret i cookies slik at du
slipper å skrive dem inn ved en senere anledning.
- Dersom du skulle glemme hele bestillingen og
kanskje nøye deg med det du måtte ha i
kjøleskapet, vil sesjonsobjektet bli slettet hos
web-tjeneren etter en gitt tid.
27Å programmere cookies
Vis programliste 21.9, side 787-788.
28Å programmere med sesjonsobjekter
Vis programliste 21.10, side 789-791.
29En liten bokhandel
Vis program- liste 21.11 side 793-796
30Problemet med oppdatering av sider
- Last ned HTML-filen fra programliste 21.4 i din
nettleser. - Fyll inn data, trykk Send.
- Tilbakemelding Din evaluering er lagret.
- Trykk Oppdater-knappen i nettleseren.
- Dataene lagres en gang til.
- En enkelt bruker kan fylle datafilen med
likelydende evalueringer. - Kan løses ved å bruke et sesjonsattributt.
- Setter attributtet etter at dataene er lagret
(første gang). - Før lagring kontrollerer vi om det er satt.
- Hvis det er satt, lagrer vi ikke på nytt.
- Tilsvarende problemstilling gjelder oppdatering
av databaser.
Løs oppgavene side 796.