INFITT01 - Internettechnologie WEEK 3
Programma Sessies JSP
Stateless vs. Stateful (1) HTTP is stateless … WAT IS STATELESS?
Server: "hi request from client X, nice to meet you" Stateless Stateless vs Stateful (2) Het draait om ‘conversational state’ Server: "hi request from client X, nice to meet you" Request van client X
Server: "hi request from client X, nice to meet you, use label 'xyz' next time you are here" Stateful Stateless vs Stateful (3) Het draait om ‘conversational state’ Server: "I see you've been here! Hello, what can I do for you again" Request van client X Request van client X met label ´xyz´
Client X doet een request P naar servlet A. Container start thread A op. In thread A wordt een attribuut in een HttpSession A gezet (bijv. het resultaat van een zoekopdracht) Client X Container HttpSession A setAttribute() HTTP session Servlet A Thread A
Thread A stuurt een response terug naar client X Client X Container HttpSession A HTTP session Servlet A Thread A
Client X doet een request Q naar servlet A. Container start thread B op. In thread B zoekt de sessie van Client X en zet een attribuut in een HttpSession A (bijv. het resultaat van een andere zoekopdracht) Client X Container HttpSession A setAttribute() HTTP session Servlet A Thread B Zelfde client, zelfde servlet, ander request, andere thread, zelfde sessie
Thread B stuurt een response terug naar client X Client Y Container HttpSession A HTTP session Servlet A Thread B In HttpSession A staan nu de resultaten (als attributen) van twee zoekopdrachten
HttpSession A Client Y doet een request R naar servlet A. Container start thread C op. In thread C zoekt de sessie van Client Y en zet een attribuut in een HttpSession B Client Y Container HttpSession B setAttribute() HTTP session Servlet A Thread C Andere client, ander request, zelfde servlet, andere thread, andere sessie
HttpSession A Client Y doet een request R naar servlet A. Container start thread C op. In thread C zoekt de sessie van Client Y en zet een attribuut in een HttpSession B Client Y Container HttpSession B setAttribute() HTTP session Servlet A Thread C Andere client, zelfde servlet, ander request, andere thread, andere sessie
HTTP session Een stateful http session kan o.a. bereikt worden door: – Session Cookies – URL rewriting
Session cookies & URL rewriting Cookies = ‘mini’ bestandje uitgewisseld tussen server en client bestaat alleen gedurende de sessie wordt door de container gebruikt voor terugvinden van sessie sessie niet meer geldig dan wordt cookie verwijderd als browser geen cookies accepteert dan URL rewriting eind van elke URL een uniek session_id geconcateneerd
HTTP session Het gebruik van cookies is heel eenvoudig: – In bijv. servlet: HttpSession session = request.getSession(); – container creëert een cookie en stuurt dit naar browser – browser stuurt (indien browser cookies accepteert) het met ieder request terug naar de server. Dit is alles, wat je NIET doet: De containter zorgt voor: – HttpSession object instantiëren – Cookie object instantiëren – Uniek sessionID genereren en aan cookie binden – Cookie in de response zetten
HTTP session Sommige gebruikers willen dat hun browser (uit veiligheid overwegingen) geen cookies accepteert. Hoe kun je nu toch een HttpSession opzetten??
HTTP session Oplossing: URL rewriting. Er wordt een uniek sessionID achter elke link geplaatst, bijv: HttpSession session = request.getSession(); out.println(" "); URL rewriting code moet je zelf toevoegen en wordt alleen door server gebruikt als cookies niet geaccepteerd worden.
HTTP session - vraag Hoe weet een container of cookies wel of niet werken en wanneer hij moet overschakelen op URL rewriting?
JSP Probleem – Opmaakcode schrijven (HTML) in een java servlet = lastig – Complexe, omvangrijke HTML (incl. CSS, Javascript, etc.) slecht leesbaar en onderhoudbaar. Een oplossing: JSP (Java Server Page) Een JSP combineert opmaakcode en java in één bron
JSP - voorbeeld Current Date time: of
JSP een JSP is eigenlijk gewoon een servlet!!!!! Bij eerste aanroep JSP (of na aanpassing JSP) – vertaalt container JSP 'MijnJSP.jsp' naar 'MijnJSP_jsp.java‘ – compileert ‘MijnJSP_jsp.java’ naar 'MijnJSP_jsp.class‘ – class geïnstantieerd tot een 'MijnJSP servlet'
JSP Wat is de javacode na vertaling van onderstaande JSP?
JSP package jsp_servlet; import java.util.*; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; import com.foo.bar; // Imported as a result of import … class _myservlet implements javax.servlet.Servlet, javax.servlet.jsp.HttpJspPage { // Inserted as a // result of int serverInstanceVariable = 1; … public void _jspService( javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response ) throws javax.servlet.ServletException, java.io.IOException { javax.servlet.ServletConfig config = …; // Get the servlet config Object page = this; PageContext pageContext = …; // Get the page context for this request
JSP javax.servlet.jsp.JspWriter out = pageContext.getOut(); HttpSession session = request.getSession( true ); try { out.print( " \r\n" ); out.print( " \r\n" ); … // From int localStackBasedVariable = 1; … out.print( " \r\n" ); … // From out.print( toStringOrBlank( "expanded inline data " + 1 ) ); … } catch ( Exception _exception ) { // Clean up and redirect to error page in … }
JSP directives: scriptlets: of expressions: wordt geconverteerd naar out.println(Counter.getCount()); declarations:
JSP Scriptlets en expressions eindigen altijd in de 'service methode' van het uiteindelijke servlet. Gedeclareerde variabelen zijn dus lokale variabelen. en eindigen als: public class … public void _jspService(HttpServletRequest …) { … int count=1; out.println(++count); }
JSP Declarations eindigen altijd als class instance variabelen eindigt als: public class MijnServlet extends … { int count =1; public void _jspService(HttpServletRequest …) { … }
JSP – impliciete objecten objecten meteen gebruiken zonder zoeken of creëren –JSPWriter - out –HttpServletRequest - request –HttpServletResponse - response –HttpSession - session –ServletContext - application –ServletConfig - config –JSPException - exception –PageContext - pageContext