Documente Academic
Documente Profesional
Documente Cultură
2009 TPI Lab 4 Vers01 PDF
2009 TPI Lab 4 Vers01 PDF
htm
Catedra de Telecomunicatii
SwRTc ISw
POO an II 11/04/2009
Laborator 4
Programarea Web utilizand tehnologia Java ServerPages (JSP)
- comentarii SGML (HTML, WML, XML), care ajung in paginile generate dinamic:
<!-- Comentariu HTML -->
Laborator TPI - 2009 (draft) 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 %>
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;} %>
Laborator TPI - 2009 (draft) 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");
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-view-
controler) 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.
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.
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.
Vom crea un servlet cu rol de controler (ServletControler), care va primi cererea HTTP (4,
5), va accesa informatiile din Orar (6) si le va pasa (8) prin intermediul unui atribut nou (7) al
cererii catre o pagina JSP (9) selectata in functie de valoarea unui parametru din formularul
cererii, pagina care va genera raspunsul catre client (10).
Laborator TPI - 2009 (draft) 2008-2009 9/14 4/11/2009 2009_TPI_Lab_4_vers01.htm
1 package controler;
2
3 import model.Orar;
4
5 import java.io.*;
6 import java.net.*;
7
8 import javax.servlet.*;
9 import javax.servlet.http.*;
10
11 public class ServletControler extends HttpServlet {
12
13 protected void processRequest(HttpServletRequest request,
14 HttpServletResponse response) throws ServletException, IOException {
15
16 // Transformarea obiectului orar in atribut al sesiunii curente pentru
17 // salvarea starii lui
18 HttpSession ses = request.getSession();
19 Orar orar = (Orar) ses.getAttribute("orar");
20 if (orar == null) { // Daca nu exista orarul salvat ca atribut al sesiunii
21 orar = new Orar();
22 ses.setAttribute("orar", orar);
23 }
24
25 // Obtinerea parametrilor introdusi de utilizator in formular
26 int zi = Integer.parseInt(request.getParameter("zi"));
27
28 RequestDispatcher view;
29
30 // Daca serviciul cerut e obtinere orar
31 if (request.getParameter("serviciu").equals("getOrar")) {
32 view = request.getRequestDispatcher("RezultatObtinereOrar.jsp");
33 }
34
35 // Daca serviciul cerut e modificare orar
36 else if (request.getParameter("serviciu").equals("setOrar")) {
37 String modificare = request.getParameter("modificare");
38 orar.setOrar(zi, modificare);
39 view = request.getRequestDispatcher("RezultatModificareOrar.jsp");
40 }
41
42 // Daca serviciul cerut nu e recunoscut
43 else {
44 view = request.getRequestDispatcher("ServiciuNeimplementat.jsp");
45 }
46
47 request.setAttribute("raspuns", orar.getOrar(zi));
48
49 view.forward(request, response);
50 }
51 protected void doGet(HttpServletRequest request, HttpServletResponse response)
52 throws ServletException, IOException {
53 processRequest(request, response);
54 }
55 protected void doPost(HttpServletRequest request, HttpServletResponse response)
56 throws ServletException, IOException {
57 processRequest(request, response);
58 }
59 }
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.
Laborator TPI - 2009 (draft) 2008-2009 10/14 4/11/2009 2009_TPI_Lab_4_vers01.htm
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>
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.
Laborator TPI - 2009 (draft) 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" %>
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 %>
Laborator TPI - 2009 (draft) 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.).
Anexa
1. Resurse suplimentare privind JSP-urile (si NetBeans IDE)
Exemple simple JSP si servlet (cod si instalare pe Tomcat): Tehnologia Java Server Pages
JSP Quick Reference Guides:
card20.pdf,
JSP Quick Reference Card.pdf
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
static {
_jspx_dependants = new java.util.ArrayList(1);
_jspx_dependants.add("/PaginaHTMLAcces.html");
}
public Object getDependants() {
return _jspx_dependants;
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
try {
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
Laborator TPI - 2009 (draft) 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);
}
}
}