Documente Academic
Documente Profesional
Documente Cultură
Tehnologia JSP
Partea 1 Ciclu de viata Elemente de scripting expresii, scripleti, declaratii, variabile predefinite Directive import, content-type
JSP: introducere
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ExempluServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Exemplu Servlet</title>"); out.println("</head>"); out.println("<body><p>"); out.println(Data curenta pe server este"); out.println(...."); out.println(afisata acum: + java.util.Date()); out.println(</p></body>"); out.println("</html>"); } }
JSP: introducere
intr-un servlet o parte importanta a codului este compusa din instructiuni out.println() pentru generarea codului HTML o pagina JSP poate fi vazuta ca o modalitate de a realiza un servlet pentru generarea de cod HTML ideea consta in a scrie cod HTML si de a insera, cu ajutorul unor marcaje speciale, instructiuni Java in final se genereaza un servlet
Exemplu: exemplu.jsp
<html> <head> <title>Exemplu Servlet</title> </head> <body> <p>Data curenta pe server este .... afisata acum: <%= new java.util.Date() %> </p> </body> </html>
Pagina JSP
JSP reprezinta o alta modalitate de a scrie o clasa Java de tip servlet ideea fundamentala este de a interclasa codul HTML cu instructiuni Java si de a permite unui program sa translateze pagina intr-o clasa de tip servlet translatarea se realizeaza in momentul in care un client cere pentru prima data pagina JSP translatarea implica apoi compilarea si incarcarea clasei rezultate de catre container
codul JSP in codul Java al unei clase de tip container, il compileaza, il incarca in memorie si creeaza o instanta careia ii transmite cererea HTTP venita de la client in cazul cererilor ulterioare containerul verifica versiunea codului: daca nu s-au produs modificari asupra acestuia se apeleaza instanta ultimei clase de tip servlet generata; daca exista modificari atunci servlet-ul este reconstruit si reincarcat
JSP si Servlet
codul JSP este translatat intr-o clasa servlet (pentru Tomcat, in folderul work) clasa servlet generata de o pagina JSP contine o metoda speciala, _jspService(), ce este apelata de catre metoda service(), in interiorul careia se afla codul Java inserat in pagina HTML prin intermediul unor elemente de scripting
package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; import org.apache.jasper.runtime.*; public class exemplu_Jsp extends HttpJspBase { public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { JspWriter out = pageContext.getOut(); out.println(<html>); out.println(<head>); out.println(<title>Exemplu Servlet</title>); out.println(</head>); out.println(<body>); out.println(<p>Data curenta pe server este); out.println(....); out.println(afisata acum: ); out.println(new java.util.Date() ); out.println(</p></body>); out.println(</html>); } public void service(HttpServletRequest request, HttpServletResponse response) { _jspService(request, response); } }
comentarii
commentarii HTML si comentarii JSP
scriptleti
instructiuni Java, obiecte predefinite
expresii
expresii Java (ce produc un rezultat afisabil)
declaratii Java
metode si declaratii de variabile
directive Java
influenteaza constructia clasei servlet
<!-- comentariu HTML --> comentarii JSP <%-- comentariu JSP --%>
comentariile HTML sunt incluse in corpul raspunsului (se genereaza o instructiune out.print("<! comentariu HTML-->") in metoda _jspService()) comentariile JSP nu sunt incluse in corpul raspunsului (nu este generata nici o instructiune)
comentarii
commentarii HTML si comentarii JSP
scriptleti
instructiuni Java, obiecte predefinite
expresii
expresii Java (ce produc un rezultat afisabil)
declaratii Java
metode si declaratii de variabile
directive Java
influenteaza constructia clasei servlet
Scriptlet
sunt pur si simplu secvente de instructiuni Java ce pot fi inserate in mod arbitrar in interiorul codului HTML, separate cu ajutorul unui delimitator
sintaxa: <% instructiuni %> aceste instructiuni compun (impreuna cu tag-urile din template-ul
HTML) metoda _jspService() din clasa servlet obtinuta din pagina JSP in cadrul unui scriptlet sunt vizibile o serie de obiecte predefinite
Obiecte Predefinite
obiecte predefinite ce pot fi utilizate in scriptleti sau in expresii
HttpServletRequest request
reprezinta parametrul HttpServletRequest din metoda service() HttpServletResponse response reprezinta parametrul HttpServletResponse din metoda service() HttpSession session reprezinta obiectul HttpSession ce se poate obtine prin request.getSession() ServletContext application reprezinta obiectul ServletContext ce se poate obtine prin getServletContext() JspWriter out reprezinta obiectul PrintWriter cu ajutorul caruia se afiseaza corpul raspunsului; este echivalent cu obiectul ce se obtine prin response.getWriter(). JspWriter extinde PrintWriter: este varianta cu buffer a clasei PrintWriter
Obiecte Predefinite
in concluzie: exista mai multe obiecte ce ajuta la realizarea codului aceste obiecte pot fi utilizate in scriptleti sau in expresii nu este necesara construirea acestora metoda _jspService() are o structura predefinita
public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { ServletContext application = getServletContext(); HttpSession session = request.getSession(); JspWriter out = response.getWriter(); response.setContentType(text/html); ... }
Scriptlet
instructiunile dintr-un scriptlet sunt inserate in metoda _jspService() Exemplu:
<html> <body> <% String nume = (String)request.getParameter(nume); session.setAttribute(nume, nume); %> <p>Buna ziua, <% out.print(nume);%>. Astazi suntem in: <% Date d = new java.util.Date(); out.print(d); %> </p> </body> </html>
Scriptlet
public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { ServletContext application = getServletContext(); HttpSession session = request.getSession(); JspWriter out = response.getWriter(); response.setContentType(text/html); out.println(<html>); out.println(<body>); String nume = (String)request.getParameter(nume); session.setAttribute(nume, nume); out.println(<p>Buna ziua,); out.print(nume); out.print(Astazi suntem in:); Date d = new java.util.Date(); out.print(d); out.println(</p>); out.println(</body>); out.println(</html>); }
Scriptlet
este posibil sa introducem in tag-ul scriptlet si instructiuni de control Exemplu:
<% String nume=(String)request.getParameter(nume); if (nume == null) { %> <p>Bine ati venit, introduceti numele dumneavoastra</p> <form action=... method=...>...</form> <% } else { %> <p>Bine ai venit, <% out.print(nume);%> </p> <% } %>
Scriptlet
translatare in _jspService()
String nume=(String)request.getParameter(nume); if (nume == null) { out.println(<p>Bine ati venit, introduceti numele dumneavoastra</p>); out.println(<form action=\...\ method=\...\>); ... out.println(</form>); } else { out.println(<p> Bine ai venit,); out.print(nume); out.print(</p>); }
Scriplet
<html> <body> <h1>Tabla inmultirii</h1> <table> <% for (int i = 1; i <= 10; i++) { %> <tr> <% for (int j=1; j <= 10; j++) { %> <td> <% out.print(i*j) %> </td> <% }%> </tr> <% }%> </table> </body> </html>
comentarii
commentarii HTML si comentarii JSP
scriptleti
instructiuni Java, obiecte predefinite
Expresii
expresii Java (ce produc un rezultat afisabil)
declaratii Java
metode si declaratii de variabile
directive Java
influenteaza constructia clasei servlet
Expresii
sunt expresii Java deliminate de restul prin intermediul unei sintaxe speciale: rezultatul expresiei este convertit la un string si este afisat poate fi utilizata ca o metoda rapida de a afisa un sir de caractere
sintaxa: <%= expresie %>
Exemplu: <%= new java.util.Date() %> semantica: rezultatul expresiei convertit la tipul String (intr-un sir de caractere) este tiparit cu ajutorul obiectului out sunt echivalente cu
<% out.print(expresie.toString()); %> Exemplu: <% out.print( (new java.util.Date()).toString()); %>
Expresii
Motivatie:
metoda print() este indicat sa fie utilizata cat mai putin
posibil in cadrul unei pagini JSP atunci cand se poate, aceasta va fi inlocuita printr-o expresie
Exemplu
<html> <body> <% String nume = (String)request.getParameter(nume); %> <p>Bine ai venit, <%= nume %>. Data de astazi este: <%= new java.util.Date() %> </p> </body> </html>
Expresii
<html> <body> <h1> Tabla inmultirii </h1> <table> <% for (int i = 1; i <= 10; i++) { %> <tr> <% for (int j = 1; j <= 10; j++) { %> <td> <%= i*j %> </td> <% }%> </tr> <% }%> </table> </body> </html>
comentarii
commentarii HTML si comentarii JSP
scriptleti
instructiuni Java, obiecte predefinite
espresii
espresii Java (ce produc un rezultat afisabil)
Declaratii Java
metode si declaratii de variabile
directive Java
influenteaza constructia clasei servlet
Declaratii
fiecare pagina JSP corespunde unui servlet scriptletii si template-ul produc instructiuni ce formeaza metoda _jspService intr-o clasa este posibil sa declaram metode si atribute declaratiile JSP servesc pentru definirea unor metode si variabile utilizate de catre metoda _jspService
variabile ale clasei asociate paginii JSP metode ale clasei asociate paginii JSP
in cadrul declaratiilor, obiectele predefinite nu sunt vizibile (ele sunt vizibile numai in metoda _jspService si de aceea numai in scriptleti si expresii)
Declaratii
variabila a clasei servlet asociata paginii metoda a clasei servlet asociata paginii
Exemplu:
<%! private int accessCount;
Declaratii
<%! private int accessCount = 0; private int randomNumber() { return Math.abs(new Random().nextInt() % 100) + 1; } %> <html> <head> </head> <body> <h1>Exemple Declaratii</h1> <h2>Numarul de accesari ale clasei: <%= ++accessCount %> </h2> <h2>Un numar generat aleator: <%= randomNumber() %> </body> </html>
Declaratii
doua metode particulare: public void jspInit() public void jspDestroy() metoda jspInit() (mostenita din clasa HttpJspBase) se executa atunci cand instanta clasei asociata paginii este incarcata pentru prima oara de catre containerul de servleti metoda jspDestroy() (mostenita din clasa HttpJspBase) este executata atunci cand instanta clasei asociata paginii este eliminata din memoria containerului
comentarii
commentarii HTML si comentarii JSP
scriptleti
instructiuni Java, obiecte predefinite
expresii
expresii Java (ce produc un rezultat afisabil)
declaratii Java
metode si declaratii de variabile
Directive Java
influenteaza constructia clasei servlet
Directive
o directiva JSP are influenta asupra structurii clasei servlet ce se construieste dintr-o pagina JSP avem trei directive importante:
page include taglib
fiecarei directive ii este asociata o multime de instante de forma (atribut-valoare) sintactic, forma generala a unei directive este
<%@ directiva attr1="val1" attrN="valN" %>
Directiva page
<%@ page attr1=val1, attr2=val2, %>
atribute principale
import content-type session errorPage isErrorPage
Exemplu:
in pagina JSP:
<%@ page import="java.util.*" %>
Directive
Observatie
in mod normal sunt vizibile toate clasele din directorul
WEB-INF/classes este necesar sa se importe in mod explicit clasele utilizand directiva page si atributul import
Exemplu:
in pagina JSP:
<%@ page contentType="application/vnd.ms-excel" %>
catre care este redirectionat browser-ul in caz de erori aparute in timpul executarii paginii
<%@ page errorPage="eroare.jsp" %>
Exemplu
in caz de eroare raspunsul vine redirectat catre pagina eroare.jsp
de eroare (contine mesaje pentru situatiile cand apare o eroare) valoare true sau false
Exemplu
<%@ page isErrorPage = "true" %>
Directiva include
<%@ include file=nume-fisier %>
Directiva include
are un singur atribut: file valoarea atributului file: adresa URL a unei pagini JSP sau
HTML Exemplu:
includerea se realizeaza in timpul translatarii paginii JSP specificate incluziunea se realizeaza in pozitia in care se afla directiva
include pot sa existe mai multe directive include aceste directive pot sa apara in orice pozitie in interiorul unei pagini JSP
Directiva include
Observatie: includerea se realizeaza in timpul translatarii (JSPservlet)
daca codul paginii JSP inclusa este modificat,
Rezumat
sintaxa elementelor JSP
comentarii JSP
directive
<%@ directiva attr1="val1" attrN="valN" %>
Rezumat
Semantica elementelor se intelege in contextul corespondentei JSP-Servlet
pagina JSP este translatata de catre container intr-o
Rezumat
Construirea clasei servlet drept rezultat al unei pagini JSP
se vor importa atat pachetele standard cat si cele specificate de
directiva page
vor fi incluse variabilele si metodele definite in cadrul
declaratiilor in metoda _jspService() sunt initializate obiectele predefinite se initializeaza content-type cu valoarea predefinita (sau cu cea specificata in directiva page)
template-ul text din pagina JSP se construieste prin apeluri
succesive de tipul out.print(text HTML); codul scriptletilor este inclus in metoda _jspService()