150 likes | 310 Views
Servlets — Java på serversidan. Introduktion. Javaservlets är en i raden av SUN:s många tillämpningar avJava. Servlets kan grovt sägas vara applets på serversidan.
E N D
Introduktion • Javaservlets är en i raden av SUN:s många tillämpningar avJava. Servlets kan grovt sägas vara applets på serversidan. • Funktionsmässigt liknar de också i mycket CGI-program. Servlets kan dessutom också ges mindre begränsade rättigheter än applets och fungerar mer som javaapplika-tioner. • Visserligen har det tidigare varit möjligt att skriva CGI-program i Java, men med servlets kommer också ett särsilda klasser som gör det lättare att skriva applikationer på serversidan – ett API för servlets.
CGI och servlets • CGI-program och servlets har mycket gemensamt och det råder en ständig debatt kring om det verkligen är någon skillnad mellan CGI-program och servlets. Servlet-förespråkarna har ofta talat om att servelets bara behöver laddas en gång i primärminnet och köras som en process. • CGI-anhängarna har då påpekat att de flesta större webbservrarna på marknaden idag erbjuder någon typ av API med likvärdig funktionalitet. CGI-anhängarna har också menat att tradionell server-programmering med kompilerande språk som t ex C eller C++ resulterar i snabbare program och att dessa språk fungerar bätre för industriella ändamål. • Java har knappast endast fördelar. Java i dess olika former har inte varit så värst kompatibelt alla gånger. Programmen har dessutom gått långsamt att köra och de ständiga utökningarna och förändringarna i Java som programmeringsspråk har gjort det svårt att hålla sig uppdaterad. Jämför med C eller C++ och du finner en helt annan stabilitet. Så den kritiska frågan vad gäller Java har alltid varit: hur fungerar visionerna i praktiken?
Övning — Applet/servlet-kommunikation • Det finns åtminstone tre olika sätt att låta applets kommunicera med servlets: http, sockets och rmi. I den här övningen kommer vi att undersöka hur kommunikatioinen går till via http. • Vad går övningen ut på? Du kommer att sitfta bekanstskap med servlets och öva på att programmera i Java. Målet är att bygga en fungerande Java-applikation för att söka i en adresslista. • På servern vi satt upp här vid KTH finns en servlet som söker i en påhittad telefonlista: • Gunnar Gren, Stora Gatan 18, 119 23 Storstad • Lisa Nilsson, Lilla Gata 3, 115 21 Stora Skogen • Per Persson, Bygatan 45, 122 11 Stenviken • Magnus Eriksson, Torpstigen 76, 121 33 Bergered • Anna Svensson, Friviken 98, 121 23 Byberga • Lotta Rostander, Granstigen 21, 133 45 Senholma • Hans Gobin, Finstedtsgatan 3, 213 11 Lindsered • När du exempelvis söker på Lotta skickar servleten tillbaka raden: • Lotta Rostander, Granstigen 21, 133 45 Senholma • Servleten skickar tillbaka samtliga rader som innehåller sökordet.
Testa Servlet • Servleten kan anropas med en URL med inbäddade sökargument: • Servleten får sin sökparameter med GET-metoden enligt CGI-standarden. • CGI står för Common Gateway Interface och anger bl a hur parametrar skickas till ett program på en Webbserver. • ? ovan indikerar var parametrarna börjar. • target=Lotta betyder att parametern med namnet target har värdet Lotta.
Testa Servleten • Prova själv att söka som nedan men med andra parametrar: • Prova själv att söka på ord från listan nedan: • Gunnar Gren, Stora Gatan 18, 119 23 Storstad • Lisa Nilsson, Lilla Gata 3, 115 21 Stora Skogen • Per Persson, Bygatan 45, 122 11 Stenviken • Magnus Eriksson, Torpstigen 76, 121 33 Bergered • Anna Svensson, Friviken 98, 121 23 Byberga • Lotta Rostander, Granstigen 21, 133 45 Senholma • Hans Gobin, Finstedtsgatan 3, 213 11 Lindsered • Skriv t ex in http://130.237.228.86/address.html?target=Stenviken för att söka efter någon som bor där.
Servlet-koden • Tre delar i servlet-koden är särskilt intressanta. • 1. Klassbiblioteken - Första delen länkar in särskilda klassbibliotek för servlets. Dessa behövs för att kunna skriva servlets och innehåller många praktiska metoder. • 2. Initiering - Andra delen läser in telefonlistan från en fil på hårddisken och lagrar den i en vektor. Detta sker endast första gången som servleten körs. Listan ligger sedan kvar tillsammans med servleten i primärminnet. • 3. Sökning - Tredje delen söker igenom vektorn efter sökparametern. För varje träff i listan skickas raden till klienten.
Servlet-koden import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class AdressServlet extends HttpServlet{ Vector v=new Vector(); public void init(ServletConfig conf) throws ServletException { String line; try{BufferedReader in=new BufferedReader(new FileReader("public_html/phonelist.txt")); while((line=in.readLine())!=null) v.addElement(line); in.close(); }catch (IOException e){ System.out.println("Exception: " + e); } } public void service(HttpServletRequest req, HttpServletResponse res) throws IOException { res.setContentType("text/html"); ServletOutputStream out = res.getOutputStream(); int i=0; while(i<v.size()){ if((v.elementAt(i).toString().indexOf(req.getParameter("target"))!=-1)&&(i<(v.size()-1))) out.println(v.elementAt(i).toString()+"<p>"); i++; } } } 1. servletklasser 2. Initiering - läser in telefonlistan i en vektor 3. Söker sträng i vektorn och skickar träffar til klienten
Låt oss undersöka närmare hur Servleten är uppbyggd: Klassbiblioteken java.io.* och import java.util.* känner du säkert igen. import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; Klassbiblioteken javax.servlet.* och javax.servlet.http.* är särskilda bibliotek för att skriva servlets. javax.servlet är ett generellt servlet-bibliotek och javax.servlet.http innehåller klasser för kommunikation enligt HTTP-protokollet. Servlet-koden
Servlet-koden Den först raden anger att klassen kommer att bygga vidare på HttpServlet som har inbyggda funktioner för att hantera http-kommunikation. public class AdressServlet extends HttpServlet{ En vektor skapas för att lagra adresslistan i: Vector v=new Vector(); Om det är första gången servleten körs init-metoden och adresslistan läses in i vektorn: public void init(ServletConfig conf) throws ServletException { String line; try{BufferedReader in=new BufferedReader(new FileReader("public_html/phonelist.txt")); while((line=in.readLine())!=null) v.addElement(line); in.close(); }catch (IOException e){ System.out.println("Exception: " + e); } }
Servlet-koden Den andra delen av servleten tar han om förfrågan. public void service(HttpServletRequest req, HttpServletResponse res) throws IOException { Servleten ska skicka tillbaka text: res.setContentType("text/html"); ServletOutputStream out = res.getOutputStream(); int i=0; while(i<v.size()){ Metoden getParameter(parameter) ger tillbaka värdet för GET-parametern och sedan söker vi på det värdet rad för rad i vektorn med adresserna: if((v.elementAt(i).toString().indexOf(req.getParameter("target"))!=-1)&&(i<(v.size()-1))) För varje träff så skickar vi textraden från adresslistan till klienten och bifogar en styckekod sist för att få nya rader ( bra om servleten anropas med en webbläsare). out.println(v.elementAt(i).toString()+"<p>"); i++; } }
Java-applikationen • På liknande sätt som du kan skriva in en URL med sökparameter för att köra servleten så kan ett program göra det. • Koden på nästa sida visar hur.
Grundkod för Java-applikationen • import java.net.*;import java.io.*;public class AdressKlient{ public static void main(String[] args){ String line; try{ URL u=new URL("http://130.237.228.86/address.html?target=Lotta"); • DataInputStream text=new DataInputStream(u.openStream()); • while((line=text.readLine())!=null) • System.out.println(line); • } • catch(IOException e){ • System.err.println(e); • } • } • } Skapa ett URL-objekt och öppna en in-ström Läs/skriv ut rader Resultat av körning
Vad blir då din uppgift? • Utgå från grundkoden för Java-applikationen på föregående sida och skriv om den så att den får ett användargränssnitt där användaren kan skriva in sökord i ett sökfält och där sökresultet visas i ett textfält. Användaren ska också kunna söka flera gånger utan att behöva starta om applikationen. • Om du vill få mer bakgrundsinformation om GET och att hämta data med URL:er i kapitel fem i Rusty. Kapitel femton tar också upp servlets. • Lycka Till! • /Anders