Java Beans
[email protected]
Vad krävs av er idag?
Någon kunskap om Java
 Intresse för komponenter
 Eventuellt överenseende med
demo-demoner

Agenda
Motivation för Servlets
 Servlets jämfört med CGI
 Servlet API
 Exempel
 Hur man börjar utveckla
 Summering och vissa ”issues”

Motivet för Servlets

HTML sidor är inte nog
– vi behöver ha någon logik bakom sidorna

Idag(?) är CGI det vanliga sättet

Servlet kan ses som en Java-version av
CGI
– men bättre
Vad är då CGI?
Common Gateway Interface
Vanligt sätt att generera dynamisk HTML
 Vad som händer är

– Web-servern startar ett program
– Programmet läser indata från stdin
– Programmet “gör” något
– Programmet skriver HTML till stdout
– Web serverns returnerar genererad HTML till
klienten
Vad är dåligt med CGI?

Nytt program startar varje gång
– dyrt resursmässigt

Tillståndslöst
– hur håller man en session

Finns bättre varianter idag
Vad gör Servlet bättre?

Initierase av ServletServern en gång
– instansen “dör inte” mellan anrop
– billigare
Kan hantera många anrop på en gång
 Ren Java, plattformsoberoende
 Can anropas från HTML eller från Applet
 Man kan kommunicera mellan Servlets

Servlet, “the big picture”

Någon Servlet Server
– kör och administrerar Servlet:s
– laddar och “avladdar”
– kallar rätt Servlet
– typiskt en Servlet “enabled” WebServer
Servlet, på klientsidan

Typiskt från en browser
– pekar på en URL

Kan också vara vilken Java app som
helst
– Applet
– Annan Servlet
– Applikation
Servlet paket
Två package av intresse
 javax.servlet

– Inrefarces
– Man börjar normalt inte från denna nivå

javax.servlet.http
– specialicerade för HTTP
– normalt så startar man härifrån
Servlet API

Består av ett par klasser
– ServlertInterface
– GenericServletClass
– ServletConfigInterface
– ServletOutputStream, ServletInputStream
– ServletRequestInterface
– ServletRespondInterface

Normalt inte av intresse
ServletInterface

Några metoder definierade
– init
– destroy
– service
( ServletConfig )
()
( ServletRequest,
ServletResponce )
– getServletConfig ()
– getServletInfo
()
GenericServlet

Abstrakt klass att starta ifrån
– Implementerar ServletInterface
– Ytterligare några metoder
HTTP paketet

Normal startpunkt
– HttpServlet
– HttpServletResponseInterface
– HttpServletRequestInterface
– HttpSession
– HttpUtil
Den intressanta klassen är
HttpServlet

Gör override på en eller flera metoder
– goGet
– doPut
– service

( HttpServletRequest request,
HttpServletRequest response)
( HttpServletRequest request,
HttpServletRequest response)
( ServletRequest request,
ServletRequest response)
normalt rör man ej service
– den kallar doGet eller DoPut med data
Det finns ett antal metoder
ytterligare i HttpServlet

init ( ServletConfig )
– initiering, t.ex. databasförbindelse
– kallas från ServletServern en gång

destroy ()
– stäng t.ex. databasförbindelse
– kallas från ServletServern en gång

getServletInfo
– informationssträng, används av Servern
Klassen HttpServletRequest håller
preparedad data

Metoden service lägger in information
automatiskt
– getRequestURI, getServerPath
– getParameters( string name )
– getParameterNames, getParametervalues
– getSession
Klassen HttpServletResponse
används för att returnera data

Innehåller funktionalitet att returnera
data
– setHeader
– sendError
– sendRedirect
– getOutputStream

stream att skriva sin HTML till
Klassen HttpSession hjälper dig
att hålla en session
Data mellan anrop
 måste ha unikt ID på något sätt
 ServletServern lagrar data mellan anrop
 Metoder som normalt används

– getValue, removeValue
– getValueNames
– putValue
– isNew, invalidate
Innan vi går till exempel
repeterar vi livscykeln

Livscykeln från Serverns perspektiv
– Servern initierar en Servlet och anroper
init
– Servern anropar service-metoden många
gånger
– Servern avinstansierar en Servlet och
anropar destroy
Första exemplet, en mycket enkel
Servlet
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Ex1 extends HttpServlet
Gör override på metoden doGet
public void doGet (
HttpServletRequest
request,
HttpServletResponse
response )
throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML><HEAD><TITLE>Simple Servlet</TITLE></HEAD>");
out.println("<BODY>");
out.println("<H1> Simple Servlet</H1>");
out.println("Simple output.");
out.println("</BODY></HTML>");
out.close();
}
Ex2 är en Servlet med tillstånd

Addera en variabel

Addera en init-metod
int counter = 1000;
public void init(ServletConfig config)
throws ServletException
{
System.out.println("Initiating the Ex2 servlet");
counter = 0;
}
Öka counter i varje anrop
public void doGet( HttpServletRequest request,
HttpServletResponse response )
throws ServletException,IOException
{
// added lines in doGet
counter++;
out.println("Counter value : " + counter );
}
Ex3 läser data från request
out.println( "Request method
:" +
request.getMethod()
);
out.println( "Request URI
:" +
request.getRequestURI() );
out.println( "Request protocol
:" +
request.getProtocol()
);
out.println( "Servlet path
:" +
request.getServletPath());
out.println( "Path info
:" +
request.getPathInfo()
);
out.println( "<br> There are a lot more info” +
“to get (see next example)");
I Ex4 så skickar parametar i
anropet

http://localhost:8080/servlet/Ex4?Service=test&param1=3
Enumeration e = request.getParameterNames();
while (e.hasMoreElements())
{
String name = (String)e.nextElement();
String value = request.getParameter(name);
out.println("Parameter : " + name + " = " +
request.getParameter(name));
}
Parameter : param1 = 33
Parameter : Service = test
Ex5, använd ett HTML form för
input
– På klientsidan
<form action=http://localhost:8080/servlet/Ex5>
<input type=hidden name=survey value=hello>
<BR>What is your income?
1-100
<input type=radio name=income value=1-100>
100-200
<input type=radio name=income value=100-200>
200-300
<input type=radio name=income value=200-300>
300-400
<input type=radio name=income value=300-400>
500-more
<input type=radio name=income value=500-more>
<BR>Your name? <input type=text name=comment>
<BR>What TV shows do yo watch?
<BR>Operah
<input type=checkbox name=tv value=Operah>
<BR>Rapport
<input type=checkbox name=tv value=Rapport>
<BR>Bingo Lotto<input type=checkbox name=tv value=Bingo>
Ex5, läs av parametrarna
Enumeration e = request.getParameterNames();
while (e.hasMoreElements())
{
String name = (String) e.nextElement();
String vals[] = (String[]) request.getParameterValues(name);
if (vals != null)
{
for (int i = 0; i<vals.length; i++)
{
out.println("Parameter :<b>"+name + "</b> : "+vals[i]);
}
}
}
En servlet kan ha “minne” mellan
anrop baserat på ID

Typfallet är en affär
– man besöker flera avdelningar
– adderar saker till shoppingvagnen

Servlet:en måste minnas vad som plockas
– lagra data
– identifiera användaren
Servlet session

Identifikation av användaren
– genom cockies
– genom URL extension

Data mellan anropen
– måste identifiera
– kan få data från HttpSession
Exempel på session

Håller reda på antal inviduella anrop
public void doGet( HttpServletRequest request,
HttpServletResponse response )
throws ServletException,IOException
{
counter++;
HttpSession session = request.getSession(true);
Hämtar och sparar undan data
// Get data with specific key
Integer ival = (Integer) session.getValue("Ex6.count");
if (ival==null)
// if null (first time)
ival = new Integer(1);
else ival = new Integer(ival.intValue() + 1);
session.putValue("Ex6.count", ival);
// put back
// Write out the data
out.println("You have hit this page <b>" +
ival + "</b> times.<p>");
out.println("Total hits to this page <b>" + counter +
"</b> times.<p>");
Andra saker som kan tas fram:
out.println("<h3>Request and Session Data:</h3>");
out.println("Session ID in Request: " +
request.getRequestedSessionId());
out.println("<br>Is Session ID in Request from Cookie: ” +
request.isRequestedSessionIdFromCookie());
out.println("<br>Is Session ID in Request from URL: " +
request.isRequestedSessionIdFromUrl());
out.println("<br>Is Session ID valid : " +
request.isRequestedSessionIdValid());
Andra saker som kan tas fram:
out.println("<h3>Session Data:</h3>");
out.println("New Session: " + session.isNew());
out.println("<br>Session ID: " + session.getId());
Date crt = new Date( session.getCreationTime() );
out.println("<br>Creation Time: " + crt);
Date lat = new Date( session.getLastAccessedTime() );
out.println("<br>Last Accessed Time: " + lat );
Att tänka på

Threads
– Finns bara en instans av varje Servlet
– måste vara thread safe
– alternativt

implements SingleThreadModel
Hur man gör på sin egen maskin
för att utveckla Servlets

Setup
– JDK
– JSDK2.0

http://java.sun.com/products/servlet/index.html
– CLASSPATH
– PATH
c:\jsdk2.0\lib
c:\jsdk2.0\bin
Hur man gör på sin egen maskin
för att utveckla Servlets

Kör
– Starta ServletRunner
– Placera dina Servlets i JSDK2.0/examples
– Starta om SrrvletRunner efter omkompilering
– Kör från t.ex. Netscape
Hur man gör på sin egen maskin
för att utveckla Servlets, forts

Starta en Servlet Server
– ServletRunner eller en WebServer

Skriv dina egna Servlet:s
– som vanligt
– Placera dina Servlets i JSDK2.0/examples
– Starta om ServletRunner efter
omkompilering
– Kör från t.ex. Netscape