 
                                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