JavaServer Pages (JSP) Forelesning 1 Klient/tjener-systemer, installasjon av tjener, og intro til JSP. Statisk Web = HTML <!-- htmleks.html -- Eksempel på bruk av HTML-kode --> <html> <body> <h2> Overskrift </h2> <table border = 1> <tr> <td> rad 1 kolonne 1 <td> rad 1 kolonne 2 <!-- RAD 1 --> <tr> <td> rad 2 kolonne 1 <td> rad 2 kolonne 2 <!-- RAD 2 --> </table> <ul> <!-- lager en unummerert liste --> <li> dette blir første punkt i lista <li> mens dette blir andre </ul> </body> </html>
Hvordan fungerer web? Klient-side Tjener-side http://aitel.hist.no/index.html <html>... </html> Klient sender forepørsel til riktig tjener og får svar Nettleser tolker svaret og viser det til bruker Et viktig spørsmål. Er klienten og tjener HW eller SW? Problemet med HTML HTML-kode er statisk. Når en HTML-side er laget så forblir den slik helt til vi manuelt forandrer den Tenk bare om vi vil vise klokka på en web-side, det er ikke mulig med HTML-kode <html> <body> <h1> Klokka er nå: 12.56.11 </h1> </body> </html> Det vi trenger er muligheten for å lage HTML-kode dynamisk => mao. at koden "forandrer seg selv". F.eks. slik at klokka hele tiden er riktig. <html> <body> <h1> Klokka er nå: <% kode for å sette inn klokkeslettet %> </body> </html>
Forskjell på scripting og programmering Programmering: Kode kompileres til maskinkode (evt. bytekode) Script: Koden tolkes en linje av gangen. Gjøres automatisk når scriptet kjøres. Tolking gir typisk dårligere ytelse og sikkerhet Programmering gir også stort sett bedre kontroll til programmereren. Programmering for web Fra statisk til dynamisk web HTML-skjema og CGI I dag er CGI mye godt erstattet Java Servlets (programmering) JSP (Script/programmering?) ASP (VBScript) PHP (??) I tillegg har vi klientside-script JavaScript -> støttes (stort sett av) alle nettlesere VBScript -> IE og klient-side programmering Java Applets/ActiveX
Klient-side script Scriptet blir utført av klienten HTML-koden som returneres fra tjeneren inneholder både HTML og script-elementer Det er altså ressurser på klienten som brukes under utføring => skalering? Kjør script, klokke.html! Vis/kilde. Klientside-script brukes mye i forbindelse med validering av input fra HTML-skjema vis sjekkinput.html rask respons trege forbindelse slipper unødig last på tjener sikkerhet? Klientside script må støttes av nettleser => problem med gamle nettlesere. Tjenerside script Scriptet utføres på tjeneren, med ressurser på denne => skalerbarhet? Det er HTML-kode som returneres til klienten. Neste foil. Vis script klokke.jsp. Vis kilde. Tjenerside script passer godt mot databaser se figur sikkerhet trege nettverksforbindelser Tjenerside-script og tunge beregninger => bedre enn klientside-script
Tjener JSP-fil Klient forespørsel svar utfør <%= new java.util.date() %> </BODY> Resulterende HTML-kode Wed Sep 12 10:45:22 GMT+02:00 2001 </BODY> Tjenerside-script og databaser
Elementer i JSP JSP er HTML-kode blandet med script-kode Scriptlets. <% java-kode %> styrer det som skjer i en JSP eksempeler <% for (int i=0; i < 2; i++) { %> <H1> If I were a </H1> <% %> RICH MAN </BODY> <% for (int i=0; i < 2; i++) { out.println( <H1> If I were a </H1> ); %> RICH MAN </BODY> Eksempel RICH MAN Klient forespørsel svar HTML Tjener utfør JSP HTML <% for (int i = 0; i < 2;i++){ %> <H1> If I were </H1> <% %> RICH MAN </BODY> <H1> If I were </H1> <H1> If I were </H1> RICH MAN Resulterende HTML-kode
Klient- og tjenerscript sammen En kan godt ha en kombinasjon av klientside og tjenerside script f.eks. kan en JSP returnere en HTML-side som inneholder JavaScript. Hva er vitsen? dette er spesielt aktuelt når vi tar inn opplysninger fra brukeren. Vi bruker klientside-script for å sjekke først. Vi MÅ imidlertid også gjøre sjekken på tjenersiden fordi vi ikke kan være sikker på at klientside-scriptet har gjort jobben sin (brukeren har endret scriptet). Eksempel Vi vil vise hva klokke er både på klient-maskinen og tjener-maskinen. beggeklokker.jsp (kode neste foil). Koden slik den er på tjener <!-- beggeklokker.jsp --> <H1> Denne siden viser klokken </H1> <SCRIPT LANGUAGE="JavaScript"> <!-- klientside-script --> var now = new Date(); document.write(now.gethours()); document.write(now.getminutes()); </SCRIPT> <% out.println(new java.util.date()); %> <!-- tjenerside-script --> </BODY>
Oppgave Skriv en JSP som skriver ut: god morgen hvis klokka er før 12 god dag hvis klokka er mellom 12 og 17 ellers god kveld Tisp: java.util.date har en metode gethours() som angir hva klokka er, med en int for hel time. Ikke bruk out.println(); Uttrykk (expression) <%= new java.util.date() %> Sørger for å kalle tostring-metoden på det aktuelle objektet. Gjør samme nytt (stort sett) som <% out.println(new java.util.date()); %>
Outkontra uttrykk Eksempel med out Eksempel med uttrykk <% boolean sann = true; String streng = sann... ; if(sann) out.println(streng); else out.println( usann.. ); %> </BODY> <% boolean sann = true; String streng = sann... ; if(sann) { %> <%= streng %> <% else { %> <%= usann.. %> <% %> </BODY> Out-objektet Dette er et ferdiglaget objekt. Fungerer omtrent som System.out.println() men responsen havner til nettleseren. Vi kan bruke dette direkte i en scriptlet. Vi lager det ikke selv! <% out.println( <H1> til nettleseren </H1> ); %> Dette objektet er av klassen javax.servlet.jsp.jspwriter For å se mulige metoder for denne klassen se API-dok for servleter.
Direktivet import Kan importere java-klasser i en JSP Merk at dette gir oss muligheten til veldig god deling mellom presentasjon og logikk! <%-- klokkeimport.jsp. --%> <%@page import="java.util.date, java.io.*" %> <html> <body> <%= new Date() %> <%-- slipper å bruke hele pakkenavnet new java.util.date() --%> </body> </html> Java Servlets JSP er blir omformet til en Java Servlet. import javax.servlet.*; public class MinServlet implements Servlet eller public class MinServlet extends HttpServlet API-dok ikke med i standard API-dok. http://java.sun.com/products/servlet/2.2/javadoc/index.html
javax.servlet.servlet Livssyklus Legg merke til at interface et Servlet brukes ved oppretting av en ny Servlet. Dette gjør at web-tjeneren kan behandle alle Servlets likt!!! Service metoden i en servlet kan kalles fra mange tråder samtidig! Lager et objekt av klassen Web-klient.. forespørsel Web-tjener Servlet min = newminservlet(); min.init(); min.service(); min.destroy(); MinServlet.. public void init(){.. public void service(){.. public void destroy(){.... Frigjør plassen som objektet har brukt
Sammenligne JSP og Servlets <html> <head> <title> Min første JSP side </title> </head> <body> <h1> Klokka er: <%= new java.util.date() %> </h1> <% int tall = 100; %> </body> </html> import javax.servlet.http.*; import javax.servlet.*; import java.io.*; import java.util.date; 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(""); out.println("<head>"); out.println("<title> Min første Servlet </TITLE>"); out.println("</head>"); out.println(""); out.println("<h1> Denne servlet'en viser klokka nå: </H1>"); Date klokke = new java.util.date(); out.println(klokke); int tall = 100; out.println("</body>"); out.println("");
Overgangen fra JSP til servlet Ved forespørsel vil JSP en bli kompilert til en servlet. Legges i work katalogen til web-tjeneren. Ved feil i en JSP får vi ofte kryptiske feilmeldinger. Vi får mye bedre feilmeldinger ved kompilering av Java filer. Kan derfor ved problemer gå inn og forandre den resulterende servleten, og kompilere denne. Kompilering av servlets For å kompilere en servlet må du: ha SDK installert i tillegg må du ha servlet.jar i classpath en. Dette er API en for servleter og ligger sammen med web-tjeneren. Når du skal kjøre servleten så må webtjeneren kunne finne servleten (class-filen). Konfigurering av dette vil variere fra tjener til tjener.
Deklareringer i en scriptlet i JSP <% %> String rikmann= If I were a rich man ; import javax.servlet.http.*; import javax.servlet.*; import java.io.*; JSP Servlet Deklarering i en scriptlet havner inne i service-metoden på servleten.. public class KlokkeServlet extends HttpServlet{ public void service(httpservletrequest req, HttpServle throws IOException, ServletException{ String rikmann = If I were a rich man ; Deklarering av metoder og objektvariabler <%! %> String enstreng = En streng ; private int enmetode(){ return 15; import javax.servlet.http.*; import javax.servlet.*; import java.io.*; JSP Servlet Deklarering i en JSP-deklarasjon havner utenfor service-metoden på servleten.. public class KlokkeServlet extends HttpServlet{ String enstreng = En streng ; private int enmetode(){ return 15; public void service (...){ // kan her bruker enstreng og enmetode()
Metode inne i metode <% %> private int enmetode(){ return 15; JSP Servlet Metodedeklarasjon laget i en scriptlet havner også inne i service-metoden.!! Feilmelding. Det er ikke lov å deklarere en metode inne i en annen i Java!!! import javax.servlet.http.*; import javax.servlet.*; import java.io.*; public class KlokkeServlet extends HttpServlet{ public void service (...){ private int enmetode(){ return 15; //FEIL!!! Anbefalt metode for deklarasjon i JSP For å definere metoder må dette gjøres gjennom en JSP-deklarering. <%! int MinMetode() {return 7; %> Også variable kan deklareres på denne måte => objektvariabler Variabler bør i de aller fleste sammenhenger deklareres i en scriptlet. Husk livssyklusen til en servlet flere forespørsler til samme JSP kjører samme service()- metode på servlet en!
Oppsummering Vanlig JSP-kode legges i scriptlet <% out.println( hei du ); %> Uttrykk kan brukes til å skrive ut <%=.. %> For å lage metoder brukes deklarering <%! %> Brukes skjeldent. Ikke bruk denne uten at du er sikker på at du skal bruke den. Importering av klasser gjøres med direktivet import: < %@page import= java.io.* %> Ikke bland sammen de ulike typene. Avslutt en type før du begynner på neste. Altså ikke gjør slik <%.. <%=. %> %> Tomcat Vi skal bruke en web-tjener som heter Tomcat i dette faget. java-basert=> fungerer på alle plattformer Vi har på skolen en Tomcat-tjener som dere primært kan bruke. Se http://www.stud.aitel.hist.no:8080/index.html Du bør også prøve å installere Tomcat selv Gir mye bedre kontroll, da du selv kan styre web-tjeneren. Last ned fra faget hjemmeside eller jakarta.apache.org Installer på ditt eget hjemmeområde Se leksjon 1 for forklaring på hvordan dette gjøres. Merk at Tomcat krever at det settes en miljøvariabel som heter JAVA_HOME som peker på katalogen hvor java sdk er installert. ca. 9 MB