SwRTc   ISw

Catedra de Telecomunicatii

 

 

  POO – an II

 

11/04/2009

 

 

   ISC – an IV

Tehnologii de Programare in Internet (TPI)

 

 

                     

 

Laborator 4

Programarea Web utilizand tehnologia Java ServerPages (JSP)

 

4.1. Descrierea laboratorului

 

In aceasta lucrare de laborator vor fi acoperite urmatoarele probleme:

- Tehnologia Java ServerPages (JSP)

- Aplicatie Web realizata pe arhitectura model-1 (cu JSP, fara servlet)

- Aplicatie Web realizata pe arhitectura model-2 (MVC)

- Teme de casa, Anexa

 

4.2. Tehnologia Java ServerPages

4.2.1. Introducere in JSP

 

Servlet-urile folosite in lucrarea anterioara au unele dezavantaje. In cazul utilizarii lor trebuie scrise String-uri complexe (care includ caractere escape, de exemplu \" in locul fiecarei ghilimele care trebuia trimisa pe flux pentru a face parte din continutul HTML) pentru fiecare linie de cod HTML care urma sa ii fie trimisa clientului. Sunt necesare cunostinte de Java pentru a scrie intreg codul unui servlet. In plus, exista si alte tehnologii concurente pe piata, ca de exemplu ASP (Active Server Pages), care le permit programatorilor sa creeze mai usor continut dinamic.

Pentru ca puterea servlet-urilor Java sa fie pusa la dispozitia celor ce se ocupa de dezvoltare Web fara a-i obliga sa invete Java a aparut specificatia Java ServerPages (JSP), care combina puterea si extensibilitatea limbajului Java cu simplitatea si usurinta de folosire a scripturilor pe baza de etichete.

 

O pagina JSP este un document text ce contine 2 tipuri de text: static, ce poate fi exprimat in orice tip de format bazat pe text (HTML, WML, XML, etc.), si continutul JSP propriu-zis altfel spus dinamic.

 

Pentru a se ajunge de la continutul unei pagini JSP la continut generat dinamic se parcurg trei etape:

- translatia, in care pagina JSP este transformata de catre containerul de JSP-uri intr-un servlet (de ex. pagina.jsp este translatata in pagina_jsp.java) – realizata doar atunci cand servlet-ul nu a fost anterior generat sau atunci cand servlet-ul este mai vechi decat pagina JSP (vezi si anexa)

- compilarea, in care servletul obtinut la primul pas este compilat de catre containerul de JSP-uri (de ex. Din pagina_jsp.java se obtine prin compilare pagina_jsp.class) – realizata doar atunci cand containerul a generat un nou servlet

- executia (prelucrarea cererii), in care cererile catre pagina JSP sunt directionate catre servlet (care va genera raspunsul).

 

4.2.2. Elemente de limbaj JSP

 

 

Comentariile din paginile JSP sunt de doua feluri:

 

 

- comentarii JSP propriu-zise, care nu ajung in paginile generate dinamic:

 

 

<%-- Comentariu JSP propriu-zis --%>

 

 

 

- comentarii SGML (HTML, WML, XML), care ajung in paginile generate dinamic:

 

 

<!-- Comentariu HTML -->

 

 

 

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;} %>

 

 

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");

 

 

4.2.3. Arhitecturi de baza ale aplicatiilor Web bazate pe JSP

 

 

Principalul avantaj al JSP-urilor consta in introducerea template-urilor de continut static  (posibil de creat in formate non-HTML: WML, XML) care pot fi realizate de dezvoltatori specializati in proiectarea interfetelor Web.

 

Deoarece insa partea de prelucrare a informatiei necesara generarii de continut dinamic este mai greu de scris in JSP, si este preferabil sa fie separata pentru a fi scrisa de programatori Java, s-a trecut rapid de la lucrul exclusiv cu pagini JSP (arhitectura numita “model-0”) la delegarea sarcinilor de stocare si prelucrare catre coduri Java care pot fi clase Java clasice (POJO – Plain Old Java Objects) sau componente JavaBeans. Arhitectura care a rezultat poarta numele de “model-1”.

 

 

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.

 

 

 

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).

 

 

4.3. Crearea aplicatiilor Web bazate pe JSP-uri utilizand NetBeans

4.3.1. Aplicatie Web realizata pe arhitectura model-1 (cu JSP, fara servlet)

 

Pentru exemplificare, vom folosi din nou clasa Orar, de aceasta data insa ca o componenta JavaBeans, accesata la distanta prin intermediul JSP-urilor:

 

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

package model;

 

import java.beans.*;

import java.io.Serializable;

 

public class Orar implements Serializable {

    private String[] orar; // camp ascuns (starea obiectului)

 

    public Orar() {

        orar = new String[7]; // alocarea dinamica a spatiului pentru tablou

        // popularea tabloului cu valori

        orar[0] = "Luni este curs TPI la seriile D si E, laborator TPI la seria E.";

        orar[1] = "Marti nu sunt ore de TPI.";

        orar[2] = "Miercuri este laborator TPI la seriile D si E.";

        orar[3] = "Joi este laborator TPI la seria D.";

        orar[4] = "Vineri este laborator TPI la seria D.";

        orar[5] = "Sambata nu sunt ore de TPI.";

        orar[6] = "Duminica nu sunt ore de TPI.";

    }

    public String getOrar(int zi) { // metoda accesor - getter

        return orar[zi];            // returneaza un element al tabloului

    }

    public void setOrar(int zi, String text) { // metoda accesor - setter

        orar[zi] = text;                       // inlocuieste un element

    }

}

 

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 seriei, 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.

 

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>

 

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 pe nodul proiectului AplicatieOrar2.

2. Se selecteaza Run pe nodul proiectului AplicatieOrar2.

3. Se utilizeaza pagina in diverse moduri, testand serviciile obtinere si modificare.

 

 

4.3.2. Aplicatie Web realizata pe arhitectura model-2 (MVC)

 

 

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).

 

 

 

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

46

47

48

49

50

51

52

53

54

55

56

57

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.

 

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 Package se elimina numele controler (daca acesta exista). Se apasa Next.

4. In zona.in zona HTML File  Name se scrie numele PaginaHTMLAcces (iar in zona Location se selecteaza Web Pages).

5. 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.

 

<%@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>

 

 

- daca serviciul cerut e modificare orar (RezultatModificareOrar)

 

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 RezultatModificareOrar. Se apasa Next.

4. Se inlocuieste codul generat automat 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>

        <%@ include file="PaginaHTMLAcces.html" %>

       

        <b>Modificarea ceruta:</b> <br> <%=request.getAttribute("raspuns")%>

    </body>

</html>

 

 

- daca serviciul cerut nu e recunoscut (ServiciuNeimplementat)

 

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 ServiciuNeimplementat. Se apasa Next.

4. Se inlocuieste codul generat automat 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>

        <%@ include file="PaginaHTMLAcces.html" %>

       

        <b>Serviciul cerut nu este implementat</b> <br>

    </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” %>

 

 

In laborator:

1. Se selecteaza Build pe nodul proiectului AplicatieOrar2.

2. Se selecteaza Run 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.).

 

4.4. Teme pentru acasa (inclusiv teme suplimentare)       

4.4.1. Tema de casa (miniproiect)

 

Fiecare grup de 2 studenti ai unei subgrupe (cei 2 studenti care lucreaza la acelasi calculator in cadrul laboratorului)

- pornind de la clasa aleasa la lucrarea trecuta (sau o alta clasa auto-propusa) pe post de “produs” intr-un “magazin virtual”:

PC

Laptop

Proiector

Smartphone

Carte

Masina

TV

Copiator

ConsolaJocuri

CameraVideo

Bicicleta

Reportofon

DVDPlayer

Imprimanta

- 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.)

 

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)

 

 

2. Alte resurse privind JSP

 

 

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

 

 

3. Codul servlet-ului RezultatObtinereOrar_jsp.java

 

 

package org.apache.jsp;

 

import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.jsp.*;

 

public final class RezultatObtinereOrar_jsp extends org.apache.jasper.runtime.HttpJspBase

    implements org.apache.jasper.runtime.JspSourceDependent {

 

  private static java.util.List _jspx_dependants;

 

  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 {

 

    JspFactory _jspxFactory = null;

    PageContext pageContext = null;

    HttpSession session = null;

    ServletContext application = null;

    ServletConfig config = null;

    JspWriter out = null;

    Object page = this;

    JspWriter _jspx_out = null;

    PageContext _jspx_page_context = null;

 

    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;

 

      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);

    }

  }

}