Servlets — Java på serversidan
Serlvets
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.
previous
next
2
Serlvets
Servlets — generell modell
servleten laddas en gång och
ligger sedan kvar i primärminnet
Servlet
2.
1. E
n fö
ö
an g
g
å
r
rf
rs
rvlet
En Se
körs
Webbserver
Webbklient
3 . Re s
ultet sk
previous
next
ickas t
ill klien
ten
Utdata från
servlet
3
Serlvets
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?
previous
next
4
Serlvets
Ö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.
previous
next
5
Serlvets
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.
previous
next
6
Serlvets
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.
previous
next
7
Serlvets
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.
previous
next
8
Serlvets
Servlet-koden
import java.io.*;
import java.util.*;
import javax.servlet.*;
1. servletklasser 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
2. Initiering FileReader("public_html/phonelist.txt"));
läser in
while((line=in.readLine())!=null)
telefonlistan i
v.addElement(line);
en vektor
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();
3. Söker sträng
int i=0;
i vektorn och
while(i<v.size()){
skickar träffar
if((v.elementAt(i).toString().indexOf(req.getParameter("target"))!=til klienten
1)&&(i<(v.size()-1)))
out.println(v.elementAt(i).toString()+"<p>");
i++;
}
}
}
previous
next
9
Serlvets
Servlet-koden
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
import
import
import
java.io.*;
java.util.*;
javax.servlet.*;
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.
previous
next
10
Serlvets
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);
}
}
previous
next
11
Serlvets
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++;
}
}
previous
next
12
Serlvets
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.
previous
next
13
Serlvets
Grundkod för Java-applikationen
import java.net.*;
import java.io.*;
public class AdressKlient{
public static void main(String[] args){
String line;
try{
Skapa ett URLURL u=new URL("http://130.237.228.86/address.html?target=Lotta");
objekt och öppna
DataInputStream text=new DataInputStream(u.openStream());
en in-ström
while((line=text.readLine())!=null)
Läs/skriv ut rader
System.out.println(line);
}
catch(IOException e){
System.err.println(e);
}
}
}
Resultat av körning
previous
next
14
Serlvets
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
previous
next
15