Sunteți pe pagina 1din 9

Elemente de baza ale Java Server Pages

Codul de mai jos creeaza/genereaza pagina afisata in figura imediat urmatoare:


1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
2. pageEncoding="ISO-8859-1"%>
3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
4. <%@page import="java.util.Calendar"%>
5. <html>
6. <body>
7. <%
8. int val1 = 90;
9. int val2 = 136;
10. int produs = val1 * val2;
11. out.write("Produsul valorilor " + val1 + " si " + val2 + " este " +
produs);
12. %>
13. <br>
14. <%
15. String server = application.getServerInfo();
16. System.out.println(application.getRealPath(""));
17. %>
18. <p> Aplicatia ruleaza pe un server <%=server%>.</p>
19. <%
20. Calendar calendar = Calendar.getInstance();
21. int anul = calendar.get(Calendar.YEAR);
22. int luna = calendar.get(Calendar.MONTH);
23. int ziua = calendar.get(Calendar.DATE);
24. %>
25. <p><font color="BLUE"> Ne aflam in anul <%=anul%> ziua <%=ziua%> luna <%=luna
%></font></p>
26. </body>
27. </html>

JSP-urile (Java Server Pages) reprezinta o tehnologie prin intermediul carei se poate crea
un mix dintre codul Java si codul de HTML si elementele atasate acestuia (CSS,
JavaScript ect). In exemplul de mai sus avem atat cod java ( de exemplu codul care
permite aflarea elementelor datei caledaristice) cat si cod HTML (de exemplu codul <font
color="BLUE">) . Codul Java este incapsulat in tagurile de forma <% %>.

In esenta un JSP este tot un servlet. In momentul in care o pagina JSP este accesata
pentru prima data, atunci aceasta pagina va fi tranformata in codul unui servlet, de carte
Tomcat. Traducerea din JSP in cod de servlet nu se efectueaza de fiecare data cand un
JSP este accesat de catre un utilizator ci doar in momentul in care aceasta pagina este

Java Server Pages Pagina 1


aceesata prima data. Atunci cand cineva face un request catre JSP-ul in cauza se va
apela codul servletului generat, si nu codul JSP-ului.

Codul servletului care a fost generat pentru JSPuri poate fi gasit in folderul work din
rootul serverului unde se face deploy pentru aplicatie. In cazul de fata codul pentru
servletul generat este urmatorul:

1. package org.apache.jsp;
2.
3. import javax.servlet.*;
4. import javax.servlet.http.*;
5. import javax.servlet.jsp.*;
6. import java.util.Calendar;
7.
8. public final class basicJSP_jsp extends org.apache.jasper.runtime.HttpJspBase
9. implements org.apache.jasper.runtime.JspSourceDependent {
10.
11. private static java.util.List _jspx_dependants;
12.
13. public Object getDependants() {
14. return _jspx_dependants;
15. }
16.
17. public void _jspService(HttpServletRequest request, HttpServletResponse response)
18. throws java.io.IOException, ServletException {
19.
20. JspFactory _jspxFactory = null;
21. PageContext pageContext = null;
22. HttpSession session = null;
23. ServletContext application = null;
24. ServletConfig config = null;
25. JspWriter out = null;
26. Object page = this;
27. JspWriter _jspx_out = null;
28. PageContext _jspx_page_context = null;
29.
30.
31. try {
32. _jspxFactory = JspFactory.getDefaultFactory();
33. response.setContentType("text/html; charset=ISO-8859-1");
34. pageContext = _jspxFactory.getPageContext(this, request, response,
35. null, true, 8192, true);
36. _jspx_page_context = pageContext;
37. application = pageContext.getServletContext();
38. config = pageContext.getServletConfig();
39. session = pageContext.getSession();
40. out = pageContext.getOut();
41. _jspx_out = out;
42.
43. out.write("\r\n");
44. out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01
Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
45. out.write("<html>\r\n");
46. out.write("<body>\r\n");
47. out.write("\t");
48.
49. int val1 = 90;
50. int val2 = 136;
51. int produs = val1 * val2;
52. out.write("Produsul valorilor " + val1 + " si " + val2 + " este " +
produs);
53.
54. out.write("\r\n");
55. out.write("\t<br>\r\n");
56. out.write("\t");
57.
58. String server = application.getServerInfo();
59. System.out.println(application.getRealPath(""));
60.
61. out.write("\r\n");
62. out.write("\t<p> Aplicatia ruleaza pe un server ");

Java Server Pages Pagina 2


63. out.print(server);
64. out.write(".</p>\r\n");
65. out.write("\t");
66.
67. Calendar calendar = Calendar.getInstance();
68. int anul = calendar.get(Calendar.YEAR);
69. int luna = calendar.get(Calendar.MONTH);
70. int ziua = calendar.get(Calendar.DATE);
71.
72. out.write("\r\n");
73. out.write("\t<p><font color=\"BLUE\"> Ne aflam in anul ");
74. out.print(anul);
75. out.write(" ziua ");
76. out.print(ziua);
77. out.write(" luna ");
78. out.print(luna);
79. out.write("</font></p>\r\n");
80. out.write("</body>\r\n");
81. out.write("</html>");
82. } catch (Throwable t) {
83. if (!(t instanceof SkipPageException)){
84. out = _jspx_out;
85. if (out != null && out.getBufferSize() != 0)
86. out.clearBuffer();
87. if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
88. }
89. } finally {
90. if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
91. }
92. }
93. }

Exemplul de mai sus face o serie de operatii de baza : afisarea produsului a doua
numere, afisarea numelui serverului pe care ruleaza aplicatia noastra si afisarea unor
elemente despre data calendaristica. Sunt de notat urmatoarele notiuni legate de
exemplul anterior:
- codul Java este incapsulat intr-un tag de forma <% %>
- avem puse la dispozitie o serie de obiecte predefinite. De exemplu pentru
prima operatie (cea de afisare a produsului) am folosit linia de cod
out.write("Produsul valorilor " + val1 + " si " + val2 + " este " + produs);.
Obiectul out pe care l-am utilizat este un obiect predefinit care ne este pus la
dispozite de mecanismul JSPurilor. El corespunde writerului obtinut pentru
response-ul unui servlet PrintWriter out = response.getWriter(). Alaturi de
obiectul out, avem de asemenea puse la dispozitie obiectele request, response,
session, application. Obiectul application coresunde obiectului de tip
ServletContext, obtinut printr-un cod de genul ServletContext application =
this.getServletContext().
- pentru afisarea unei variabile din codul Java in cod HTML avem urmatoarele
posibilitati: fie folosim un apel de genul out.write(numeVariabila) fie folosim
tagul <%= %>, care transfera continut sau ca parametru pentru metoda write
a obiectului out. De exemplu <%= “Acesta este un text” %> devine
out.write(“Acesta este un text”). In cele mai multe cazuri este de preferat
utilizarea tagului <%= %>, deoarece permite o integrare mult mai buna a
codului HTML cu elementele din codul java.

Java Server Pages Pagina 3


- dat fiind faptul ca JSPurile sunt transformate in servleturi, deci in cod Java, o
intrebare care apare este ce se intampla cu statementurile de import. De
exemplu pentru afisarea datei calendaristice avem nevoie de obiectul de tip
Calendar, deci automat de importul java.util.Calendar. Statementurile de
import sunt adaugate in JSP-uri folosind directiva <%@page import =
“numeFisier”%>. Astfel in cazul exemplului de fata a fost adaugata in cod
urmatoarea linie: <%@page import="java.util.Calendar"%>, pentru a se realiza
importul clasei Calendar. In cazul in care la inceputul editarii JSP-ului s-a selectat
din Eclipse new – other – web si JSP, statementurile de import vor fi adaugate
automat de Eclipse, daca se foloseste autocompletition.

Pentru a face comentarii in paginile JSP se pot folosi fie comentariile standard de HMTL
<!-- comentariu --> fie comentariile standard de JSP <%-- comentariu -->. Diferenta
dintre cele doua modalitati de comentarii consta in faptul ca ceea ce va fi incapsulat in
comentarii de HTML va fi trimis clientului, spre deosebire de comentariile JSP care nu
sunt trimise spre client. Practic comentariile JSP devin comentariu pentru codul Java din
servletul generat.

Scrierea in afara metodei _jspService si importarea unui alt JSP

Vrem sa construim o pagina care numara de cate ori a fost accesata. Aceasta pagina nu
tine cont de unicitatea userilor. O prima varianta de cod ar fi urmatoarea:

1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"


2. pageEncoding="ISO-8859-1"%>
3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
4. <html>
5. <body>
6. <%
7. int numarAccesari = 0;
8. numarAccesari++;
9. %>
10. <font color = "blue" size="20" face="Verdana">
11. <p>
12. Aceasta pagina a fost accesata de <font color = "red"> <%=
numarAccesari %> ori.</font>
13. </p>
14. </font>
15. </body>
16. </html>

In urma rularii aplicatiei vom obtine pagina de mai jos:

Java Server Pages Pagina 4


La prima vedere pare sa functioneze, insa daca vom parasi pagina si vom incerca sa o
accesam din nou, counter-ul va ramane in continurare la 1 si nu va fi incrementat.
Motivul pentru care se intampla acest lucrul se datoreaza faptului ca in momentul de fata,
pentru serverul care a fost generat pe baza acestui JSP, variabila numarAccesari este
declarata in interiorul metodei _jspService ca o variabila locala. Astfel de fiecare data
cand cineva acceseaza aceasta pagina apelul metodei _jspService se reia de la inceput si
automat valoarea variabilei numarAccesari este resetata la 0. Pentru a rezolva aceasta
problema variabila numarAccesari ar trebui declarata ca atribut static la nivel de clasa. By
default orice este scris in interiorul tagului <% %> este transpus in interiorul metodei
_jspService. Tagul care ne permite sa scriem ceva in afara metodei _jspService este <!%
%>. Astfel varianta corecta pentru pagina din exemplul de fata este :

1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"


2. pageEncoding="ISO-8859-1"%>
3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
4. <html>
5. <body>
6. <%! private static int numarAccesari = 0; %>
7. <%
8. numarAccesari++;
9. %>
10. <font color = "blue" size="20" face="Verdana">
11. <p>
12. Aceasta pagina a fost accesata de <font color = "red"> <%=
numarAccesari %> ori.</font>
13. </p>
14. </font>
15.
16. </body>
17. </html>

Folosind tagul <!% %> se pot adauga metode intregi servletului generat, nu doar
declara atribute la nivel de clasa.

Sa luam in calcul urmatorul caz: am construit un jsp care contine logoul unei anumite
firme si unele elemente despre firma respectiva. De exemplu am facut un mic script care
face update automat la anul curent, astfel incat sa otinem automat mesaje de genul :
Copyright Line Education Center 2009
Copyright Line Education Center 2010
Copyright Line Education Center 2011
Aveti mai jos codul folosit pentru JSP-ul in cauza si rezultatul obtinut:
1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
2. pageEncoding="ISO-8859-1"%>
3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
4. <%@page import="java.util.Calendar"%><html>
5. <body>
6. <%
7. int anulCurent = Calendar.getInstance().get(Calendar.YEAR);
8. String headerText = "Copyright Line Education Center " + anulCurent;
9. %>
10. <table width="100%" style="font-size: 30; font-family: Verdana;">
11. <tr>

Java Server Pages Pagina 5


12. <td valign="bottom">
13. <img alt="logo" src="logo.png">
14. </td>
15. <td align="right" valign="bottom">
16. <%= headerText %>
17. </td>
18. </tr>
19. </table>
20. <hr>
21. </body>
22. </html>

In cazul in care dorim ca aceasta pagina sa fie inserata (de exemplu sub forma unui
header) in pagina anterioara , atunci va trebui sa inseram tagul <%@ include
file="header.jsp" %> intre liniile 5 si 6. La final vom obtine efectul prezentat in figura de
mai jos:

Exemplu: construirea unui shopping chart folosind JSP

Dorim sa construim o pagina JSP care simuleaza comportamentul unui Shoppging Chart
dintr-un magazin online. Utilizatorul are posibilitatea de a alege dintr-o lista de produse si
de a le adauga in cosul sau de cumparaturi. De asemenea trebuie sa existe posibilitatea
ca in cazul in care a fost ales un produs gresit, acesta sa poata fi scos din cosul de
cumparaturi. In imaginea de mai jos este prezentata pagina care trebuie obtinuta pentru
acest exemplu:

Java Server Pages Pagina 6


Problema este ca lista de cumparaturi se modifica, in functie de actiunile pe care le
efectueaza utilizatorul, iar din acest motiv intreaga pagina trimisa ca raspuns trebuie
generata dinamic. Folosind doar facilitatile puse la dispozitie de servleturile simple,
obtinerea unei asemenea pagini ar fi destul de dificila. Prin intermediul JSP-urilor tot
codul care tebuie scris pentru a completa acest exercitiu este afisat mai jos:
1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
2. pageEncoding="ISO-8859-1"%>
3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
4.
5. <%@page import="java.util.LinkedList"%><html>
6. <body>
7. <%@ include file="header.jsp" %>
8. <font size="5">
9. <%
10. LinkedList listaProduse = (LinkedList)
session.getAttribute("produseCumparate");
11. if (listaProduse == null) {
12. listaProduse = new LinkedList();
13. }
14. String produsSelectat = request.getParameter("listaToateProdusele");
15. if ((produsSelectat!=null) && (produsSelectat.length()>0)){
16. if (request.getParameter("butonAdaugare")!=null)
17. listaProduse.add(produsSelectat);
18. if (request.getParameter("butonEliminare")!=null)
19. listaProduse.removeLastOccurrence(produsSelectat);
20. }
21.
22. session.setAttribute("produseCumparate",listaProduse);
23. %>
24. <p>Pana in acest moment ati cumparat urmatoarele produse: </p>
25. <ul>
26. <% for(int i = 0; i < listaProduse.size(); i++) {
27. out.write("<li> " + listaProduse.get(i) + "</li><br>");
28. }
29. %>
30. </ul>
31. <br>
32. <br>
33. <hr>
34. <fieldset>
35. <legend>Lista produselor</legend>
36. <form action="cosCumparaturiUpdate.jsp">
37. <select name="listaToateProdusele">
38. <option value="Monitor Samsung">Monitor Samsung</option>
39. <option value="Monitor LG">Monitor LG</option>

Java Server Pages Pagina 7


40. <option value="Monitor Benq">Monitor Benq</option>
41. <option value="Laptop Dell">Laptop Dell</option>
42. <option value="Laptop Asus">Laptop Asus</option>
43. <option value="Laptop HP">Laptop HP</option>
44. </select>
45. <br><br>
46. <input type="Submit" value = "Adauga produs"
name="butonAdaugare"/>
47. <input type="Submit" value = "Elimina produs"
name="butonEliminare"/>
48. </form>
49. </fieldset>
50. </font>
51. </body>
52. </html>

Codul Java pentru acest exemplu se afla intre liniile 9 si 23. Pentru a realiza efectul dorit
va trebui ca formularul continut in acest jsp sa faca trimitere catre el insusi. Vom folosi
un obiect de tip LinkedList in care vom stoca obiecte de tip String care vor reprezenta
produsele comparate. Intr-o prima instanta incercam sa preluam de pe sesiune acest
obiect de tip LinkedList (linia 10). Prima data cand vom aceesa pagina nu vom avea nici
un atribut de tip LikedList setat pe sesiune. Din acest motiv verificam daca atributul este
null, iar in caz afirmativ il instantiem (liniile 11 - 13).

In continuare preluam parametru de pe request, care reprezinta produsul care a fost


selectat din lista continuta in formular. Dupa ce verificam daca acest parametru exista
(cazul in care nu exista este prima accesarea a paginii) verificam si care buton aparut din
formular (liniile 16 si 18) si in functie de ce buton a fost adaugat , fie adaugam produsul
in obiectul de tip LinkedList, fie il eliminam. Dupa ce facut prelucrarile, adaugam pe
sesiune LikedList-ul modificat, sau nou creat (in cazul in care este prima accesare a jsp-
ului). Liniile 26, 27 si 28 contin codul care afiseaza clientului continulul actual cosului de
cumparaturi.

NOTA: In cazul in care continutul de cod java pentru un jsp devine prea mare se
recomanda crearea unei metode intr-o clasa standard java, iar in jsp sa nu se puna decat
apelul metodei in cauza. Astfel se obtine un cod mult mai usor de scris si de intretinut.

Expresion Language – EL

Unul dintre motivele pentru care jsp-urile au fost introduse, a fost sa se separe partea de
interfata de logica aplicatiei. Astfel exista pe de o parte cei care realizeaza interfata si
care stiu HTML, CSS si pe de alta parte developerii care stiu Java. Expression Language
reprezinta o colectie de tag-uri de tip XML, care se plaseaza undeva la mijloc intre codul
stil HTML si functionalitatea codului java. EL a fost creat pentru a le permite celor care
lucreaza pe interfata, si nu stiu Java sa folosesca functionalitatile construite de
developeri. De exemplu in loc sa se foloseasca un cod de genul:

Java Server Pages Pagina 8


if (request.getParameter("valoare").equals("redirect")) {
request.sendRedirect("/exemplul2.html");
}
se va folosi codul de mai jos, care este mult mai apropiat modului de lucru din HTML sau
CSS:
<c:if test="${param.valoare eq 'redirect'}">
<jsp:forward page="/exemplul2.html"/>
</c:if>

Java Server Pages Pagina 9