Documente Academic
Documente Profesional
Documente Cultură
2008-2009
1/14
4/11/2009
2009_TPI_Lab_4_vers01.htm
Catedra de Telecomunicatii
SwRTc ISw
POO an II
ISC an IV
11/04/2009
2008-2009
2/14
4/11/2009
2009_TPI_Lab_4_vers01.htm
- comentarii SGML (HTML, WML, XML), care ajung in paginile generate dinamic:
<!-- Comentariu HTML -->
2008-2009
3/14
4/11/2009
2009_TPI_Lab_4_vers01.htm
Elementele constitutive ale sintaxei JSP sunt tiparul (template text HTML, WML, XML) si elementele JSP: - directivele, - elementele de scripting si - actiunile (vezi si JSP Quick Reference Card). Directivele sunt elemente JSP care furnizeaza informatii globale pentru faza de translatie (se adreseaza containerului). De exemplu, directiva page specifica atribute ale paginii generate, cum ar fi bibliotecile importate sau tipul de continut generat.
<%-- import clasa biblioteca --%> <%@ page import=java.util.Date %> <%-- tip de continut generat --%> <%@ page contentType=text/html %>
Directiva include specifica includerea continutului unui fisier in continutul celui curent in faza de translatie (anterioara compilarii):
<%-- includere continut fisier --%> <%@ include file=altJSP.jsp %>
Elementele JSP, inclusiv directivele, pot fi specificate si folosind sintaxa echivalenta de tip XML:
<%-- includere continut fisier format XML --%> <jsp:directive.include file=altJSP.jsp %>
Actiunile sunt elemente JSP care furnizeaza informatii pentru faza de executie (se adreseaza containerului). De exemplu, actiunea include specifica includerea continutului unui fisier in continutul celui curent in faza de executie (dupa compilare):
<%-- includere continut fisier in timpul executiei --%> <jsp:include page=altJSP.jsp %>
Actiunea useBean conduce la instantierea unui obiect dintr-o clasa JavaBean (cu rol de helper, model, etc.) specificata (prin class) si cu nume al referintei specificat (prin id) care va putea fi utilizat apoi prin intermediul referintei:
<%-- instantiere obiect JavaBean --%> <jsp:useBean id=orar class=model.Orar %>
Elementele de scripting sunt elemente JSP cu ajutorul carora se include cod Java in pagina (urmand ca acesta sa ajunga nemodificat in codul servletului obtinut prin translatie). Exista 3 categorii de astfel de elemente: - declaratiile, - expresiile si - scriptlet-urile. Declaratiile introduc metode (situatie rar intalnita) si campuri (variabile instanta - care nu sunt thread safe) ale servlet-ului (sintaxa include caracterul ! care poate fi interpretat ca atentie):
<%-- declaratie variabila instanta a servlet-ului --%> <%! private String s; %> <%-- declaratie metoda a servlet-ului --%> <%! public String getS() {return s;} %>
2008-2009
4/14
4/11/2009
2009_TPI_Lab_4_vers01.htm
Expresiile Java ajung sa fie evaluate in codul servlet-ului obtinut prin translatie (spre deosebire de declaratii si scrptlets, sintaxa nu include caracterul ;):
<%-- expresie --%> <%= 2*a*b %>
Un scriptlet este o secventa de instructiuni Java care ajung sa fie incluse nemodificate in codul servlet-ului obtinut prin translatie (variabilele declarate in interiorul lor sunt locale):
<%-- scpriptlet --%> <% String user = null; // variabila locala username = request.getParameter("user"); // request este un obiect implicit %>
Servlet-urile si JSP-urile pot delega executia catre alte servlet-uri si JSP-uri folosind interfata RequestDispatcher si o sintaxa de genul:
RequestDispatcher view = request.getRequestDispatcher("pagina.jsp"); view.forward(request, response);
Pentru a-si transmite informatii in astfel de situatii, servlet-urile si JSP-urile care deleaga executia pot crea atribute ale cererii (in cazul JSP-ului obiectul implicit numit request, in cazul servlet-ului obiectul request de tip HTTPServletRequest) carora le dau valori:
request.setAttribute("raspuns", "Comanda a fost trimisa");
Servlet-urile si JSP-urile carora li se deleaga executia pot obtine valorile acestor atribute:
String raspuns = request.getAttribute("raspuns");
2008-2009
5/14
4/11/2009
2009_TPI_Lab_4_vers01.htm
O forma de delegare a sarcinilor de stocare si prelucrare catre coduri Java a fost folosita si in cazul aplicatiei Web cu servlet-uri de la laboratorul anterior (clasa Orar incorporand parte din prelucrarea si stocarea datelor). Aceasta arhitectura este potrivita pentru aplicatii Web mici. Pentru aplicatii Web mari sunt necesare o mai buna gestiune a sistemului, o mai buna separare a responsabilitatilor de dezvoltare si o mai buna specializare a tehnologiilor utilizate. Acest avans a fost obtinut prin introducerea arhitecturii care poarta numele de model-2 sau MVC (model-viewcontroler) in care se folosesc 3 categorii de componente realizate cu tehnologii diferite: - controlerul (realizat in general cu un servlet) primeste cererile, apeleaza la model pentru a realiza actualizarea datelor de stare si prelucrarile necesare aplicatiei, si in final deleaga prezentarea catre componente specializate - modelul (realizat sub forma de componente JavaBeans) se ocupa de pastrarea datelor (starii) si de prelucrarile necesare, - view-ul este format din componente de prezentare (in general pagini JSP) care sunt folosite pentru a genera continutul raspunsului.
Dezvoltarea unei astfel de aplicatii poate fi realizata modular de catre - specialisti in servlet-uri, - specialisti in proiectare Web si scripting JSP (inclusiv utilizare si dezvoltare de biblioteci de tag-uri) si - specialisti in proiectare si programare OO (orientata spre obiecte).
2008-2009
6/14
4/11/2009
2009_TPI_Lab_4_vers01.htm
In laborator:
1. Se deschide NetBeans IDE. Se sterg toate proiectele anterior deschise, cu click dreapta in fereastra Projects pe nodul fiecarui proiectul, selectand apoi Delete, si confirmand ca doriti sa fie sterse sursele Java. 2. Se creaza un nou proiect cu File > New Project... (sau Ctrl-Shift-N). 3. La Categories se selecteaza Web, la Projects se selecteaza Web Application, si se apasa Next. 4. La Project Name se scrie numele ales pentru noul proiect, AplicatieOrar2, la Project Location se selecteaza subdirectorul corespunzator serie, grupei si subgrupei proprii (calea va fi de genul: D:\TPI\seriaD\434\pare). Se apasa Next. 5. La Server se selecteaza Apache Tomcat 6.0.16. Se apasa Finish.
2008-2009
7/14
4/11/2009
2009_TPI_Lab_4_vers01.htm
Se poate observa ca Orar face parte dintr-un pachet de clase intitulat model si implementeaza interfata Serializable (asa incat starea obiectelor Orar poate fi persistata local sau poate fi transferata in retea folosind RMI). In laborator:
1. Se adauga un nou fisier sursa cu File > New File... (sau Ctrl- N). 2. In zona Categories se selecteaza JavaBeans Objects, in zona FileTypes se selecteaza JavaBeans Component. Se apasa Next. 3. In zona.in zona Class Name se scrie numele Orar, in zona Package se scrie numele model. 4. Se inlocuieste codul generat automat cu codul de mai sus.
O pagina JSP (PaginaJSP.jsp) care sa permita accesul la obiecte Orar si sa realizeze sarcinile aplicatiei (pastrand pe cat posibil formatul de la lucrarea anterioara) ar putea fi organizata astfel: - un template (formularul pentru acces) preluat din continutul paginii HTML, care reprezinta partea statica, - obiectul clasei Orar, care este instantiat cu ajutorul unei actiuni JSP si accesibil la nivel de sesiune (efectul fiind similar utilizarii HTTPSession), - un scriptlet care decide si genereaza continut dinamic ca efect al accesului prin formular,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h1>Pagina JSP acces orar (Model 1)</h1> <hr><form name="input" action="PaginaJSP.jsp" method="get"> <input type="radio" name="zi" checked="checked" value="0"> Luni <br> <input type="radio" name="zi" value="1"> Marti <br> <input type="radio" name="zi" value="2"> Miercuri <br> <input type="radio" name="zi" value="3"> Joi <br> <input type="radio" name="zi" value="4"> Vineri <br> <input type="radio" name="zi" value="5"> Sambata <br> <input type="radio" name="zi" value="6"> Duminica <hr> <input type="radio" name="serviciu" checked="checked" value="getOrar"> Obtinere orar <br><input type="radio" name="serviciu" value="setOrar"> Modificare orar <input type="text" name="modificare" value=""> <input type="submit" value="Trimite"> </form> <hr> <jsp:useBean scope="session" id="orar" class="model.Orar" /> <% try { int zi = Integer.parseInt(request.getParameter("zi")); // Daca serviciul cerut e obtinere orar if (request.getParameter("serviciu").equals("getOrar")) { out.println("<b>Orarul cerut:</b> <br>" + orar.getOrar(zi)); } // Daca serviciul cerut e modificare orar else if (request.getParameter("serviciu").equals("setOrar")) { String modificare = request.getParameter("modificare"); orar.setOrar(zi, modificare); out.println("<b>Modificarea ceruta:</b> <br>" + orar.getOrar(zi)); } } catch (NumberFormatException ex) {} %> </body> </html>
2008-2009
8/14
4/11/2009
2009_TPI_Lab_4_vers01.htm
Pagina JSP se auto-refera, asa incat in cazul primei accesari (deoarece nu a fost in prealabil selectata nici o zi) este necesara tratarea exceptia de tip NumberFormatException. De asemenea, nu mai este necesara existenta unei pagini HTML care sa contina formularul pentru accesul la servlet (acesta facand parte din pagina JSP). In laborator:
1. Se adauga un nou fisier sursa cu File > New File... (sau Ctrl- N). 2. In zona Categories se selecteaza Web si in zona FileTypes se selecteaza JSP. Se apasa Next. 3. In zona JSP File Name se scrie numele PaginaJSP. Se apasa Next. 4. Se inlocuieste codul generat automat pentru PaginaJSP.jsp cu codul de mai sus. 5. Se inlocuieste codul generat automat al fisierului index.jsp cu codul de mai jos.
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h1>Pagina Index</h1> <hr> <a href="PaginaJSP.jsp">Pagina JSP initiala (Model 1)</a> <hr> </body> </html>
In laborator:
1. Se selecteaza Build Project pe nodul proiectului AplicatieOrar2. 2. Se selecteaza Run Project pe nodul proiectului AplicatieOrar2. 3. Se utilizeaza pagina in diverse moduri, testand serviciile obtinere si modificare.
2008-2009
9/14
4/11/2009
2009_TPI_Lab_4_vers01.htm
package controler; import model.Orar; import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; public class ServletControler extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Transformarea obiectului orar in atribut al sesiunii curente pentru // salvarea starii lui HttpSession ses = request.getSession(); Orar orar = (Orar) ses.getAttribute("orar"); if (orar == null) { // Daca nu exista orarul salvat ca atribut al sesiunii orar = new Orar(); ses.setAttribute("orar", orar); } // Obtinerea parametrilor introdusi de utilizator in formular int zi = Integer.parseInt(request.getParameter("zi")); RequestDispatcher view; // Daca serviciul cerut e obtinere orar if (request.getParameter("serviciu").equals("getOrar")) { view = request.getRequestDispatcher("RezultatObtinereOrar.jsp"); } // Daca serviciul cerut e modificare orar else if (request.getParameter("serviciu").equals("setOrar")) { String modificare = request.getParameter("modificare"); orar.setOrar(zi, modificare); view = request.getRequestDispatcher("RezultatModificareOrar.jsp"); } // Daca serviciul cerut nu e recunoscut else { view = request.getRequestDispatcher("ServiciuNeimplementat.jsp"); } request.setAttribute("raspuns", orar.getOrar(zi)); view.forward(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } }
In laborator:
1. Se adauga un nou fisier sursa cu File > New File... (sau Ctrl- N). 2. In zona Categories se selecteaza Web si in zona FileTypes se selecteaza Servlet. Se apasa Next. 3. In zona Class Name se scrie numele ServletControler, in zona Package se pastreaza numele controler. Se apasa Next. 4. La Configure Servlet Deployment se precizeaza numele intern (Servlet Name) ca fiind servlet iar adresa URL (URL Pattern) ca fiind /orar.do. Se apasa Finish. 5. Se inlocuieste codul generat automat pentru ServletControler cu codul de mai sus.
2008-2009
10/14
4/11/2009
2009_TPI_Lab_4_vers01.htm
Va fi adaugata o pagina HTML (PaginaHTMLAcces) care contine formularul pentru accesul la servletul controler, reutilizabil si in paginile JSP (prin includere): In laborator:
1. Se adauga un nou fisier sursa cu File > New File... (sau Ctrl- N). 2. In zona Categories se selecteaza Web si in zona FileTypes se selecteaza HTML, se apasa Next. 3. In zona.in zona HTML File Name se scrie numele PaginaHTMLAcces (iar in zona Location se selecteaza Web Pages). 4. Se inlocuieste codul generat automat cu codul de mai jos.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Acces orar</title> </head> <body> <h1>Formular HTML acces orar</h1> <hr><form name="input" action="orar.do" method="get"> <input type="radio" name="zi" checked="checked" value="0"> Luni <br> <input type="radio" name="zi" value="1"> Marti <br> <input type="radio" name="zi" value="2"> Miercuri <br> <input type="radio" name="zi" value="3"> Joi <br> <input type="radio" name="zi" value="4"> Vineri <br> <input type="radio" name="zi" value="5"> Sambata <br> <input type="radio" name="zi" value="6"> Duminica <hr><input type="radio" name="serviciu" checked="checked" value="getOrar"> Obtinere orar <br> <input type="radio" name="serviciu" value="setOrar"> Modificare orar <input type="text" name="modificare" value=""> <input type="submit" value="Trimite"> </form><hr> </body> </html>
In laborator:
1. Se inlocuieste codul generat automat al fisierului index.jsp cu codul de mai jos.
<%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h1>Pagina Index</h1> <hr> <a href="PaginaJSP.jsp">Pagina JSP initiala (Model 1)</a> <hr> <a href="PaginaHTMLAcces.html">Formular HTML acces orar (Model 2) </a> <hr> </body> </html>
Acum vor fi adaugate paginile JSP care vor include formularul pentru accesul la servlet, cate una pentru fiecare dintre cele 3 cazuri: - daca serviciul cerut e obtinere orar (RezultatObtinereOrar) In laborator:
1. Se adauga un nou fisier sursa cu File > New File... (sau Ctrl- N). 2. In zona Categories se selecteaza Web si in zona FileTypes se selecteaza JSP. Se apasa Next. 3. In zona JSP File Name se scrie numele RezultatObtinereOrar. Se apasa Next. 4. Se inlocuieste codul generat automat cu codul de mai jos.
2008-2009
11/14
4/11/2009
2009_TPI_Lab_4_vers01.htm
<%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <%@ include file="PaginaHTMLAcces.html" %> <b>Orarul cerut:</b> <br> <%=request.getAttribute("raspuns")%> </body> </html>
Directiva include specifica includerea statica a continutului unui fisier (JSP sau HTML) in continutul celui curent in faza de translatie (anterioara compilarii):
<%-- includere continut fisier statica (in timpul translatiei sau compilarii) --%> <%@ include file=altJSP.jsp %>
2008-2009
12/14
4/11/2009
2009_TPI_Lab_4_vers01.htm
In laborator:
1. Se selecteaza Build Project pe nodul proiectului AplicatieOrar2. 2. Se selecteaza Run Project pe nodul proiectului AplicatieOrar2. 3. Se utilizeaza pagina in diverse moduri, testand serviciile obtinere si modificare.
In codurile de mai sus se regasesc avantajele arhitecturii MVC si sunt exemplificate mai multe elemente sintactice si mecanisme oferite de paginile JSP (delegare servlet catre JSP, includere de continut static, etc.).
- si de la servlet-ul creat ca tema de casa dupa modelul de la lucrarea trecuta (ServletOrarFinal), - va continua dezvoltarea aplicatiei Web - prin adaugarea unor noi servleturi, pagini JSP si elemente de model, si - prin reorganizarea codului pe model 1 sau 2, in directia crearii unui magazin virtual, adaugand noi servicii cum ar fi: selectarea unor produse, configurarea parametrilor unor produse, crearea unui cos de produse, etc.)
2008-2009
13/14
4/11/2009
2009_TPI_Lab_4_vers01.htm
Anexa
1. Resurse suplimentare privind JSP-urile (si NetBeans IDE)
De la www.javapassion.com (Java EE Programming (with Passion!)): LAB-4003: JSP Basics (arhiva 4003_jspbasics.zip) LAB-4008: JSP 2.0 Custom Tags (arhiva 4008_jsp20tags.zip) LAB-4015: JSTL (JSP Tag Library) (arhiva 4015_jstlexamples.zip) LAB-4016 Building Bookstore Sample Apps (arhiva 4016_jspbookstore.zip)
2008-2009
14/14
4/11/2009
2009_TPI_Lab_4_vers01.htm
out.write("\n"); out.write("\n"); out.write("\n"); out.write("<html>\n"); out.write(" <head>\n"); out.write(" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n"); out.write(" <title>JSP Page</title>\n"); out.write(" </head>\n"); out.write(" <body>\n"); out.write(" "); out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n"); out.write("<html>\n"); out.write(" <head>\n"); out.write(" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n"); out.write(" <title>Acces orar</title>\n"); out.write(" </head>\n"); out.write(" <body>\n"); out.write(" <h1>Formular HTML acces orar</h1>\n"); out.write(" <hr><form name=\"input\" action=\"orar.do\" method=\"get\">\n"); out.write(" <input type=\"radio\" name=\"zi\" checked=\"checked\" value=\"0\"> Luni\n"); out.write(" <br> <input type=\"radio\" name=\"zi\" value=\"1\"> Marti\n"); out.write(" <br> <input type=\"radio\" name=\"zi\" value=\"2\"> Miercuri\n"); out.write(" <br> <input type=\"radio\" name=\"zi\" value=\"3\"> Joi\n"); out.write(" <br> <input type=\"radio\" name=\"zi\" value=\"4\"> Vineri\n"); out.write(" <br> <input type=\"radio\" name=\"zi\" value=\"5\"> Sambata\n"); out.write(" <br> <input type=\"radio\" name=\"zi\" value=\"6\"> Duminica\n"); out.write("<hr><input type=\"radio\" name=\"serviciu\" checked=\"checked\" value=\"getOrar\"> \n"); out.write(" Obtinere orar\n"); out.write(" <br> <input type=\"radio\" name=\"serviciu\" value=\"setOrar\"> Modificare orar\n"); out.write(" <input type=\"text\" name=\"modificare\" value=\"\">\n"); out.write(" <input type=\"submit\" value=\"Trimite\">\n"); out.write(" </form><hr>\n"); out.write(" </body>\n"); out.write("</html>\n"); out.write(" \n"); out.write(" \n"); out.write(" <b>Orarul cerut:</b> <br> "); out.print(request.getAttribute("raspuns")); out.write("\n"); out.write(" </body>\n"); out.write("</html>\n"); } catch (Throwable t) { if (!(t instanceof SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) out.clearBuffer(); if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); } } finally { if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context); } } }