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
JSP: ciclul de viata
in momentul in care containerul primeste cererea pentru o pagina JSP, se cauta clasa cu acelasi nume:
– daca aceasta clasa nu exista, containerul translateaza automat
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: dezvoltare si instalare
dezvoltare: foarte simpla, daca paginile JSP sunt utilizate corect – scopul lor este de a gestiona modul de prezentare, avand rol de formatare a rezultatelor instalare: este suficient sa se copieze pagina JSP intrunul din directoarele aplicatiei Web.
– nu sunt necesare operatii de configurare (cum ar fi, de
exemplu, efectuarea unor actualizari in descriptorul aplicatiei web.xml)
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); } }
Structura unei pagini JSP
Elemente principale
– template-uri Text
cod HTML
Structura unei pagini JSP: Template Text
in marea majoritate a cazurilor cea mai mare parte a codului unei pagini JSP este formata din tag-uri HTML acest cod HTML trebuie sa respecte regulile normale de formare ale unei pagini HTML (respecta un DTD) codul HTML se va afla in corpul raspunsului – codului JSP ii corespund secvente de instructiuni out.print(codHTML) aflate in metoda _jspService()
Structura unei pagini JSP: comentarii
doua tipuri de comentarii
– comentarii HTML
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)
Structura unei pagini JSP
Elemente principale
– template-uri Text
cod HTML
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>”); } …
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>
Structura unei pagini JSP
Elemente principale
– template-uri Text
cod HTML
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
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
Structura unei pagini JSP
Elemente principale
– template-uri Text
cod HTML
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, atributul import
atributul import
– specifica numele pachetului si eventual al clasei ce trebuie importate – pot exista mai multe astfel de directive – de obicei se gaseste la inceputul paginii
Exemplu:
– in pagina JSP:
<%@ page import="java.util.*" %>
– in clasa servlet asociata:
import java.util.*;
se pot importa mai multe pachete cu o singura directiva
<%@ page import="java.util.*, java.sql.*" %>
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
O idee ar fi sa se organizeze clasele in pachete si sa se importe pachetele
Directiva page, atributul content-type
atributul content-type
– specifica campul “content-type” al raspunsului – daca nu este specificat explicit, atunci in mod implicit
are valoarea text/html – de obicei se gaseste la inceputul paginii
Exemplu:
– in pagina JSP:
<%@ page contentType="application/vnd.ms-excel" %>
– in metoda _jspService() din clasa servlet:
response.setContentType(“application/vnd.ms-excel”);
Directiva page, atributul session
atributul session
– controleaza daca pagina este asociata unei sesiuni de
lucru – presupune doua variante
<%@ page session="true" %> <%@ page session="false" %>
– prima varianta este folosita implicit
necesita prezenta in cadrul metodei _jspService() a instructiunii
HttpSession session=response.getSession();
Directiva page atributul errorPage
atributul errorPage
– specifica adresa URL a unei pagini (HTML sau JSP)
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”
Directiva page atributul isErrorPage
atributul isErrorPage
– specifica daca pagina curenta va fi utilizata drept pagina
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:
<%@ include file=“introducere.jsp” %>
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 (JSP→servlet)
– daca codul paginii JSP inclusa este modificat,
containerul nu este obligat sa recompileze automat clasa servlet generata anterior
Se recomanda limitarea utilizarii acestei directive
Rezumat
Semantica elementelor se intelege in contextul corespondentei JSP-Servlet
– pagina JSP este translatata de catre container intr-o
clasa servlet ce extinde javax.servlet.jsp.HttpJspPage – metode importante: _jspService(), jspInit(), jspDestroy()
– clasa servlet este recompilata si intializata de fiecare
data cand fisierul jsp este modificat
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()