350 likes | 467 Views
Internetteknologi 2 (ITNET2). Java teknologi på Internettet J2EE Servlets. Indhold i denne præsentation. Java teknologier på Internettet Styrker og svagheder ved Java Servlet teknologi HttpServlet HttpServletRequest HttpServletResponse Eksempler på brug af Servlets
E N D
Internetteknologi 2 (ITNET2) Java teknologi på Internettet J2EE Servlets
Indhold i denne præsentation • Java teknologier på Internettet • Styrker og svagheder ved Java • Servlet teknologi • HttpServlet • HttpServletRequest • HttpServletResponse • Eksempler på brug af Servlets • Deployment af Java Servlets på Tomcat AS
Java teknologier på Internettet Java Webteknologier • J2EE/JEE: Enterprise Java, til store og datatunge systemer • Servlets: server-side dynamisk og OO til indlejret HTML • JSP: server-side dynamisk og OO til indlejret kode • JSF: modstykke til ASP.NET 2 • Applets: client-side dynamisk til avanceret dynamik på klienten (alle de ting som DHTML ikke kan) • RMI, SOAP, CORBA og EJB er en del af JEE application servere • IKKE JavaScript – har INTET med Java at gøre
Vi ser at HTML er indlejret. import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<head>"); out.println("<title>Hello World!</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello World!</h1>"); out.println("</body>"); out.println("</html>"); } } Server-side:Servlet eksempel Resultatet <html> <head> <title>Hello World!</title> </head> <body bgcolor="white"> <a href="/examples/servlets/helloworld.html"> <img src="/examples/images/code.gif" height=24 width=24 align=right border=0 alt="view code"></a> <a href="/examples/servlets/index.html"> <img src="/examples/images/return.gif" height=24 width=24 align=right border=0 alt="return"></a> <h1>Hello World!</h1> </body> </html>
Styrker og svagheder ved Java • Styrker: • God performance. Servlets har ikke samme invokerings overhead som CGI har, og er ikke et scriptsprog som ASP eller PHP (meget lig ASP.NET med dets CLR) • Platforms uafhængigt: kan kører på LINUX, UNIX, PC, MVS, og mange, mange andre platforme • God skalerbarhed: Servlets kan håndtere mere end et request ad gangen (indbygget tråd understøttelse) • Høj udviklingshastighed: ekstremt let at lære for Java programmører – (næsten) alle øvrige Java teknologier kan anvendes (JDBC, JPA, EJB, RMI, CORBA) • Omfattende API – som nævnt herover – alle Java API’er kan anvendes ved internetprogrammering • Smukt sprog: ægte objektorienteret = nemt at lave ”pæn” arkitektur, bruge polymorfi m.v. (næsten det vigtigste)
Styrker og svagheder ved Java • Svagheder: • Det er IKKE Microsoft • Internet Explorer havde tidligere 97% af markedet (2003) • ASP.NET med C# og Visual Basic er en alvorlig konkurrent • Stor base af ASP Visual Basic programmører klar til at konvertere –og KÆMPE FLOKKE af Visual Studio.NET folk • SUN har ikke kræfter nok alene til at kæmpe mod MS strømmen – (det gør de selvfølgeligt heller ikke ; ) • VM’s er ikke altid lige optimale på alle platforme • PHP og ASP.NET servere er lettilgængelige – det er Java servere ikke • Men ellers er det svært at være negativ …
Java pakker og objekter • Alting i Java består af klasser og objekter • Servlets benyttes til Webapplikationer • kan bruges til andet end HTTP kommunikation. Dette vil vi ikke gennemgå nærmere i dette kursus • Vil vil i stedet fokusere på den specialiserede pakke i Java Servlet pakken der handler om kommunkation via HTTP (altså WWW): • javax.servlet.http
Servlet Containers • Servlet Containers (Servlet Engines) • F.eks. Apache Tomcat • Leverer et servlet runtime environment - en Servlet Container • Varetager alt i en servlets livsforløb • Sørger for at omdirigere HTTP requests til den rette servlet • Denne styring foregår via Interface Servlet • I pakken javax.servlet • Denne SKAL implementeres af alle servlets • Servlet metoderne bliver automatisk kaldt af containeren (i vores tilfælde Tomcat)
Livscyklus for en servlet • Servlet Container kontrollerer livscyklus • Starter med at kalde metoden “init” når den loades første gang • Dvs. ved første HTTP request • Kalder metoden “service” ved hvert HTTP request • Servlet behandler herefter HTTP request’et • Modtager request fra ServletRequest objektet • Servlet sender svar til klient • Skriver til ServletResponse objektet • “Service” kaldes kun een gang pr. request • Kalder metoden “destroy” når servlet afsluttets • Til at frigive diverse brugte ressourcer (f.eks. DB forbindelser)
Servlet implementationer • Servlet implementationer: • GenericServlet • Package javax.servlet • Bruges til ikke web baserede servlets (jeg tror aldrig jeg har set een – er der nogen der har et godt eksempel, så sig til) • HttpServlet • Packagejavax.servlet.http • Bruges til Web-baserede servlets
HttpServlet Class • Class HttpServlet • Overskriver service metoden • Differentierer mellem HTTP get and post requests • Definerer metoderne doGet and doPost til at behandle HTTP requests • Indpakker HTTP request (der jo egentligt er en strøm af bytes = et tekst dokument) i HttpServletRequest og HttpServletResponse objekterne • Der så stiller en række metoder til rådighed hvormed vi kan udtrække data, og manipulere med HTTP response dokumentet, der i sidste ende er det som brugeren præsenteres for • Der er fire andre metoder på HTTPServlet klassen der ikke gennemgås her
HttpServletRequest Interface • Interface HttpServletRequest • Oprettes af servlet containeren og sendes til “service” metoden • Der af HttpServlet videresendes til doGet eller doPost • Indeholder klient request og request behandlings metoder • Udover doGet og doPost listes på næste side yderligere metoder, men de gennemgås først senere ved eksempel
HttpServletResponse Interface • Interface HttpServletResponse • Oprettes af Servlet Containeren og sendes til service metoden • Der af HttpServlet videresendes til doGet eller doPost • Leverer metoder til at producere et svar (response) der bliver til HTTP response dokumentet, der endeligt havner i f.eks. browseren til rendering • Yderligere metoder listes på næste side til senere opslag, men gennemgås først senere ved eksempel
FORM og server-side scripting Bruger indtaster data i form feltet i browser og taster submit: http://feedbackForm.htm Webserver findes via IP adresse & DNS Lytter på port f.eks. 80 1 HTTP Request (over TCP/IP) GET /feedback (Java servlet) 2 Webserveren modtager requestet: sender det videre til ServletContaineren, der opretter bl.a. HttpServletRequest og HttpServletResponse. Parametre hentes fra HttpServletRequest og der skrives til response En typisk Header kunne se ud som følger: HTTP/1.0 200 OK Server: Netscape-Communications/1.1 Date: Tuesday, 25-Nov-97 01:22:04 GMT Last-modified: Thursday, 20-Nov-97 10:44:53 GMT Content-length: 6372 Content-type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <HTML> ... her følger resten af dokumentet 3 Browseren modtager response: Renderer HTML dokumentet til brugervenlig form
HTTP GET request med data • Håndtering af HTTP Requests med Data • Http request følger formatet: • Servlet_url?query_string • Query string format: • Parameter_name=value (kaldet name/value par) • Name/value par separeres med ”&” tegnet • Eksempel: • \feedback?navn=Stefan&stilling=lektor
Obtain the parameter from the request and assign the value to a string. 1 // Fig. 9.12: WelcomeServlet2.java 2 // Processing HTTP get requests containing data. 3 package com.deitel.advjhtp1.servlets; 4 5 import javax.servlet.*; 6 import javax.servlet.http.*; 7 import java.io.*; 8 9 public class WelcomeServlet2 extends HttpServlet { 10 11 // process "get" request from client 12 protected void doGet( HttpServletRequest request, 13 HttpServletResponse response ) 14 throws ServletException, IOException 15 { 16 String firstName = request.getParameter( "firstname" ); 17 18 response.setContentType( "text/html" ); 19 PrintWriter out = response.getWriter(); 20 21 // send XHTML document to client 22 23 // start XHTML document 24 out.println( "<?xml version = \"1.0\"?>" ); 25 26 out.println( "<!DOCTYPE html PUBLIC \"-//W3C//DTD " + 27 "XHTML 1.0 Strict//EN\" \"http://www.w3.org" + 28 "/TR/xhtml1/DTD/xhtml1-strict.dtd\">" ); 29 30 out.println( 31 "<html xmlns = \"http://www.w3.org/1999/xhtml\">" ); 32 33 // head section of document 34 out.println( "<head>" ); WelcomeServlet2.java1) Hent fornavnsparameter 2) Skriv et XHTML response til repsonse Writer objektet
Include the value in the response. 35 out.println( 36 "<title>Processing get requests with data</title>" ); 37 out.println( "</head>" ); 38 39 // body section of document 40 out.println( "<body>" ); 41 out.println( "<h1>Hello " + firstName + ",<br />" ); 42 out.println( "Welcome to Servlets!</h1>" ); 43 out.println( "</body>" ); 44 45 // end XHTML document 46 out.println( "</html>" ); 47 out.close(); // close stream to complete the page 48 } 49 } WelcomeServlet2.java
1 <?xml version ="1.0"?> 2 <!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Strict//EN" 3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 4 5 <!-- Fig. 9.13: WelcomeServlet2.html --> 6 7 <html xmlns ="http://www.w3.org/1999/xhtml"> 8 <head> 9 <title>Processing get requests with data</title> 10 </head> 11 12 <body> 13 <form action ="/advjhtp1/welcome2"method ="get"> 14 15 <p><label> 16 Type your first name and press the Submit button 17 <br /><input type ="text"name = "firstname"/> 18 <input type = "submit"value ="Submit" /> 19 </p></label> 20 21 </form> 22 </body> 23 </html> WelcomeServlet2.htmlDenne side indeholder et form element der tager “firstname” og sender etGET request til vores Servlet vi ser at firstname overføres i URL’en med værdien Paul
Redirect af HTTP Requests • Redirection • Tillader en Servlet at redirecte et request via • Metoden sendRedirect på HttpServletResponse • Smart til: • Kontrolklasser (Dispatcher Servlets) • kontrol logik, der • leder og fordeler (dispatcher) • Pattern: Frontcontroller
Obtain the page parameter for redirection location. Redirect user to another page or servlet. 1 // Fig. 9.18: RedirectServlet.java 2 // Redirecting a user to a different Web page. 3 package com.deitel.advjhtp1.servlets; 4 5 import javax.servlet.*; 6 import javax.servlet.http.*; 7 import java.io.*; 8 9 public class RedirectServlet extends HttpServlet { 10 11 // process "get" request from client 12 protected void doGet( HttpServletRequest request, 13 HttpServletResponse response ) 14 throws ServletException, IOException 15 { 16 String location = request.getParameter( "page" ); 17 18 if ( location != null ) 19 20 if ( location.equals( "deitel" ) ) 21 response.sendRedirect( "http://www.deitel.com" ); 22 else 23 if ( location.equals( "welcome1" ) ) 24 response.sendRedirect( "welcome1" ); 25 26 // code that executes only if this servlet 27 // does not redirect the user to another page 28 29 response.setContentType( "text/html" ); 30 PrintWriter out = response.getWriter(); 31 32 // start XHTML document 33 out.println( "<?xml version = \"1.0\"?>" ); RedirectServlet.javaDefine Servlet RedirectServletProcess get request
34 35 out.println( "<!DOCTYPE html PUBLIC \"-//W3C//DTD " + 36 "XHTML 1.0 Strict//EN\" \"http://www.w3.org" + 37 "/TR/xhtml1/DTD/xhtml1-strict.dtd\">" ); 38 39 out.println( 40 "<html xmlns = \"http://www.w3.org/1999/xhtml\">" ); 41 42 // head section of document 43 out.println( "<head>" ); 44 out.println( "<title>Invalid page</title>" ); 45 out.println( "</head>" ); 46 47 // body section of document 48 out.println( "<body>" ); 49 out.println( "<h1>Invalid page requested</h1>" ); 50 out.println( "<p><a href = " + 51 "\"servlets/RedirectServlet.html\">" ); 52 out.println( "Click here to choose again</a></p>" ); 53 out.println( "</body>" ); 54 55 // end XHTML document 56 out.println( "</html>" ); 57 out.close(); // close stream to complete the page 58 } 59 } RedirectServlet.javaCreate error page
Send get request to RedirectServlet with the page parameter. 1 <?xml version ="1.0"?> 2 <!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Strict//EN" 3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 4 5 <!-- Fig. 9.19: RedirectServlet.html --> 6 7 <html xmlns = "http://www.w3.org/1999/xhtml"> 8 <head> 9 <title>Redirecting a Request to Another Site</title> 10 </head> 11 12 <body> 13 <p>Click a link to be redirected to the appropriate page</p> 14 <p> 15 <a href = "/advjhtp1/redirect?page=deitel"> 16 www.deitel.com</a><br /> 17 <a href = "/advjhtp1/redirect?page=welcome1"> 18 Welcome servlet</a> 19 </p> 20 </body> 21 </html> RedirectServlet.html
Session Tracking • Session Tracking • HTTP er en “stateless” protokol • Der er altså INGEN sammenhæng mellem to handlinger en bruger måtte udføre fra en browser • Ønskes der f.eks. et beskyttet lukket lag … • Så skal der bruges brugernavn og evt. password • Men da der ikke er nogen state indbygget i HTTP • Så er vi nødt til at skabe det eksplicit • Servlets har forskellige teknologier til dette • der er styret af Servlet Containeren
Session Tracking • Tracking teknologier • Cookies • De fleste browsere understøtter Cookies, information der lagres på klientens harddisk og medsendes ved kommunikation • Session tracking • Understøttes automatisk i JSP sider • URL rewriting • Vi sender et unik ID med i URL parameterne (WAP applikationer) • Hidden form elements • Kan bruges til at fastholde information mellem request’s
Cookies • Cookies • Små tekst data filer • Kan bruges til at gemme information på tværs af HTTP kald • f.eks. til identificere en tidligere bruger for server-side programmer, som f.eks. en Servlet • Sendes og hentes i HTTP headeren • Lever i en browser session eller en angivet maks. alder • hvorefter den slettes • Problem med at en bruger kan slå “cookies” fra • så er vi på spanden (alvorligt)
Session Tracking med HttpSession • HttpSession interface • Bruges til at styre en session • En session svarer typisk til en brugers almindelige interaktion med en Web-applikation – dvs. en “normal” anvendelses situation • Derfor indbygget automatik • En session lever I serverens hukommelse • Der tildeles et unikt ID til en bruger • Der kan gemmes name/value par, kaldet attributes • Værdier er Java objekter • MEGET smart, da der kan laves objekter der er unikke for netop denne bruger, og netop den session han befinder sig i. • Udløber når: • Browser session slutter (brugeren lukker sin browser) • Session har timeout (i forhold til sidste HTTP request) • Servlet invalidated (via kald til invalidate) – f.eks. “log ud” • Servlet container nedlukkes (Tomcat)
Hent det eksisterende session objekt. Hvis den ikke findes, opret en ny. 1 // Fig. 9.25: SessionServlet.java 2 // Using HttpSession to maintain client state information. 3 package com.deitel.advjhtp1.servlets; 4 5 import javax.servlet.*; 6 import javax.servlet.http.*; 7 import java.io.*; 8 import java.util.*; 9 10 public class SessionServlet extends HttpServlet { 11 private final Map books = new HashMap(); 12 13 // initialize Map books 14 public void init() 15 { 16 books.put( "C", "0130895725" ); 17 books.put( "C++", "0130895717" ); 18 books.put( "Java", "0130125075" ); 19 books.put( "VB6", "0134569555" ); 20 } 21 22 // receive language selection and create HttpSession object 23 // containing recommended book for the client 24 protected void doPost( HttpServletRequest request, 25 HttpServletResponse response ) 26 throws ServletException, IOException 27 { 28 String language = request.getParameter( "language" ); 29 30 // Get the user's session object. 31 // Create a session (true) if one does not exist. 32 HttpSession session = request.getSession( true ); 33 34 // add a value for user's choice to session SessionServlet.javaDefine Servlet SessionServlet
Deployment af Web-applikationer • Web-applikationer (defineret sidste gang) • Kan i Java verdenen bestå af JSPer og servlets • Der er en given mappe struktur, der i øvrigt er standardiseret i J2EE og er derfor “næsten” ens på tværs af forskellige Servlet Containers • Der kan bruges Web Application Archive (WAR) • Hvilket næsten alle udviklingsværktøjer kan generere • Eller filerne kan lægges direkte i en mappe struktur • Hvilket vi vil gøre af hensyn til forståelsen • Der kan konfigureres vha. konfigurations filerne • Server.xml • Opretter Web Applikationer (context) • Web.xml • Mapper servlet navn og placering • Definerere URL mønstre
1 <!-- Advanced Java How to Program JSP/servlet context --> 2 <Context path ="/advjhtp1" 3 docBase ="webapps/advjhtp1" 4 reloadable ="true"> 5 </Context> server.xml I filen “server.xml” styres overordnet hvilke Web applikationer der er deployeret på serveren. Hver “Web-applikation” får sin egen “context”, herunder en “rod” eller “doucment base” (docBase) Hvorfra alle stier er relative internt i applikationen.
Maps a servlet name to its fully qualified class name. 1 <!DOCTYPE web-app PUBLIC 2 "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" 3 "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"> 4 5 <web-app> 6 7 <!-- General description of your Web application --> 8 <display-name> 9 Advanced Java How to Program JSP 10 and Servlet Chapter Examples 11 </display-name> 12 13 <description> 14 This is the Web application in which we 15 demonstrate our JSP and Servlet examples. 16 </description> 17 18 <!-- Servlet definitions --> 19 <servlet> 20 <servlet-name>welcome1</servlet-name> 21 22 <description> 23 A simple servlet that handles an HTTP get request. 24 </description> 25 26 <servlet-class> 27 com.deitel.advjhtp1.servlets.WelcomeServlet 28 </servlet-class> 29 </servlet> 30 31 <!-- Servlet mappings --> 32 <servlet-mapping> 33 <servlet-name>welcome1</servlet-name> Web.xmlHver Web Applikation har i sin “context” et konfigurationsscript som kun gælder for netop denne kontekst. Det er filen “Web.xml”. Her opsættes detaljer om alle servlets applikationen anvender
34 <url-pattern>/welcome1</url-pattern> 35 </servlet-mapping> 36 37 </web-app> Web.xmlfortsatUnder ”mappings” knytter man en given servlet med en relativ sti, eller et mønster, der svarer til URL relativt til document base.Der kan opsættes mange andre parametre i dette katalog, som f.eks. Timeout for sessionen m.v. Map servlet to URL pattern. The pattern is relative to the server address and application context root.