Java Beans
RickardEnander@parallelconsulting.com
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