Title: Java Beans
1Java Beans
- RickardEnander_at_parallelconsulting.com
2Vad krävs av er idag?
- Någon kunskap om Java
- Intresse för komponenter
- Eventuellt överenseende med demo-demoner
3Agenda
- Motivation för Servlets
- Servlets jämfört med CGI
- Servlet API
- Exempel
- Hur man börjar utveckla
- Summering och vissa issues
4Motivet 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
5Vad ä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
6Vad ä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
7Vad 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
8Servlet, the big picture
- Någon Servlet Server
- kör och administrerar Servlets
- laddar och avladdar
- kallar rätt Servlet
- typiskt en Servlet enabled WebServer
9Servlet, på klientsidan
- Typiskt från en browser
- pekar på en URL
- Kan också vara vilken Java app som helst
- Applet
- Annan Servlet
- Applikation
10Servlet 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
11Servlet API
- Består av ett par klasser
- ServlertInterface
- GenericServletClass
- ServletConfigInterface
- ServletOutputStream, ServletInputStream
- ServletRequestInterface
- ServletRespondInterface
- Normalt inte av intresse
12ServletInterface
- Några metoder definierade
- init ( ServletConfig )
- destroy ()
- service ( ServletRequest, ServletResponce
) - getServletConfig ()
- getServletInfo ()
13GenericServlet
- Abstrakt klass att starta ifrån
- Implementerar ServletInterface
- Ytterligare några metoder
14HTTP paketet
- Normal startpunkt
- HttpServlet
- HttpServletResponseInterface
- HttpServletRequestInterface
- HttpSession
- HttpUtil
15Den intressanta klassen är HttpServlet
- Gör override på en eller flera metoder
- goGet ( HttpServletRequest request,
HttpServletRequest response) - doPut ( HttpServletRequest request,
HttpServletRequest response) - service ( ServletRequest request,
ServletRequest response) - normalt rör man ej service
- den kallar doGet eller DoPut med data
16Det 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
17Klassen HttpServletRequest håller preparedad data
- Metoden service lägger in information
automatiskt - getRequestURI, getServerPath
- getParameters( string name )
- getParameterNames, getParametervalues
- getSession
18Klassen HttpServletResponse används för att
returnera data
- Innehåller funktionalitet att returnera data
- setHeader
- sendError
- sendRedirect
- getOutputStream
- stream att skriva sin HTML till
19Klassen 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
20Innan 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
21Första exemplet, en mycket enkel Servlet
import java.io. import javax.servlet. import
javax.servlet.http. public class Ex1 extends
HttpServlet
22Gö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("ltHTMLgtltHEADgtltTITLEgtSimple
Servletlt/TITLEgtlt/HEADgt") out.println("ltBODYgt")
out.println("ltH1gt Simple Servletlt/H1gt")
out.println("Simple output.")
out.println("lt/BODYgtlt/HTMLgt") out.close()
23Ex2 är en Servlet med tillstånd
int counter 1000
- Addera en variabel
- Addera en init-metod
public void init(ServletConfig config)
throws ServletException
System.out.println("Initiating the Ex2
servlet") counter 0
24Ö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 )
25Ex3 läser data från request
out.println( "Request method "
request.getMethod() ) out.println(
"Request URI " request.getRequestUR
I() ) out.println( "Request protocol "
request.getProtocol() ) out.println(
"Servlet path " request.getServletPa
th()) out.println( "Path info "
request.getPathInfo() ) out.println(
"ltbrgt There are a lot more info to get
(see next example)")
26I Ex4 så skickar parametar i anropet
- http//localhost8080/servlet/Ex4?Servicetestpar
am13
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
27Ex5, använd ett HTML form för input
ltform actionhttp//localhost8080/servlet/Ex5gt lti
nput typehidden namesurvey valuehellogt
ltBRgtWhat is your income? 1-100 ltinput
typeradio nameincome value1-100gt 100-200 ltinput
typeradio nameincome value100-200gt 200-300 ltin
put typeradio nameincome value200-300gt 300-400
ltinput typeradio nameincome value300-400gt 500-m
ore ltinput typeradio nameincome
value500-moregt ltBRgtYour name? ltinput typetext
namecommentgt ltBRgtWhat TV shows do yo watch?
ltBRgtOperah ltinput typecheckbox nametv
valueOperahgt ltBRgtRapport ltinput
typecheckbox nametv valueRapportgt ltBRgtBingo
Lottoltinput typecheckbox nametv valueBingogt
28Ex5, läs av parametrarna
Enumeration e request.getParameterNames() whil
e (e.hasMoreElements()) String name
(String) e.nextElement() String vals
(String) request.getParameterValues(name) if
(vals ! null) for (int i 0
iltvals.length i) out.println("Parame
ter ltbgt"name "lt/bgt "valsi)
29En servlet kan ha minne mellan anrop baserat på
ID
- Typfallet är en affär
- man besöker flera avdelningar
- adderar saker till shoppingvagnen
- Servleten måste minnas vad som plockas
- lagra data
- identifiera användaren
30Servlet session
- Identifikation av användaren
- genom cockies
- genom URL extension
- Data mellan anropen
- måste identifiera
- kan få data från HttpSession
31Exempel 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)
32Hämtar och sparar undan data
// Get data with specific key Integer ival
(Integer) session.getValue("Ex6.count") if
(ivalnull) // if null (first time) ival
new Integer(1) else ival new
Integer(ival.intValue() 1) session.putValue("E
x6.count", ival) // put back // Write out the
data out.println("You have hit this page ltbgt"
ival "lt/bgt times.ltpgt") out.println("Total
hits to this page ltbgt" counter "lt/bgt
times.ltpgt")
33Andra saker som kan tas fram
out.println("lth3gtRequest and Session
Datalt/h3gt") out.println("Session ID in
Request " request.getRequestedSessionId())
out.println("ltbrgtIs Session ID in Request from
Cookie request.isRequestedSessionIdFromCo
okie()) out.println("ltbrgtIs Session ID in
Request from URL " request.isRequestedSess
ionIdFromUrl()) out.println("ltbrgtIs Session ID
valid " request.isRequestedSessionIdValid(
))
34Andra saker som kan tas fram
out.println("lth3gtSession Datalt/h3gt") out.printl
n("New Session " session.isNew()) out.println(
"ltbrgtSession ID " session.getId()) Date
crt new Date( session.getCreationTime()
) out.println("ltbrgtCreation Time " crt)
Date lat new Date( session.getLastAccessedTi
me() ) out.println("ltbrgtLast Accessed Time "
lat )
35Att tänka på
- Threads
- Finns bara en instans av varje Servlet
- måste vara thread safe
- alternativt
- implements SingleThreadModel
36Hur 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 c\jsdk2.0\lib
- PATH c\jsdk2.0\bin
37Hur 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
38Hur man gör på sin egen maskin för att utveckla
Servlets, forts
- Starta en Servlet Server
- ServletRunner eller en WebServer
- Skriv dina egna Servlets
- som vanligt
- Placera dina Servlets i JSDK2.0/examples
- Starta om ServletRunner efter omkompilering
- Kör från t.ex. Netscape