Java & het Web Programma: De essentie van een web applicatie (webapp) Protocol van een webapp Talen van het web Java Servlets & Containers
Java & het Web Het web is essentieel onderdeel van ons leven geworden.... Veel gehoorde technische termen: HTML, CSS, webserver, database, browser, security, xslt, XML, HTTP En Java......wat voor rol speelt Java hier in?
Wat gebeurt er...conceptueel
HTTP....wat is dat(1)? Het World Wide Web communiceert via het HTTP netwerk protocol. Dat staat voor Hyper Text Transfer Protocol. Dit protocol is beschrijft hoe clients (bijv. browsers) 'praten' met (web)servers. HTTP is een request/response protocol, d.w.z. de client verstuurt een request voor een resource (bijv. een html pagina) en de server antwoord met een response.
HTTP....wat is dat(2)? HTTP is een stateless protocol (i.t.t. stateful)! Bij elk request is de client een voor de server!! Dit is lastig bij bijv. winkelwagen: je wilt tussen verschillende requests door bijhouden wie de client is! Oplossing: HTTP sessie, cookies, URL rewriting
HTTP....wat is dat(3)? HTTP kent verschillende methodes waarmee een request gedaan kan worden: -GET Belangrijk!! -POST Belangrijk!! -PUT -DELETE -TRACE -HEAD Heel soms handig! -OPTIONS -CONNECT
HTTP....wat is dat(4)? GET Alleen voor het opvragen van een resource. Een GET is (zou moeten zijn) IDEMPOTENT. D.w.z. dat het request GEEN 'neven effecten' mag hebben (bijv. update database) POST Is NIET idempotent. Toestand van server + achterliggende systemen hoeft niet hetzelfde te zijn voor en na de POST. Wordt gebruikt voor formulieren.
HTTP get....wat is dat(1)? GET request: GET /services/csp/policy?build=2929 HTTP/1.1 Host: addons.mozilla.org User-Agent: Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/ Firefox/4.0.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*; q=0.8 --> Content-Type response Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip, deflate Accept-Charset: ISO ,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 Connection: keep-alive
HTTP get....wat is dat(2)? GET request: Heeft geen body, dus kan niet veel gebruikers data niet de server (hangt af van client/server) data verzenden kan alleen via URL, dus alles is zichtbaar (dus geen wachtwoord via GET versturen)! Is (zou moeten zijn) IDEMPOTENT Kan "gebookmarked" worden
HTTP post....wat is dat(1)? POST request: POST /stat HTTP/1.1 Host: docs.google.com User-Agent: Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/ Firefox/4.0.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*; q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip, deflate color=red&taste=bitter --> message body
HTTP post....wat is dat(2)? POST request: Heeft een body via welke de gebruikers data wordt verstuurd. Onbeperkt in lengte Formulier (=POST) kan niet "gebookmarked" worden. Is NIET idempotent (=kan 'bij effecten hebben')
HTTP response....wat is dat(1)? HTTP response: HTTP/ OK Cache-Control: no-cache, no-store, max-age=0, must- revalidate Pragma: no-cache Expires: Fri, 01 Jan :00:00 GMT Date: Wed, 08 Jun :05:20 GMT Content-Type: text/javascript --> Accept in request Content-Encoding: gzip X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block Content-Length: 420
Waar zit de Java (1)? Er zijn verschillende soorten webservers, bijvoorbeeld: -Apache (statische HTML, PHP, Ruby.....) -IIS (ASP,.NET) -Tomcat, GlassFish, WebLogic, Jonas...etc (Java) De laatsten zijn eigenlijk servletcontainers/applicatieservers welke ook als webserver kunnen fungeren. In de praktijk worden deze vaak gebruikt i.c.m. Apache
Waar zit de Java (2)? Java of PHP???? PHP: -Scripttaal, draait in interpreter -Relatief makkelijk te schrijven deployen -Open source, veel 3rd party libraries -Wat moeilijker te schalen (d.w.z. 'groter' te maken)
Waar zit de Java (3)? Java: -Gecompileerde taal -Type safe, fouten worden compile time ontdekt (bij PHP runtime, is daardoor lastiger te testen) -Aanvankelijk moeilijker te deployen -'Open source', veel 3rd party libraries -goed te schalen -Meer controle oer threads -mogelijkheid tot asynchrone transacties -robuuster
Waar zit de Java (4)? Java wordt gebruikt in servlet containers (bijv. Tomcat) en applicatie servers (bijv. Glassfish) Tomcat (Apache Software Foundation) is de referentie implementatie van een servlet/JSP container volgens de J2EE specification van Sun/Oracle, d.w.z. dat Tomcat de J2EE specificatie correct implementeert.
Java, belangrijke classes en aantal belangrijke Java classes en interfaces welke een centrale rol spelen in Java en het Web: -abstract class javax.servlet.http.HttpServlet -interface javax.servlet.http.HttpServletRequest -interface javax.servlet.http.HttpServletResponse -interface javax.servlet.http.HttpSession De laatste 3 zijn interfaces zodat elke servletcontainer de interfaces op zijn eigen manier kan implementeren! Het is nl. de servletcontainer die de objecten genereert die deze interfaces implementeren.
Webserver & Servletcontainer Een webserver alleen kan niet zoveel... Geen dynamische content Geen data opslag Combinatie met servlet container: Web server stuurt HTTP request door naar Tomcat. In Tomcat 'draait' een servlet (= java class) welke bepaalde functionaliteit uitvoert. Apache Servlet in Tomcat Request & Response
Een Servletcontainer Een servlet kan niet los draaien, zoals een java class met een 'main' methode. Een servlet draait in een container zoals bijv. Tomcat. De container verzorgt bepaalde diensten voor de servlet. -Wachten/genereren ServletRequest/ServletResponse -Lifecycle management -Verschaft servlet makkelijk toegang tot bepaalde resources (databases, jndi etc...)
Een Servlet Eigenschappen: Een java class die javax.servlet.http.HttpServlet extends Draait altijd in een 'container' (wordt 'ge-deployed' in een servlet container) Lifecycle van een servlet wordt geregeld door de container Wordt slecht 1 instantie van gemaakt! NIET threadsafe --> i.c.m. 1 instantie: voorzichtig met class variabelen! Override get/post methodes Wordt geconfigureerd in WEB-INF/web.xml deployment descriptor.
Servlet: een simpel voorbeeld package test; import java.io.*; import javax.servlet.http.*; import javax.servlet.*; public class HelloServlet extends HttpServlet { public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { PrintWriter out = res.getWriter(); out.println("Hello, world!"); out.close(); }
Servlet: een simpel voorbeeld De web.xml --> moet in WEB-INF hello test.HelloServlet hello /hello