Enrera
Mòdul 8
Iniciació a la programació en Java
  Pràctica
1
2
3
4
5
   
Exercicis
Exercicis
 
  Interactuant amb les pàgines web
   

A la darrera pràctica aprofitarem les capacitats d'enviar i rebre informació del nostre navegador ( a través dels mètodes request i response) per tal de fer actualitzacions de dades. Ho aplicarem a la gestió de préstecs de la nostra biblioteca.

   
Desenvolupament de la pràctica
   
 
  • Crearem un Java Bean que farà les funcions necessàries per prestar els llibres de la nostra biblioteca.

  • Crearem una pàgina JSP que ens permeti prestar i retornar els llibres.
  Modificacions a GestioLlibres.java per a marcar i desmarcar els llibres prestats.
   

Modificarem, en primer lloc, el Java Bean GestioLlibres.java per tal d'afegir-li la capacitat d'actualitzar l'estat dels llibres respecte de la situació de préstec.

Obriu amb JCreator el fitxer GestioLlibres.java dins del projecte 'Biblioteca' i afegiu-li el següent mètode, el qual, cada vegada que el cridem, ens marcarà o desmarcarà com a prestat un llibre de la biblioteca.

   
 

/**
* Commuta l'estat de préstec d'un llibre.
*
*  El camp <b>accio</b> determina si el llibre s'ha de marcar
*  com a prestat "true" o com a disponible "false".És un camp
*  boolean no Boolean
*
*  El camp <b>llibre</b> representa el codi numèric que identifica
*  el llibre a la base de dades. Treballar amb codis numèrics per a
*  referir-se a objectes facilita molt la tasca al programador.
*
* Aquí emprem un tipus diferent de pregunta a la base de dades,
* el "PreparedStatement", que ens permet parametritzar allò que
* preguntem.
*
* Per a fer un PreparedStatement:
*  a) el declarem
*  b) li manem a la connexió que el prepari (observeu que la base
*     de dades prepara i optimitza la consulta per a esperar els
*     paràmetres representats per interrogants.
*       pregunta=connexio.prepareStatement("consulta que sigui");
*  c) Com la consulta és una actualització que no retorna un
*    ResultSet, l'executem directament.
*       pregunta.executeUpdate();
*
*/

    public void setEnprestec( int llibre, boolean accio ) {
        PreparedStatement pregunta;
            try {
                pregunta = connexio.prepareStatement("update "+
                                                     "Llibres "+
                                                     "set "+
                                                     "enprestec=? "+
                                                     "where id=?");
                pregunta.setBoolean(1,accio);
                pregunta.setInt(2,llibre);
                pregunta.executeUpdate();
                pregunta.close();
            } catch (SQLException e) {
               System.out.println(e.getMessage());
            }
    }

   
 

Amb aquest mètode li direm a Access que marqui a "true" o "false" el camp enprestec del llibre que tingui un codi numèric determinat.

Observeu que, a més d'utilitzar un PreparedStatement i no un Statement -el PreparedStatement ens permet parametritzar la consulta a la base de dades-, executem una consulta d'actualització que, traduïda de SQL al català, diu:

  "actualitza la taula Llibres, anota al camp enprestec el valor x sempre que el codi de libre sigui del valor y"

Les variables x i y d'aquesta consulta estan parametritzades. Les recollim de la declaració del mètode: public void setEnprestec(int llibre, boolean accio)i les passem a Access abans d'executar la consulta pregunta.setBoolean(1,accio); pregunta.setInt(2,llibre). Fem setXXXX, on XXXX és el tipus de dada que estem entrant i, entre parèntesis, posem el número d'ordre del paràmetre a la consulta, començant per l'1 i el valor concret que estem passant a la consulta.

Ara hem de fer una pàgina JSP que cridi el mètode setEnprestec() cada vegada que algú ens torni un llibre o cada vegada que el donem en préstec. Una pàgina d'aquest tipus es pot fer seguint diferents estratègies. En una biblioteca en funcionament segurament faríem una pàgina per a identificar el llibre sobre el que treballem, ja sigui entrant el codi del llibre o una part del títol o l'autor. Aquesta pàgina ens portaria a una altra pàgina sobre la que fer el préstec un cop identificat el lector.

Aquí farem una simplificació del procés: obrirem una pàgina que conté tots els llibres de la biblioteca amb un enllaç al costat que ens permet prestar o retornar el llibre. No filtrarem la llista ni anotarem el lector que s'emporta el llibre. Ho deixem per aquells/es que s'engresquin a programar una biblioteca real amb JSP.

El codi de la pàgina és aquest. Després l'analitzarem. Ara creeu-lo amb un editor de text o de pàgines HTML, poseu-li el nom de prestar.jsp i deixeu-lo a c:/biblioteca:

   
 

<jsp:useBean id="biblioteca" scope="page" class="GestioLlibres" />
<%

// ------------------ Si intentem enregistrar una modificació
if (request.getParameter("llibre")!=null) {
try {
int llibre = Integer.parseInt(request.getParameter("llibre"));
boolean accio =
!(Boolean.valueOf(request.getParameter("accio"))).booleanValue();
biblioteca.setEnprestec(llibre,accio);
} catch(Exception e) {
}

}

// --------------------- Recollim la llista de llibres;
Llibre[] elsllibres = biblioteca.getLlibres(false);

String etiqueta="";
%>
<html>
<head>
<title>Prestar i retornar llibres</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1">
</head>

<body bgcolor="#FFFFFF" text="#000000">
<div align="center">
<p> <b> <font size="2"> <font face="Arial, Helvetica, sans-serif">
GESTIÓ DE PRÉSTECS </font> </font> </b> </p>
<p align="left"><b><font size="2">
<font face="Arial, Helvetica, sans-serif"><BR>
</font></font></b>
<% if (elsllibres!=null)
for (int n=0; n<elsllibres.length; n++) {
if (elsllibres[n].getEnprestec()) {
etiqueta="Retornar";
} else {
etiqueta="Prestar";
} %>
<%=elsllibres[n].getAutor()%>;
<b><%=elsllibres[n].getTitol()%> -> </b>
<a href="/prestar.jsp?llibre=<%=elsllibres[n].getId()
%>&accio=<%=elsllibres[n].getEnprestec()
%>"><%=etiqueta%></a>
<br>
<% } %>
<p align="left">&nbsp;
</div>
<a href="index.html">Retornar a l'índex</a>
</body>
</html>

   
  Si el Java Bean s'ha compilat bé i no hem fet errors al crear la pàgina JSP, el resultat al demanar aquesta pàgina http://localhost/prestar.jsp ha de ser com aquest:

Al costat de cada llibre tenim un enllaç amb l'opció de Prestar o Retornar el llibre. Si el piquem, s'executa l'acció.

Repassem el codi de la pàgina des del començament:

El primer que fem a la pàgina JSP és intentar llegir el paràmetre llibre que viatja amb l'objecte request de la pàgina web:

if (request.getParameter("llibre")!=null) {

Un objecte request transporta en forma de cadena paràmetres que s'han creat dins d'un formulari o a través de la URL. En el nostre cas, la URL del nostre enllaç conté els paràmetres que necessitem:

<a href="/prestar.jsp?llibre=<%=elsllibres[n].getId()
%>&accio=<%=elsllibres[n].getEnprestec()
%>"><%=etiqueta%></a>

Atenció! Cal vigilar que la URL del nostre enllaç no contingui espais en blanc! Si no, no funciona. Això s'aconsegueix mitjançant una distribució intel·ligent dels delimitadors <% i %> i dels canvis de línia.

Si a l'obrir la pàgina JSP existeix el paràmetre llibre, això voldrà dir que s'ha fet una petició d'actualització de dades sobre un llibre. Si obrim la pàgina directament:

http://localhost/prestar.jsp

o bé la cridem des de la pàgina índex.html, el paràmetre llibre no existeix, i ja no s'executarà el mètode d'actualització de préstecs del nostre Bean.

Si es dóna el cas que el paràmetre "llibre" conté un valor, hem d'actualitzar la base de dades abans de crear la llista de llibres que es representarà després a la pàgina. Hem d'esbrinar, doncs, què hem de fer amb el llibre en qüestió, donar-lo en préstec o retornar-lo. Aquesta informació viatja amb el paràmetre "accio".

Al recollir aquest paràmetre, hem de fer una conversió de cadena al tipus boolean. Els objectes request transporten tota la informació en forma de cadena. Nosaltres hem de llegir aquesta cadena, passar-la al tipus boolean i conmutar-ne el valor (si un llibre té el camp enprestec a true el que hem de fer és passa-lo a false i a l'inrevés). Aquestes passes les fem totes alhora amb aquesta expressió:

boolean accio =
!(Boolean.valueOf(request.getParameter("accio"))).booleanValue();

Ara que ja sabem què hem de fer, executem el mètode del nostre Bean, que ens canvia l'estat del llibre a la base de dades:

biblioteca.setEnprestec(llibre,accio);

Aquest és el conjunt d'accions a fer si obrim la pàgina des dels links dels llibres de la pròpia pàgina. Tot el codi que ve després s'executa sempre: creem la llista de llibres i la desenvolupem a la pàgina tot creant dinàmicament els enllaços al costat de cada llibre per a gestionar els préstecs.

   
Possiblement, la millor manera de moure la informació dels paràmetres entre pàgines web la tingueu en els formularis, els objectes "form" del llenguatge HTML. Podeu investigar sobre formularis en aquests cursos: D108 i D98.