380 likes | 493 Views
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
E N D
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 ( ServletConfig ) • destroy () • service ( 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 ( 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
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 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; }
Ö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¶m1=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 c:\jsdk2.0\lib • PATH 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