Diferència entre revisions de la pàgina «NF2 - Llenguatge JSP (15h)»

De wikiserver
Dreceres ràpides: navegació, cerca
(Expressions)
(Exercici Sessions)
 
(Hi ha 57 revisions intermèdies del mateix usuari que no es mostren)
Línia 63: Línia 63:
 
</source>
 
</source>
 
=== taglib ===
 
=== taglib ===
S'empra per indicar que es van a emprar llibreries d'etiquetes. Per a mes informació veure JSTL.
+
S'empra per indicar que es van a emprar llibreries d'etiquetes. Per a mes informació veure [https://jstl.java.net/get-started.html JSTL].
  
 
== Declaracions ==
 
== Declaracions ==
Línia 106: Línia 106:
 
Es pot utilitzar també l'equivalent a etiquetes XML: '''<jsp:declaration>'''codi'''</jsp:declaration>'''
 
Es pot utilitzar també l'equivalent a etiquetes XML: '''<jsp:declaration>'''codi'''</jsp:declaration>'''
  
<source lang="java">
+
<source lang="xml">
 
<%-- Exemple sense etiquietes xml: --%>
 
<%-- Exemple sense etiquietes xml: --%>
 
<%!
 
<%!
Línia 133: Línia 133:
 
</html>
 
</html>
 
</source>
 
</source>
== Scriplets ==
+
== Scriptlets ==
 
Són fragments de codi Java amb la forma '''<% codi %>''', en general, podem inserir qualsevol codi que poguéssim usar dins d'una funció Java. Per accedir a la sortida del navegador, usem l'objecte implícit out.
 
Són fragments de codi Java amb la forma '''<% codi %>''', en general, podem inserir qualsevol codi que poguéssim usar dins d'una funció Java. Per accedir a la sortida del navegador, usem l'objecte implícit out.
 
Exemples:
 
Exemples:
Línia 166: Línia 166:
 
</source>
 
</source>
  
Es pot utilitzar també l'equivalent a etiquetes XML: '''<jsp:scriplet>'''codi'''</jsp:scriplet>'''
+
Es pot utilitzar també l'equivalent a etiquetes XML: '''<jsp:scriptlet>'''codi'''</jsp:scriptlet>'''
<source lang="java">
+
<source lang="xml">
 
<%-- Exemple sense etiquietes xml: --%>
 
<%-- Exemple sense etiquietes xml: --%>
 
<html>
 
<html>
Línia 184: Línia 184:
 
   <body>
 
   <body>
 
       Hello World!<br/>
 
       Hello World!<br/>
     <jsp:scriplet>
+
     <jsp:scriptlet>
 
         out.println("Your IP address is " + request.getRemoteAddr());
 
         out.println("Your IP address is " + request.getRemoteAddr());
     </jsp:scriplet>
+
     </jsp:scriptlet>
 
   </body>
 
   </body>
 
</html>
 
</html>
 
 
 
<jsp:scriptlet>
 
code fragment
 
</jsp:scriptlet>
 
 
</source>
 
</source>
  
Línia 225: Línia 219:
 
</source>
 
</source>
  
 +
== Accions ==
 +
Accions JSP utilitzen construccions en la sintaxi XML per controlar el comportament del motor de servlet. Dinàmicament pots inserir un arxiu , reutilitzar components JavaBeans, reenviar a l'usuari a una altra pàgina , o generar HTML per a un pluggin de Java.
  
 +
Només hi ha una sintaxi per a l'element d'acció , ja que s'ajusta a l'estàndard XML:
 
<source lang="xml">
 
<source lang="xml">
 
<jsp:action_name attribute ="value" />
 
<jsp:action_name attribute ="value" />
 
</source>
 
</source>
 +
 +
{|border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;"
 +
! align="left" width="150 px" style="background:Lavender; color:Black"|Sintaxi
 +
! align="left" width="150 px" style="background:Lavender; color:Black"|Propòsit
 +
|-
 +
| jsp:include ||Inclou un arxiu a la vegada que se sol·licita la pàgina
 +
|-
 +
| jsp:useBean ||Troba o instància un JavaBean
 +
|-
 +
| jsp:setProperty ||Estableix la propietat d'un JavaBean
 +
|-
 +
| jsp:getProperty ||Obté la propietat d'un JavaBean
 +
|-
 +
| jsp:forward ||envia al sol·licitant a una nova pàgina
 +
|-
 +
| jsp:plugin ||Genera codi específicament per a un navegador d'un objecte o EMBED tag
 +
|-
 +
| jsp:element|| Defineix els elements XML de forma dinàmica
 +
|-
 +
| jsp:attribute|| Defineix l'atribut de l'element XML.
 +
|-
 +
| jsp:body|| Defineix l'element body XML dinàmicament
 +
|-
 +
| jsp:text|| S'utilitza per escriure text de la plantilla en les pàgines i documents JSP
 +
|}
 +
 +
Exemples:
 +
<source lang="xml">
 +
<%-- Exemple1 --%>
 +
<html>
 +
  <head>
 +
      <jsp:include page="cabecera.jsp"/>
 +
  </head>
 +
  <body>
 +
      <jsp:include page="cuerpo.jsp">
 +
        <jsp:param name="tipo" value="paginaPrincipal"/>
 +
      </jsp:include>
 +
  </body>
 +
</html>
 +
<%-- Exemple2 --%>
 +
<jsp:forward page="principal.jsp">
 +
  <jsp:param name="titulo" value="Principal"/>
 +
</jsp:forward>
 +
</source>
 +
Per a més informació [http://www.tutorialspoint.com/jsp/jsp_actions.htm tutorial jsp].
 +
 +
== Exercicis ==
 +
=== System.getProperty ===
 +
Escriu una JSP per a la sortida dels valors retornats per System.getProperty per a diverses propietats del sistema, com java.version, java.home, os.name, user.name, user.home, user.dir etc.
 +
 +
Solució:
 +
<source lang="xml">
 +
 +
<%@page contentType="text/html" pageEncoding="UTF-8"%>
 +
<!DOCTYPE html>
 +
<html>
 +
    <head>
 +
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 +
        <title>System.getProperties</title>
 +
    </head>
 +
    <body>
 +
        <table border="1">
 +
            <tr>
 +
                <th>
 +
                    Nombres de las Propiedades
 +
                </th>
 +
                <th>
 +
                    Valores
 +
                </th>
 +
            </tr>
 +
           
 +
            <%
 +
                final String [] properties = {"java.runtime.name","java.vm.vendor",
 +
                    "java.runtime.version","java.vendor.url", "user.timezone",
 +
                    "user.language", "os.name", "sun.desktop"};
 +
               
 +
                for (int i = 0; i < properties.length; i++){
 +
                    String pnom = properties[i];
 +
                    String pvalor = System.getProperty(pnom);
 +
              %>
 +
             
 +
              <tr>
 +
                  <td>
 +
                      <%= pnom%>
 +
                  </td>
 +
                  <td>
 +
                      <%= pvalor%>
 +
                  </td>
 +
              </tr>
 +
             
 +
              <%
 +
                   
 +
                }
 +
              %>
 +
        </table>
 +
        <br><br>
 +
        **************************************************************<br>
 +
        Java Version es <%= System.getProperty("java.version")%><br>
 +
        JAva Home es <%= System.getProperty("java.home")%><br>
 +
        Sistema Operativo es <%= System.getProperty("os.name")%><br>
 +
        Nombre de usuario es <%= System.getProperty("user.name")%><br>
 +
        Home del usuario es <%= System.getProperty("user.home")%><br>
 +
        Directorio de usuario es <%= System.getProperty("user.dir")%><br>
 +
        ***************************************************************<br>
 +
        <br>
 +
       
 +
    </body>
 +
</html>
 +
 +
</source>
 +
 +
=== Dia i hora ===
 +
Escriu una JSP que mostri el dia que es avui de la següent manera, "Hola! El moment és ara ... " però utilitzant un scriptlet per a la cadena completa, incloent-hi les etiquetes HTML.
 +
 +
<source lang="xml">
 +
<%@page import="java.util.Calendar"%>
 +
<%@page import="java.util.Date"%>
 +
<%@page contentType="text/html" pageEncoding="UTF-8"%>
 +
<!DOCTYPE html>
 +
<html>
 +
    <head>
 +
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 +
        <title>JSP Calendar</title>
 +
    </head>
 +
    <body>
 +
       
 +
        Hola! avui es el dia:
 +
        <%
 +
            Date dia = new Date();
 +
            out.println(String.valueOf(dia));
 +
            out.println("<br>");
 +
           
 +
            Calendar t = Calendar.getInstance();
 +
            out.println(String.valueOf(t.getTime()));
 +
            out.println("<br>");
 +
           
 +
            out.println("Año: " + t.get(Calendar.YEAR));
 +
            out.println("<br>");
 +
           
 +
            out.println("Mes: " + t.get(Calendar.MONTH));
 +
            out.println("<br>");
 +
           
 +
            out.println("Dia del Mes: " + t.get(Calendar.DAY_OF_MONTH));
 +
            out.println("<br>");
 +
         
 +
            out.println("Dia de la semana: " + t.get(Calendar.DAY_OF_WEEK));
 +
            out.println("<br>");
 +
         
 +
            out.println("HORA (0-12): " + t.get(Calendar.HOUR));
 +
            out.println("<br>");
 +
           
 +
            out.println("AM o PM: " + t.get(Calendar.AM_PM));
 +
            out.println("<br>");
 +
           
 +
            out.println("HORA (0-24): " + t.get(Calendar.HOUR_OF_DAY));
 +
            out.println("<br>");
 +
           
 +
            out.println("Minutos: " + t.get(Calendar.MINUTE));
 +
            out.println("<br>");
 +
           
 +
            out.println("Segundos: " + t.get(Calendar.SECOND));
 +
            out.println("<br>");
 +
           
 +
            out.println("Milisegundos " + t.get(Calendar.MILLISECOND));
 +
            out.println("<br>");
 +
           
 +
       
 +
        %>
 +
    </body>
 +
</html>
 +
</source>
 +
 +
=== Salutació ===
 +
Crea una JSP que depenent de si una variable s'inicialitza a true o false dona un missatge o un altre.
 +
Exemple de missatge true:
 +
''Bon dia! bon dia! bon dia al de matí''
 +
 +
Exemple de missatge a false:
 +
''Bona tarda! Bona tarda! Bona tarda a tothom''
 +
<source lang="java">
 +
<%@page contentType="text/html" pageEncoding="UTF-8"%>
 +
<!DOCTYPE html>
 +
<html>
 +
    <head>
 +
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 +
        <title>SALUTACIÓ</title>
 +
    </head>
 +
    <body>
 +
        <%! boolean saludo = false; %>
 +
       
 +
        <%
 +
          if(saludo){
 +
        %>
 +
              <h1>BON DIA!</h1>
 +
        <%
 +
              saludo = !saludo;
 +
          }
 +
          else{
 +
        %>
 +
 
 +
              <h1>BONA TARDA!</h1>   
 +
             
 +
        <%
 +
              saludo = !saludo;
 +
          }
 +
        %>
 +
    </body>
 +
</html>
 +
</source>
 +
 +
=== jsp:fordward ===
 +
Crea una pagina jsp anomenada 'fordward.jsp' que enviï a una altre pàgina anomenada 'mostraparametres.jsp', utilitzant <jsp:fordward>, dos paràmetres.
 +
 +
Solució:
 +
<source lang="xml">
 +
<?xml version="1.0" encoding="UTF-8"?>
 +
 +
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
 +
 +
    <jsp:directive.page contentType="text/html" pageEncoding="UTF-8"/>
 +
 +
    <!-- any content can be specified here, e.g.: -->
 +
    <jsp:element name="text">
 +
        <jsp:attribute name="lang">EN</jsp:attribute>
 +
        <jsp:body>Hello World!</jsp:body>
 +
    </jsp:element>
 +
 +
        <jsp:forward page="mostraParametres.jsp">
 +
            <jsp:param name="JSP" value="MOLA"/>
 +
            <jsp:param name="PHP" value="MOLA MAS"/>
 +
        </jsp:forward>
 +
</jsp:root>
 +
 +
------------
 +
mostraParametres.jsp
 +
-------------
 +
<%@page contentType="text/html" pageEncoding="UTF-8"%>
 +
<!DOCTYPE html>
 +
<html>
 +
    <head>
 +
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 +
        <title>JSP Page</title>
 +
    </head>
 +
    <body>
 +
        <h1>PHP: <%= request.getParameter("PHP")%> </h1><br>
 +
        <h1>JSP: <%= request.getParameter("JSP")%> </h1>
 +
    </body>
 +
</html>
 +
</source>
 +
 +
== Objectes implícits ==
 +
En JSP disposem d'alguns objectes implícits, que ens permetran accedir a diferent informació i realitzar diverses accions. En JSP tenim els següents objectes implícits: request, response, out, session, application, config, pageContext, i page.
 +
 +
JSP suporta nou variables definides de forma automàtica, que també s'anomenen objectes implícits. Aquestes variables són:
 +
 +
{|border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;"
 +
! align="left" width="150 px" style="background:Lavender; color:Black"|Objecte implícit
 +
! align="left" width="150 px" style="background:Lavender; color:Black"|Propòsit
 +
|-
 +
| request ||Aquest és l'objecte HttpServletRequest associat amb la petició .
 +
|-
 +
| response ||Aquest és l'objecte HttpServletResponse associat amb la resposta al client .
 +
|-
 +
| out ||Aquest és l'objecte PrintWriter usat per a enviar la sortida al client .
 +
|-
 +
| session ||Aquest és l'objecte HttpSession associat amb la petició .
 +
|-
 +
| application ||Aquest és l'objecte ServletContext associat amb el context d'aplicació
 +
|-
 +
| config ||This is the ServletConfig object associated with the page.
 +
|-
 +
| pageContext || Això encapsula ús de les característiques específiques del servidor com el més alt JspWriters rendiment .
 +
|-
 +
| page || Això és simplement un sinònim d'aquesta , i s'utilitza per cridar als mètodes definits pel translated servet class
 +
|-
 +
| Exception || L'objecte d'excepció permet que les dades d'excepció per a tenir accés als designats JSP .
 +
|}
 +
 +
=== Objecte Request ===
 +
És un objetode la classe HttpServletRequest, el seu ús principal és l'accés als paràmetres de la petició. Destacarem les següents funcions:
 +
*'''String getParameter(String name)'''
 +
**Retorna el valor d'un paràmetre
 +
*'''Enumeration getParameterNames()'''
 +
**Retorna una enumeració amb els noms de tots els paràmetres de la petició.
 +
*'''String[] getParameterValues(String name)'''
 +
**Els paràmetres poden tenir valor múltiple, amb aquesta funció recuperem un array amb tots els valors per a un nom donat.
 +
*'''String getRemoteAddr()'''
 +
**Retorna la IP del host des del qual es realitza la petició
 +
 +
Exemple:
 +
<source lang="xml">
 +
<html>
 +
  <body>
 +
      <form>
 +
        <input type="text" name="parametro"/>
 +
        <input type="submit"/>
 +
      </form>
 +
      <br>
 +
      <br>
 +
        Su IP: <%=request.getRemoteAddr()%>
 +
      <br>
 +
        Su nombre de host: <%= request.getRemoteHost() %>
 +
      <br>
 +
        Valor del parámetro:
 +
      <%= request.getParameter("parametro") %>
 +
  </body>
 +
</html>
 +
</source>
 +
 +
=== Objecte Response ===
 +
És un objecte de la classe HttpServletResponse, que vas agafar al servlet en la seva generació de la resposta per al client, conté funcions per a maneig de capçaleres, codis d'estat, cookies i transferència de control.
 +
<source lang="java">
 +
<%@ page import="java.io.*,java.util.*" %>
 +
<html>
 +
  <head>
 +
      <title>Auto Refresh Header Example</title>
 +
  </head>
 +
  <body>
 +
      <center>
 +
      <h2>Auto Refresh Header Example</h2>
 +
  <%
 +
      // Set refresh, autoload time as 5 seconds
 +
      response.setIntHeader("Refresh", 5);
 +
      // Get current time
 +
      Calendar calendar = new GregorianCalendar();
 +
      String am_pm;
 +
      int hour = calendar.get(Calendar.HOUR);
 +
      int minute = calendar.get(Calendar.MINUTE);
 +
      int second = calendar.get(Calendar.SECOND);
 +
      if(calendar.get(Calendar.AM_PM) == 0)
 +
        am_pm = "AM";
 +
      else
 +
        am_pm = "PM";
 +
      String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
 +
      out.println("Current Time is: " + CT + "\n");
 +
  %>
 +
      </center>
 +
  </body>
 +
</html>
 +
</source>
 +
Per a més informació [http://www.tutorialspoint.com/jsp/jsp_server_response.htm tutorial jsp]
 +
=== Objecte Out ===
 +
És un objecte de la classe JspWriter, és el que ens permet accedir a la sortida del navegador des dels scriptlet.
 +
Els següents són els mètodes importants que volem utilitzar per escriure Char boolean , int , double , objecte , cordes , etc:
 +
 +
{|border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;"
 +
! align="left" width="150 px" style="background:Lavender; color:Black"|Método
 +
! align="left" width="150 px" style="background:Lavender; color:Black"|Descripción
 +
|-
 +
| out.print(dataType dt) ||mprimir una dada.
 +
|-
 +
| out.println(dataType dt) ||Imprimir una dada i acaba amb caràcter de nova línia.
 +
|-
 +
|}
 +
 +
=== Objecte Session ===
 +
És un objecte de la classe HttpSession. Ens permet accedir a la sessió associada a la petició. A través d'aquest objecte podem, entre altres coses, guardar objectes que seran accessibles des de qualsevol JSP de la sessió o invalidar-la.
 +
Per guardar i recuperar informació usarem:
 +
<source lang="java">
 +
Object session.getAttribute("clave");
 +
void session.setAttribute("clave", Object objeto);
 +
</source>
 +
 +
I per invalidar la sessió:
 +
<source lang="java">
 +
void session.invalidate();
 +
</source>
 +
 +
Exemple:
 +
<source lang="java">
 +
<%@ page session="true" %>
 +
<%
 +
  java.util.ArrayList accesos= (java.util.ArrayList)session.getAttribute("accesos");
 +
  if (accesos==null)
 +
      accesos=new java.util.ArrayList();
 +
      accesos.add(new java.util.Date().toString());
 +
      session.setAttribute("accesos", accesos);
 +
      if (request.getParameter("invalidaSesion")!=null)
 +
        session.invalidate();
 +
%>
 +
<html>
 +
  <body>
 +
      <form>
 +
        <input type="submit" name="invalidaSesion" value="Invalidar sesión"/>
 +
        <input type="submit" value="Recargar página"/>
 +
      </form>
 +
      <br/>
 +
      Usted accedió a esta página en los siguientes momentos: <br>
 +
      <%
 +
        for (int i=0;i<accesos.size();i++)
 +
        {
 +
      %>
 +
      <%= accesos.get(i) %>
 +
      <br>
 +
      <%
 +
        }
 +
      %>
 +
  </body>
 +
</html>
 +
</source>
 +
Per a més informació [http://www.tutorialspoint.com/jsp/jsp_session_tracking.htm tutorial jsp]
 +
 +
=== Objecte Application ===
 +
És un objecte de la classe ServletContext. Aquest objecte és comú per a tota l'aplicació web i, entre altres coses, ens permet emmagatzemar informació que serà accessible des de totes les pàgines de l'aplicació web, independentment de la sessió.
 +
Per guardar i recuperar valors:
 +
<source lang="java">
 +
Object application.getAttribute("clave");
 +
void application.setAttribute("clave", Object objeto);
 +
</source>
 +
 +
Exemple:
 +
<source lang="java">
 +
<%@ page session="true" %>
 +
<%
 +
  java.util.Hashtable direcciones = (java.util.Hashtable)application.getAttribute("direcciones");
 +
  if (direcciones==null)
 +
      direcciones=new java.util.Hashtable();
 +
      direcciones.put(request.getRemoteAddr(),"");
 +
      application.setAttribute("direcciones", direcciones);
 +
%>
 +
<html>
 +
  <body>
 +
      El servidor fue accedido desde las siguientes direcciones IP:
 +
      <%
 +
      java.util.Enumeration e= direcciones.keys();
 +
      while (e.hasMoreElements())
 +
      {
 +
      %>
 +
        <%= e.nextElement() %>
 +
        <br>
 +
      <%
 +
      }
 +
      %>
 +
      <br>
 +
  </body>
 +
</html>
 +
</source>
 +
Per a més informació [http://www.tutorialspoint.com/jsp/jsp_hits_counter.htm tutorial jsp]
 +
 +
=== Objecte Config ===
 +
És un objecte de la classe ServletConfig. Permet accedir a paràmetres d'inicialització del servlet i al seu context.
 +
Aquest objecte permet l'accés de JSP programador per als paràmetres d'inicialització de servlet o JSP motor com ara la camins o ubicacions d'arxius , etc.
 +
El següent mètode de configuració és l'únic que pot utilitzar sempre , i el seu ús és trivial :
 +
<source lang="java">
 +
config.getServletName();
 +
</source>
 +
Retorna el nom del servlet, que és la cadena continguda en el element <servlet-name>  es defineix en el WEB-INF\web.xml
 +
 +
=== Objecte PageContext ===
 +
 +
És un objecte de la classe PageContext. Entre altres coses, ens permet emmagatzemar informació localment a la pàgina.
 +
Per guardar i recuperar valors:
 +
<source lang="java">
 +
Object pageContext.getAttribute("clave");
 +
void pageContext.setAttribute("clave", Object objeto);
 +
</source>
 +
També podem usar PageContext per emmagatzemar i recuperar informació en sessió i en aplicació:
 +
Emmagatzemar en context de pàgina:
 +
<source lang="java">
 +
PageContext.setAttribute("clave", obj, PageContext.PAGE_SCOPE);
 +
PageContext.setAttribute("clave", obj);
 +
</source>
 +
Emmagatzemar en context de sessió:
 +
<source lang="java">
 +
PageContext.setAttribute("clave",obj, PageContext.SESSION_SCOPE);
 +
session.setAttribute("clave", objeto);
 +
</source>
 +
Emmagatzemar en context de aplicació:
 +
<source lang="java">
 +
PageContext.setAttribute("clave",obj,PageContext.APPLICATION_SCOPE);
 +
application.setAttribute("clave",objeto);
 +
</source>
 +
 +
Un dels mètodes importants és '''removeAttribute''', que accepta un o dos arguments. Per exemple, pageContext.removeAttribute("attrName") elimina  l'atribut de tots els àmbits, mentre que el següent codi només l'elimina de l'àmbit pàgina.
 +
<source lang="java">
 +
pageContext.removeAttribute("attrName", PAGE_SCOPE);
 +
</source>
 +
 +
=== Objecte Page ===
 +
Aquest objecte és una referència real a la instància de la pàgina. Es pot considerar com un objecte que representa el pàgina JSP sencera. L'objecte de pàgina és realment un sinònim directe per el objecte '''this'''.
 +
 +
== Exercicis ==
 +
 +
=== IP ===
 +
Escriu una pàgina jsp que ens mostri la IP del PC que ha fet la petició.
 +
 +
Solució:
 +
<source lang="xml">
 +
<%@page contentType="text/html" pageEncoding="UTF-8"%>
 +
<!DOCTYPE html>
 +
<html>
 +
    <head>
 +
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 +
        <title>JSP Page</title>
 +
    </head>
 +
    <body>
 +
        <h1>Nombre del ordenador: <%= request.getRemoteHost()%></h1>
 +
        <h1>Direccion IP : <%= request.getRemoteAddr()%></h1>
 +
    </body>
 +
</html>
 +
 +
</source>
 +
 +
=== Pas de paràmetres ===
 +
Escriviu una pàgina jsp que passa tres paràmetres a una altre pàgina JSP amb <jsp:include> i <jsp:param>. A més, la pàgina principal pot rebre tres paràmetres via GET (URL) i els mostra. Especifiqueu els tres paràmetres amb els noms: param1 , param2 i param3
 +
 +
<source lang="xml">
 +
//Pàgina ex_param_1.jsp
 +
<html>
 +
  <head></head>
 +
  <body>
 +
      <jsp:include page="//Pàgina ex_param_2.jsp" >
 +
        <br>
 +
        <jsp:param name="param1" value="val1" />
 +
        <br>
 +
        <jsp:param name="param2" value="val2" />
 +
        <br>
 +
        <jsp:param name="param3" value="val3" />
 +
      </jsp:include>
 +
      <br>
 +
      <b>Calling page:<b>
 +
      <br>   
 +
      Name1: <%= request.getParameter("param1") %>
 +
      <br>
 +
      Name2: <%= request.getParameter("param2") %>
 +
      <br>
 +
      Name3: <%= request.getParameter("param3") %>
 +
      <br>   
 +
    </body>
 +
</html>
 +
 +
//Pàgina ex_param_2.jsp
 +
<html>
 +
  <body>
 +
      <h2>Called page: </h2> 
 +
      <b>Names:</b>
 +
      <br>
 +
      Name1: <%= request.getParameter("param1") %>
 +
      <br>
 +
      Name2: <%= request.getParameter("param2") %>
 +
      <br>
 +
      Name3: <%= request.getParameter("param3") %>
 +
      <br>
 +
  </body>
 +
</html>
 +
</source>
 +
 +
=== Bucle ===
 +
 +
Escriviu un programa per mostrar els múltiples de dos. Inclou un bucle en el bloc scriptlet i mostra els números.
 +
 +
<source lang="xml">
 +
<html>
 +
    <body>
 +
        <h1>Displaying </h1>
 +
    <%
 +
        int res;     
 +
        int j=2;
 +
        for(int i=1;i<11;i++)
 +
        {
 +
            res=j*i;       
 +
            out.println(j + " * " + i + " = " + res);
 +
            out.println("<br>");
 +
        }
 +
    %>
 +
    </body>
 +
</html>
 +
</source>
 +
 +
== Comunicació entre formularis HTML i pàgines JSP ==
 +
 +
JSP s'encarrega d'analitzar les dades del formulari automàticament utilitzant els mètodes següents depenent de la situació:
 +
 +
{|border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;"
 +
! align="left" width="150 px" style="background:Lavender; color:Black"|Método
 +
! align="left" width="150 px" style="background:Lavender; color:Black"|Descripción
 +
|-
 +
| getParameter() ||obtenir el valor d'un paràmetre.
 +
|-
 +
| getParameterValues() || utilitza aquest mètode si el paràmetre apareix més d'una vegada i Retorna múltiple valors , per exemple checkbox.
 +
|-
 +
| getParameterNames() || utilitza aquest mètode si desitges una llista completa de tots els noms dels paràmetres en la petició actual.
 +
|-
 +
| getInputStream(): ||utilitza aquest mètode per llegir flux de dades binàries que ve des del client.
 +
|-
 +
|}
 +
 +
=== Exemple GET ===
 +
<source lang="xml">
 +
<html>
 +
    <head>
 +
          <title>Using GET Method to Read Form Data</title>
 +
    </head>
 +
    <body>
 +
          <center>
 +
                <h1>Using GET Method to Read Form Data</h1>
 +
  </center>
 +
          <ul>
 +
              <li><p><b>First Name:</b>
 +
                  <%= request.getParameter("first_name")%>
 +
              </p></li>
 +
              <li><p><b>Last Name:</b>
 +
                  <%= request.getParameter("last_name")%>
 +
              </p></li>
 +
          </ul>
 +
    </body>
 +
</html>
 +
 +
---------
 +
 +
<html>
 +
    <body>
 +
        <form action="main.jsp" method="GET">
 +
              First Name: <input type="text" name="first_name">
 +
              <br />
 +
              Last Name: <input type="text" name="last_name" />
 +
              <input type="submit" value="Submit" />
 +
        </form>
 +
    </body>
 +
</html>
 +
 +
</source>
 +
 +
=== Exemple POST ===
 +
 +
<source lang="xml">
 +
<html>
 +
    <body>
 +
        <form action="main.jsp" method="POST">
 +
              First Name: <input type="text" name="first_name">
 +
              <br />
 +
              Last Name: <input type="text" name="last_name" />
 +
              <input type="submit" value="Submit" />
 +
        </form>
 +
    </body>
 +
</html>
 +
 +
--------------
 +
<html>
 +
    <head>
 +
          <title>Using GET and POST Method to Read Form Data</title>
 +
    </head>
 +
    <body>
 +
          <center>
 +
              <h1>Using GET Method to Read Form Data</h1>
 +
          </center>
 +
          <ul>
 +
              <li><p><b>First Name:</b>
 +
              <%= request.getParameter("first_name")%>
 +
              </p></li>
 +
              <li><p><b>Last Name:</b>
 +
              <%= request.getParameter("last_name")%>
 +
              </p></li>
 +
          </ul>
 +
    </body>
 +
</html>
 +
 +
----------------
 +
Exemple 2:
 +
----------------
 +
<html>
 +
    <body>
 +
          <form action="main.jsp" method="POST" target="_blank">
 +
                <input type="checkbox" name="maths" checked="checked" /> Maths
 +
                <input type="checkbox" name="physics" /> Physics
 +
                <input type="checkbox" name="chemistry" checked="checked" /> Chem
 +
                <input type="submit" value="Select Subject" />
 +
          </form>
 +
    </body>
 +
</html>
 +
 +
<%@ page import="java.io.*,java.util.*" %>
 +
<html>
 +
      <head>
 +
            <title>HTTP Header Request Example</title>
 +
      </head>
 +
      <body>
 +
            <center>
 +
                  <h2>HTTP Header Request Example</h2>
 +
         
 +
            <table width="100%" border="1" align="center">
 +
                  <tr bgcolor="#949494">
 +
                        <th>Param Name</th><th>Param Value(s)</th>
 +
                  </tr>
 +
                  <%
 +
                      Enumeration paramNames = request.getParameterNames();
 +
                      while(paramNames.hasMoreElements()) {
 +
                              String paramName = ( String )paramNames.nextElement();
 +
                              out.print("<tr><td>" + paramName + "</td>\n");
 +
                              String paramValue = request.getHeader(paramName);
 +
                              out.println("<td> " + paramValue + "</td></tr>\n");
 +
                      }
 +
                  %>
 +
            </table>
 +
          </center>
 +
      </body>
 +
</html>
 +
 +
</source>
 +
 +
==Exercicis ==
 +
=== JSP amb cap i peus===
 +
L’objectiu d’aquesta activitat és mostrar el funcionament de la inclusió d’arxius a PHP. Fer servir includes us permet simplificar el codi de les pàgines. Per exemple, podeu afegir un fitxer de capçalera (cap.jsp) i un de peu (peu.jsp) amb els continguts comuns de totes les pàgines del vostre lloc (el bàner, el menú, la informació general). Senzillament incloent aquests fitxers a totes les pàgines, podeu aconseguir una estètica comú. Si heu de canviar en algun moment la capçalera, modificant l’arxiu cap.php ho tindreu modificat a totes les pàgines del web. Feu una pàgina web amb continguts estructurats amb dos fitxers: cap.jsp i peu.jsp
 +
 +
=== Login ===
 +
Crea un formulari HTML com el del [https://proxy proxy] del institut que utilitzi el mètode GET i un altre que utilitzi el mètode POST. Imprimeix per pantalla el nom d'usuari i la contrasenya codificada en MD5 i en SAH1. A més a més, hi ha la possibilitat d'enviar una imatge (menor d'un 1 mb) com a avatar del usuari.
 +
 +
== JSP SESSION ==
 +
HTTP és un protocol "sense estat", la qual cosa significa que cada vegada que un client recupera una pàgina Web, el client obre una connexió independent per al servidor Web i el servidor de forma automàtica no manté cap registre de l'anterior petició del client.
 +
 +
JSP fa ús de la interfície HttpSession que proporciona una manera d'identificar a un usuari a través de més d'una sol·licitud de pàgina o visita a un lloc web i també, per emmagatzemar informació sobre aquest usuari.
 +
 +
De forma predeterminada, JSP permet el seguiment de sessió i,per això, es crea un nou objecte HttpSession per a cada nou client automàticament. La desactivació del seguiment de sessió requereix configurar la directiva de sessió de pàgina en fals de la següent manera:
 +
 +
<source lang="xml">
 +
<%@ page session="false" %>
 +
</source>
 +
 +
Podem accedir a la sessió d'un usuari utilitzant l'objecte implícit que ens proporciona el motor JSP: '''session'''.
 +
 +
Des de l'objecte de sessió, el programador pot començar immediatament a emmagatzemar i recuperar dades sense haver d'inicialitzar la sessió.
 +
 +
Heus aquí un resum dels mètodes importants disponibles a través d'objecte de sessió:
 +
 +
{|border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;"
 +
! align="left" width="150 px" style="background:Lavender; color:Black"|Mètode
 +
! align="left" width="150 px" style="background:Lavender; color:Black"|Descripció
 +
|-
 +
| public Object getAttribute(String name) || retorna l'objecte vinculat amb el nom especificat en aquesta sessió , o null si no hi ha cap objecte vinculat sota el nom
 +
|-
 +
| public Enumeration getAttributeNames() || retorna una enumeració d'objectes String que contenen els noms de tots els objectes vinculats en aquesta sessió
 +
|-
 +
| public long getCreationTime() || retorna el temps quan es va crear aquesta sessió, mesurat en mil·lisegons des de la mitjanit del 01 de gener 1970 GMT
 +
|-
 +
| public String getId()||Retorna una cadena que conté l'identificador únic assignat a aquesta sessió.
 +
|-
 +
| public long getLastAccessedTime() || retorna l'última vegada que el client va enviar una sol·licitud associada amb aquesta sessió, com el nombre
 +
de mil·lisegons des de la mitjanit 01 de gener 1970 GMT .
 +
|-
 +
| public int getMaxInactiveInterval() || retorna l'interval de temps màxim, en segons, que el contenidor de servlets mantindrà aquesta sessió
 +
oberta entre diferents accessos del client
 +
|-
 +
| public void invalidate() || invalida aquesta sessió i desvincula els objectes units a ell.
 +
|-
 +
| public boolean isNew() || devuelve true si es la primera vez que l'usuari accedeix i llavors, s'acaba de crear la sessió.
 +
|-
 +
| public void removeAttribute(String name) || elimina l'objecte vinculat amb el nom especificat d'aquesta sessió .
 +
|-
 +
| public void setAttribute(String name, Object value) || s'uneix un objecte per a aquesta sessió, utilitzant el nom especificat ..
 +
|-
 +
| public void setMaxInactiveInterval(int interval) ||especifica el temps, en segons, entre les sol·licituds del client abans que el contenidor de servlets invalidi aquesta sessió
 +
|-
 +
|}
 +
'''Web.xml'''
 +
 +
Si està utilitzant Tomcat , a part dels mètodes esmentats anteriorment, pots configurar temps de la sessió en l'arxiu web.xml de la següent manera:
 +
<source lang="xml">
 +
<session-config>
 +
      <session-timeout>15</session-timeout>
 +
</session-config>
 +
</source>
 +
El temps d'espera s'expressa en minuts, i anul·la el temps d'espera predeterminat que està configurat  a 30 minuts en Tomcat.
 +
 +
== JSP Cookies ==
 +
Són arxius de text emmagatzemats en l'equip client i que es mantenen durant un temps.
 +
 +
Normalment, les Cookies s'estableixen en el header de la petició HTTP. Una petició HTTP que vulgui enviar una cookie utilitzarà un header semblant a aquest:
 +
<source lang="xml">
 +
HTTP/1.1 200 OK
 +
Date: Fri, 04 Feb 2000 21:03:38 GMT
 +
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
 +
Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT;
 +
            path=/; domain=tutorialspoint.com
 +
Connection: close
 +
Content-Type: text/html
 +
</source>
 +
 +
Si l'usuari accedix a la pàgina que coincideix amb la ruta i el domini de la cookie, el navegador enviarà la cookie al servidor. El header de la petició http seria la següent:
 +
 +
<source lang="xml">
 +
GET / HTTP/1.0
 +
Connection: Keep-Alive
 +
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
 +
Host: zink.demon.co.uk:1126
 +
Accept: image/gif, */*
 +
Accept-Encoding: gzip
 +
Accept-Language: en
 +
Accept-Charset: iso-8859-1,*,utf-8
 +
Cookie: name=xyz
 +
</source>
 +
 +
Heus aquí un resum dels mètodes importants disponibles a través d'objecte de sessió:
 +
 +
{|border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;"
 +
! align="left" width="150 px" style="background:Lavender; color:Black"|Mètode
 +
! align="left" width="150 px" style="background:Lavender; color:Black"|Descripció
 +
|-
 +
| public void setDomain(String pattern) ||  assigna el domini de la cookie (ex: www.infomerce.es)
 +
|-
 +
| public String getDomain() || Retorna el domini d'on la s'aplica la cookie
 +
|-
 +
| public void setMaxAge(int expiry)|| estableix l'edat màxima de la cookie, especificat en segons ,de forma predeterminada, -1 indica que perdurarà fins que és tanqui el navedador
 +
|-
 +
| public int getMaxAge() || retorna l'edat màxima de la cookie, especificat en segons ,de forma predeterminada, -1 indica que perdurarà fins que és tanqui el navedador
 +
|-
 +
|public String getName() || Retorna el nom de la cookie. Aquest nom no es pot modificar després de la seva creació.
 +
|-
 +
| public void setValue(String newValue) || Estableix el valor de la cookie.
 +
|-
 +
| public String getValue() ||  Retorna el valor de la cookie.
 +
|-
 +
| public void setPath(String uri) ||  Estableix el 'path' on s'aplica la cookie. Si no s'especifica s'agafa el 'path' del fitxer que crea la cookie i es pot utilitzar en aquest path i en els subirectoris que hi hagin.
 +
|-
 +
| public void setSecure(boolean flag) ||  Especifica si la cookie s'enviarà només si la connexió es segura. (True només l'envia si la connexió és SSL)
 +
|-
 +
| public void setComment(String purpose) ||  Estableix un comentari que descriu el propòsit de la cookie.
 +
|-
 +
| public String getComment() || Retorna el comentari de la cookie.
 +
|-
 +
|}
 +
 +
 +
''' Crear i llegir una cookie amb JSP '''
 +
Pots crear una cookie cridant al constructor de la classe cookie. Al constructor s'ha de passar per paràmetres la clau i el valor de la cookie:
 +
 +
<source lang="java">
 +
Cookie cookie = new Cookie("clau","valor");
 +
</source>
 +
 +
No es pot utilitzar cap dels següents caràcters ni a les claus ni als valors:
 +
<pre>
 +
" " [ ] = , " / ? @ : ; ( )
 +
</pre>
 +
 +
Una vegada creada la cookie s'ha de establir el temps màxim de vida:
 +
<source lang="php">
 +
cookie.setMaxAge(60*60*24);
 +
</source>
 +
 +
Per últim, s'ha d'enviar al header de la peticiío HTTP mitjançant l'objecte response:
 +
<source lang="java">
 +
response.addCookie(cookie);
 +
</source>
 +
 +
Exemple complert:
 +
<source lang="java">
 +
<%
 +
// Create cookies for first and last names.
 +
    Cookie firstName = new Cookie("first_name",
 +
            request.getParameter("first_name"));
 +
    Cookie lastName = new Cookie("last_name",
 +
            request.getParameter("last_name"));
 +
// Set expiry date after 24 Hrs for both the cookies.
 +
    firstName.setMaxAge(60 * 60 * 24);
 +
    lastName.setMaxAge(60 * 60 * 24);
 +
// Add both the cookies in the response header.
 +
    response.addCookie(firstName);
 +
    response.addCookie(lastName);
 +
%>
 +
<html>
 +
    <head>
 +
        <title> Setting Cookies </title>
 +
    </head>
 +
    <body>
 +
    <center>
 +
        <h1> Setting Cookies </h1>
 +
    </center>
 +
    <ul>
 +
        <li><p><b> First Name: </b>
 +
                    <%= request.getParameter("first_name")%>
 +
            </p></li>
 +
        <li><p><b> Last
 +
                    Name: </b>
 +
                    <%= request.getParameter("last_name")%>
 +
            </p></li>
 +
    </ul>
 +
</body>
 +
</html>
 +
 +
</source>
 +
 +
Exemple per llegir una cookie:
 +
<source lang="java">
 +
<html>
 +
    <head>
 +
        <title> Reading Cookies </title>
 +
    </head>
 +
    <body>
 +
    <center>
 +
        <h1> Reading Cookies </h1>
 +
    </center>
 +
    <%
 +
        Cookie cookie = null;
 +
        Cookie[] cookies = null;
 +
    // Get an array of Cookies associated with this domain
 +
        cookies = request.getCookies();
 +
        if (cookies != null) {
 +
            out.println("<h2> Found Cookies Name and Value</h2>");
 +
            for (int i = 0; i < cookies.length; i++) {
 +
                cookie = cookies[i];
 +
                out.print("Name : " + cookie.getName() + ", ");
 +
                out.print("Value: " + cookie.getValue() + " <br/>");
 +
            }
 +
        } else {
 +
            out.println("<h2>No cookies founds</h2>");
 +
        }
 +
    %>
 +
</body>
 +
</html>
 +
</source>
 +
 +
''' Esborrar una cookie amb JSP '''
 +
 +
Si es vol esborrar una cookie s'ha de seguir tres passos:
 +
* Llegeix una cookie que existeix i guarda-la en un objecte cookie
 +
* Estableix a 0 la durada de la cookie amb setMaxAge()
 +
* Envia la cookie al navedador amb l'objecte response.
 +
 +
Exemple:
 +
<source lang="java">
 +
<html>
 +
    <head>
 +
        <title> Reading Cookies </title>
 +
    </head>
 +
    <body>
 +
    <center>
 +
        <h1> Reading Cookies </h1>
 +
    </center>
 +
    <%
 +
        Cookie cookie = null;
 +
 +
        Cookie[] cookies = null;
 +
    // Get an array of Cookies associated with this domain
 +
        cookies = request.getCookies();
 +
        if (cookies != null) {
 +
            out.println("<h2> Found Cookies Name and Value</h2>");
 +
            for (int i = 0; i < cookies.length; i++) {
 +
                cookie = cookies[i];
 +
                if ((cookie.getName()).compareTo("first_name") == 0) {
 +
                    cookie.setMaxAge(0);
 +
                    response.addCookie(cookie);
 +
                    out.print("Deleted cookie: "
 +
                            + cookie.getName() + "<br/>");
 +
                }
 +
                out.print("Name : " + cookie.getName() + ", ");
 +
                out.print("Value: " + cookie.getValue() + " <br/>");
 +
            }
 +
        } else {
 +
            out.println(
 +
                    "<h2>No cookies founds</h2>");
 +
        }
 +
    %>
 +
</body>
 +
</html>
 +
</source>
 +
 +
== Exercici cookies i sessions ==
 +
===Exercici Sessions===
 +
Dona la següent informació de la sessió:
 +
*id
 +
*Data i hora de creació
 +
*La última vegada que es va accedir
 +
*L'identificador d'usuari
 +
*Número de visites
 +
A més a més, fes que aparegui un titul donant la benvinguda a la pàgina. Fes que sigui diferent segons sigui la primera vegada que accedeix o un altre.
 +
 +
<source lang="xml">
 +
<html>
 +
    <head>
 +
        <title> JSP Expressions </title>
 +
    </head>
 +
    <body bgColor="white">
 +
        <h2>Simple JSP Expression</h2>
 +
        <ul><font color = “#0000FF”>
 +
            <li> <font color = “#0000FF”> Session id:<%= session.getId()%>
 +
            <li> <font color = “#0000FF”> Creation time:<%= new java.util.Date(session.getCreationTime())%>
 +
            <li> <font color = “#0000FF”> Time of last access: " + <%= new java.util.Date(session.getLastAccessedTime())%>
 +
        </ul>
 +
    </body>
 +
</html>
 +
</source>
 +
 +
=== Carret de la compra ===
 +
Escribe un programa para mostrar la cesta de la compra. La página web debe tener un botón para agregar un elemento al carrito , y otro botón para eliminar un elemento de la compra. La página web debe mostrar los cambios realizados en el carrito.
 +
<source lang="java">
 +
<html>
 +
    <%
 +
    java.util.Vector v = (java.util.Vector)session.getAttribute("array");
 +
    if (v == null)
 +
    {
 +
            v = new java.util.Vector();
 +
    }
 +
String i = null;
 +
String submit = request.getParameter("submit");
 +
 +
    if (submit == null)
 +
    {
 +
            submit = "";
 +
    }
 +
if (submit.equals("add") || submit.equals(""))
 +
    {
 +
                    v.addElement(request.getParameter("item"));
 +
    %>
 +
    <br> Your cart Contains :
 +
    <ol>
 +
        <%
 +
                String[] items = new String[v.size()];
 +
                v.copyInto(items);
 +
                for (int ix=1; ix < items.length; ix++) {
 +
        %>
 +
        <li> <% out.print(items[ix]);
 +
        }
 +
            %>
 +
    </ol>
 +
 +
    <%
 +
}
 +
if (submit.equals("remove"))
 +
{
 +
    String removeitem=request.getParameter("item");
 +
            if(v.contains(removeitem))
 +
{
 +
                    v.removeElement(removeitem);
 +
            }
 +
            else
 +
            {
 +
                    out.println("element not found in vector");
 +
            }
 +
 +
    %>
 +
    <br> Your cart Contains :
 +
    <ol>
 +
        <%
 +
                String[] items = new String[v.size()];
 +
                v.copyInto(items);
 +
                for (int ix=1; ix<items.length; ix++) {
 +
        %>
 +
        <li> <% out.print(items[ix]);
 +
        }
 +
            %>
 +
    </ol>
 +
 +
    <%
 +
}
 +
session.setAttribute("array",v);
 +
    %>
 +
 +
    </font>
 +
    <hr>
 +
 +
    <font size = 3>
 +
    <form type=POST>
 +
        <BR>
 +
        Please Select the item to add or remove:
 +
        <br>
 +
        Add / Remove Item:
 +
        <select name="item">
 +
            <option>Floppy
 +
            <option>CD
 +
            <option>Keyboard
 +
        </select>
 +
        <br> <br>
 +
        <input type=submit name="submit" value="add">
 +
        <input type=submit name="submit" value="remove">
 +
 +
    </form>
 +
    </font>
 +
</html>               
 +
</source>
 +
 +
=== Nombre de sessions ===
 +
Escriu un programa que conti i mostri el nombre de sessions actives al servidor Tomcat.
 +
 +
=== Comptador ===
 +
Crea un contador que mostri el número de vegades que ha entrat cada usuari. No és un comptador general, si no, un comptador per usuari.
 +
 +
=== Colors ===
 +
Crea una pàgina jsp que permeti cambiar el color de fons de la pàgina. Aquest color l'ha de recordar i cada vegada que l'usuari entri s'estableixi el color que habioa escollit l'usuari.

Revisió de 19:02, 24 nov 2014

Java Server Pages (JSP)

JavaServer Pages (JSP) és una tecnologia basada en el llenguatge Java que permet incorporar contingut dinàmic a les pàgines web. Els arxius JSP combinen HTML amb etiquetes especials i fragments de codi Java. El codi font d'una pàgina JSP pot contenir:

  • Directives: Indiquen informació general de la pàgina, com pot ser importació de classes, pàgina a invocar davant errors, si la pàgina forma part d'una sessió, etc.
  • Declaracions: Serveixen per declarar mètodes o variables.
  • Scriptlets: Codi Java embegut.
  • Expressions: Expressions Java que s'avaluen i s'envien a la sortida.
  • Tags JSP: Etiquetes especials que interpreta el servidor.

Exemple de JSP:

<%@page import="java.util.*"%>
<%! String cadena="Bienvenidos a JSP"; %>
<html>
  <body>
    <%= cadena %>
    <br>
    <% out.println(new Date()); %>
  </body>
</html>

Directives

Les directives són elements que proporcionen informació al motor JSP, i influiran en l'estructura del servlet generat. Hi ha tres tipus de directives: page, taglib i include.

page

S'indica amb la forma <%@ page atribut="valor">. Té diversos usos, entre els quals destacarem:

  • Importar classes. Importar codi, de la mateixa forma que es realitza en un programa en Java,

s'indica amb l'atribut import. Exemple:

<%@page import="java.io.*, miPackage.miClase"%>
  • Indicar si la pàgina tindrà accés a la sessió. S'especifica amb l'atribut session. L'ús de sessions es veurà amb més detall a l'apartat d'objectes implícits.

Exemple:

<%@page session="true" import="java.util.ArrayList"%>
  • Gestió d'errors. Permet redireccionar a una pàgina quan es produeixi un error, s'indicaamb els atributs errorPage i isErrorPage.

Exemple:

<%@page errorPage="error.jsp">
         [...]
<%@page isErrorPage="yes">
<html>
   <body>
    Error, contacte con el administrador [...]
   </body>
</html>

include

Permet incloure un arxiu en el lloc on s'especifiqui, al contrari que amb l'acció <jsp:include> que veurem més endavant, la directiva include simplement copia el contingut de l'arxivo byte a byte, sent el resultat similar a si copiéssim el text de l'arxiu inclòs i ho peguéssim en el JSP. Exemple:

<html>
   <head>
      <%@ include file="titulo.txt"%>
   </head>
   <body>
      <%@ include file="cuerpoPagina.jsp"%>
   </body>
</html>

taglib

S'empra per indicar que es van a emprar llibreries d'etiquetes. Per a mes informació veure JSTL.

Declaracions

Contenen declaracions de variables o mètodes, amb la forma <%! declaració %>. Aquestes variables o mètodes seran accessibles des de qualsevol lloc de la pàgina JSP. Cal tenir en compte que el servidor transforma la pàgina JSP en un servlet, i aquest és usat per múltiples peticions, la qual cosa provoca que les variables conservin el seu valor entre successives execucions. Exemples:

<%-- Exemple 1 --%>
<%! int numeroAccesos=0; %>
<html>
   <body>
   <%=
       "La página ha sido accedida "+(++numeroAccesos)+
       " veces desde el arranque del servidor"
   %>
   </body>
</html>

<%-- Exemple 2 --%>
<%! java.util.Date primerAcceso=new java.util.Date(); %>
<html>
   <body>
   El primer acceso a la página se realizo en:
   <%= primerAcceso %>
   </body>
</html>

<%-- Exemple 3 --%>
<%!
private String ahora()
{
return ""+new java.util.Date();
}
%>
<html>
   <body>
   <%= ahora() %>
   </body>
</html>

Es pot utilitzar també l'equivalent a etiquetes XML: <jsp:declaration>codi</jsp:declaration>

<%-- Exemple sense etiquietes xml: --%>
<%!
private String ahora()
{
return ""+new java.util.Date();
}
%>
<html>
   <body>
   <%= ahora() %>
   </body>
</html>

<%-- Exemple amb etiquietes xml: --%>
<jsp:declaration>
private String ahora()
{
return ""+new java.util.Date();
}
</jsp:declaration>
<html>
   <body>
   <%= ahora() %>
   </body>
</html>

Scriptlets

Són fragments de codi Java amb la forma <% codi %>, en general, podem inserir qualsevol codi que poguéssim usar dins d'una funció Java. Per accedir a la sortida del navegador, usem l'objecte implícit out. Exemples:

<%-- Exemple 1 --%>
<table>
   <% for (int i=0;i<10;i++)
   {
    %>
   <tr><td> <%=i%> </td></tr>
    <% }
    %>
</table>

<%-- Exemple 2 --%>
<%
out.println("<table>");
for (int i=0;i<10;i++)
out.println("<tr><td>"+i+"</td></tr>");
out.println("</table>");
%>

<%-- Exemple 3 --%>
<%
String parametro1=request.getParameter("parametro1");
String parametro2=request.getParameter("parametro2");
MiClase miClase=new MiClase();
String salida=miClase.procesa(parametro1, parametro2);
%>
...
<%= salida %>

Es pot utilitzar també l'equivalent a etiquetes XML: <jsp:scriptlet>codi</jsp:scriptlet>

<%-- Exemple sense etiquietes xml: --%>
<html>
   <head><title>Hello World</title></head>
   <body>
      Hello World!<br/>
      <%
         out.println("Your IP address is " + request.getRemoteAddr());
      %>
   </body>
</html>

<%-- Exemple amb etiquietes xml: --%>
<html>
   <head><title>Hello World</title></head>
   <body>
      Hello World!<br/>
     <jsp:scriptlet>
         out.println("Your IP address is " + request.getRemoteAddr());
     </jsp:scriptlet>
   </body>
</html>

Expressions

Són fragments de codi Java, amb la forma <%= expressió %> que s'avaluen i es mostren en la sortida del navegador. En general, dins d'una expressió podem usar qualsevol cosa que usaríem dins de un System.out.print(expr); Exemples:

<%= "Tamaño de cadena: "+cadena.length() %>
<%= new java.util.Date() %>
<%= Math.PI*2 %>

Es pot utilitzar també l'equivalent a etiquetes XML: <jsp:expression>codi</jsp:expression>

<%-- Exemple sense etiquietes xml: --%>
<%= "Tamaño de cadena: "+cadena.length() %>
<%= new java.util.Date() %>
<%= Math.PI*2 %>

<%-- Exemple amb etiquietes xml: --%>
<jsp:expression>
 "Tamaño de cadena: "+ cadena.length()
</jsp:expression> 
<jsp:expression>
new java.util.Date()
</jsp:expression>
<jsp:expression>
Math.PI*2
</jsp:expression>

Accions

Accions JSP utilitzen construccions en la sintaxi XML per controlar el comportament del motor de servlet. Dinàmicament pots inserir un arxiu , reutilitzar components JavaBeans, reenviar a l'usuari a una altra pàgina , o generar HTML per a un pluggin de Java.

Només hi ha una sintaxi per a l'element d'acció , ja que s'ajusta a l'estàndard XML:

<jsp:action_name attribute ="value" />
Sintaxi Propòsit
jsp:include Inclou un arxiu a la vegada que se sol·licita la pàgina
jsp:useBean Troba o instància un JavaBean
jsp:setProperty Estableix la propietat d'un JavaBean
jsp:getProperty Obté la propietat d'un JavaBean
jsp:forward envia al sol·licitant a una nova pàgina
jsp:plugin Genera codi específicament per a un navegador d'un objecte o EMBED tag
jsp:element Defineix els elements XML de forma dinàmica
jsp:attribute Defineix l'atribut de l'element XML.
jsp:body Defineix l'element body XML dinàmicament
jsp:text S'utilitza per escriure text de la plantilla en les pàgines i documents JSP

Exemples:

<%-- Exemple1 --%>
<html>
   <head>
      <jsp:include page="cabecera.jsp"/>
   </head>
   <body>
      <jsp:include page="cuerpo.jsp">
         <jsp:param name="tipo" value="paginaPrincipal"/>
      </jsp:include>
   </body>
</html>
<%-- Exemple2 --%>
<jsp:forward page="principal.jsp">
   <jsp:param name="titulo" value="Principal"/>
</jsp:forward>

Per a més informació tutorial jsp.

Exercicis

System.getProperty

Escriu una JSP per a la sortida dels valors retornats per System.getProperty per a diverses propietats del sistema, com java.version, java.home, os.name, user.name, user.home, user.dir etc.

Solució:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>System.getProperties</title>
    </head>
    <body>
        <table border="1">
            <tr>
                <th>
                    Nombres de las Propiedades
                </th>
                <th>
                    Valores
                </th>
            </tr>
            
            <%
                final String [] properties = {"java.runtime.name","java.vm.vendor",
                    "java.runtime.version","java.vendor.url", "user.timezone",
                    "user.language", "os.name", "sun.desktop"};
                
                for (int i = 0; i < properties.length; i++){
                    String pnom = properties[i];
                    String pvalor = System.getProperty(pnom);
              %>
              
              <tr>
                  <td>
                      <%= pnom%>
                  </td>
                  <td>
                      <%= pvalor%>
                  </td>
              </tr>
              
              <%
                    
                }
              %> 
        </table>
        <br><br>
        **************************************************************<br>
        Java Version es <%= System.getProperty("java.version")%><br>
        JAva Home es <%= System.getProperty("java.home")%><br>
        Sistema Operativo es <%= System.getProperty("os.name")%><br>
        Nombre de usuario es <%= System.getProperty("user.name")%><br>
        Home del usuario es <%= System.getProperty("user.home")%><br>
        Directorio de usuario es <%= System.getProperty("user.dir")%><br>
        ***************************************************************<br>
        <br>
        
    </body>
</html>

Dia i hora

Escriu una JSP que mostri el dia que es avui de la següent manera, "Hola! El moment és ara ... " però utilitzant un scriptlet per a la cadena completa, incloent-hi les etiquetes HTML.

<%@page import="java.util.Calendar"%>
<%@page import="java.util.Date"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Calendar</title>
    </head>
    <body>
        
        Hola! avui es el dia:
        <%
            Date dia = new Date();
            out.println(String.valueOf(dia));
            out.println("<br>");
            
            Calendar t = Calendar.getInstance();
            out.println(String.valueOf(t.getTime()));
            out.println("<br>");
            
            out.println("Año: " + t.get(Calendar.YEAR));
            out.println("<br>");
            
            out.println("Mes: " + t.get(Calendar.MONTH));
            out.println("<br>");
            
            out.println("Dia del Mes: " + t.get(Calendar.DAY_OF_MONTH));
            out.println("<br>");
           
            out.println("Dia de la semana: " + t.get(Calendar.DAY_OF_WEEK));
            out.println("<br>");
           
            out.println("HORA (0-12): " + t.get(Calendar.HOUR));
            out.println("<br>");
            
            out.println("AM o PM: " + t.get(Calendar.AM_PM));
            out.println("<br>");
            
            out.println("HORA (0-24): " + t.get(Calendar.HOUR_OF_DAY));
            out.println("<br>");
            
            out.println("Minutos: " + t.get(Calendar.MINUTE));
            out.println("<br>");
            
            out.println("Segundos: " + t.get(Calendar.SECOND));
            out.println("<br>");
            
            out.println("Milisegundos " + t.get(Calendar.MILLISECOND));
            out.println("<br>");
            
        
        %>
    </body>
</html>

Salutació

Crea una JSP que depenent de si una variable s'inicialitza a true o false dona un missatge o un altre. Exemple de missatge true: Bon dia! bon dia! bon dia al de matí

Exemple de missatge a false: Bona tarda! Bona tarda! Bona tarda a tothom

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>SALUTACIÓ</title>
    </head>
    <body>
        <%! boolean saludo = false; %>
        
        <%
          if(saludo){
        %>
              <h1>BON DIA!</h1>
         <%
              saludo = !saludo;
          }
          else{
         %>
   
              <h1>BONA TARDA!</h1>    
              
         <%
              saludo = !saludo;
          }
        %>
    </body>
</html>

jsp:fordward

Crea una pagina jsp anomenada 'fordward.jsp' que enviï a una altre pàgina anomenada 'mostraparametres.jsp', utilitzant <jsp:fordward>, dos paràmetres.

Solució:

<?xml version="1.0" encoding="UTF-8"?>

<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">

    <jsp:directive.page contentType="text/html" pageEncoding="UTF-8"/>

    <!-- any content can be specified here, e.g.: -->
    <jsp:element name="text">
        <jsp:attribute name="lang">EN</jsp:attribute>
        <jsp:body>Hello World!</jsp:body>
    </jsp:element>

        <jsp:forward page="mostraParametres.jsp">
            <jsp:param name="JSP" value="MOLA"/>
            <jsp:param name="PHP" value="MOLA MAS"/>
        </jsp:forward>
</jsp:root>

------------
mostraParametres.jsp
-------------
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>PHP: <%= request.getParameter("PHP")%> </h1><br>
        <h1>JSP: <%= request.getParameter("JSP")%> </h1>
    </body>
</html>

Objectes implícits

En JSP disposem d'alguns objectes implícits, que ens permetran accedir a diferent informació i realitzar diverses accions. En JSP tenim els següents objectes implícits: request, response, out, session, application, config, pageContext, i page.

JSP suporta nou variables definides de forma automàtica, que també s'anomenen objectes implícits. Aquestes variables són:

Objecte implícit Propòsit
request Aquest és l'objecte HttpServletRequest associat amb la petició .
response Aquest és l'objecte HttpServletResponse associat amb la resposta al client .
out Aquest és l'objecte PrintWriter usat per a enviar la sortida al client .
session Aquest és l'objecte HttpSession associat amb la petició .
application Aquest és l'objecte ServletContext associat amb el context d'aplicació
config This is the ServletConfig object associated with the page.
pageContext Això encapsula ús de les característiques específiques del servidor com el més alt JspWriters rendiment .
page Això és simplement un sinònim d'aquesta , i s'utilitza per cridar als mètodes definits pel translated servet class
Exception L'objecte d'excepció permet que les dades d'excepció per a tenir accés als designats JSP .

Objecte Request

És un objetode la classe HttpServletRequest, el seu ús principal és l'accés als paràmetres de la petició. Destacarem les següents funcions:

  • String getParameter(String name)
    • Retorna el valor d'un paràmetre
  • Enumeration getParameterNames()
    • Retorna una enumeració amb els noms de tots els paràmetres de la petició.
  • String[] getParameterValues(String name)
    • Els paràmetres poden tenir valor múltiple, amb aquesta funció recuperem un array amb tots els valors per a un nom donat.
  • String getRemoteAddr()
    • Retorna la IP del host des del qual es realitza la petició

Exemple:

<html>
   <body>
      <form>
         <input type="text" name="parametro"/>
         <input type="submit"/>
      </form>
      <br>
      <br>
         Su IP: <%=request.getRemoteAddr()%>
      <br>
         Su nombre de host: <%= request.getRemoteHost() %>
      <br>
         Valor del parámetro:
      <%= request.getParameter("parametro") %>
   </body>
</html>

Objecte Response

És un objecte de la classe HttpServletResponse, que vas agafar al servlet en la seva generació de la resposta per al client, conté funcions per a maneig de capçaleres, codis d'estat, cookies i transferència de control.

<%@ page import="java.io.*,java.util.*" %>
<html>
   <head>
      <title>Auto Refresh Header Example</title>
   </head>
   <body>
      <center>
      <h2>Auto Refresh Header Example</h2>
   <%
      // Set refresh, autoload time as 5 seconds
      response.setIntHeader("Refresh", 5);
      // Get current time
      Calendar calendar = new GregorianCalendar();
      String am_pm;
      int hour = calendar.get(Calendar.HOUR);
      int minute = calendar.get(Calendar.MINUTE);
      int second = calendar.get(Calendar.SECOND);
      if(calendar.get(Calendar.AM_PM) == 0)
         am_pm = "AM";
      else
         am_pm = "PM";
      String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
      out.println("Current Time is: " + CT + "\n");
   %>
      </center>
   </body>
</html>

Per a més informació tutorial jsp

Objecte Out

És un objecte de la classe JspWriter, és el que ens permet accedir a la sortida del navegador des dels scriptlet. Els següents són els mètodes importants que volem utilitzar per escriure Char boolean , int , double , objecte , cordes , etc:

Método Descripción
out.print(dataType dt) mprimir una dada.
out.println(dataType dt) Imprimir una dada i acaba amb caràcter de nova línia.

Objecte Session

És un objecte de la classe HttpSession. Ens permet accedir a la sessió associada a la petició. A través d'aquest objecte podem, entre altres coses, guardar objectes que seran accessibles des de qualsevol JSP de la sessió o invalidar-la. Per guardar i recuperar informació usarem:

Object session.getAttribute("clave");
void session.setAttribute("clave", Object objeto);

I per invalidar la sessió:

void session.invalidate();

Exemple:

<%@ page session="true" %>
<%
   java.util.ArrayList accesos= (java.util.ArrayList)session.getAttribute("accesos");
   if (accesos==null)
      accesos=new java.util.ArrayList();
      accesos.add(new java.util.Date().toString());
      session.setAttribute("accesos", accesos);
      if (request.getParameter("invalidaSesion")!=null)
         session.invalidate();
%>
<html>
   <body>
      <form>
         <input type="submit" name="invalidaSesion" value="Invalidar sesión"/>
         <input type="submit" value="Recargar página"/>
      </form>
      <br/>
      Usted accedió a esta página en los siguientes momentos: <br>
      <%
         for (int i=0;i<accesos.size();i++)
         {
      %>
      <%= accesos.get(i) %>
      <br>
      <%
         }
      %>
   </body>
</html>

Per a més informació tutorial jsp

Objecte Application

És un objecte de la classe ServletContext. Aquest objecte és comú per a tota l'aplicació web i, entre altres coses, ens permet emmagatzemar informació que serà accessible des de totes les pàgines de l'aplicació web, independentment de la sessió. Per guardar i recuperar valors:

Object application.getAttribute("clave");
void application.setAttribute("clave", Object objeto);

Exemple:

<%@ page session="true" %>
<%
   java.util.Hashtable direcciones = (java.util.Hashtable)application.getAttribute("direcciones");
   if (direcciones==null) 
      direcciones=new java.util.Hashtable();
      direcciones.put(request.getRemoteAddr(),"");
      application.setAttribute("direcciones", direcciones);
%>
<html>
   <body>
      El servidor fue accedido desde las siguientes direcciones IP:
      <%
      java.util.Enumeration e= direcciones.keys();
      while (e.hasMoreElements())
      {
      %>
         <%= e.nextElement() %>
         <br>
      <%
      }
      %>
      <br>
   </body>
</html>

Per a més informació tutorial jsp

Objecte Config

És un objecte de la classe ServletConfig. Permet accedir a paràmetres d'inicialització del servlet i al seu context. Aquest objecte permet l'accés de JSP programador per als paràmetres d'inicialització de servlet o JSP motor com ara la camins o ubicacions d'arxius , etc. El següent mètode de configuració és l'únic que pot utilitzar sempre , i el seu ús és trivial :

config.getServletName();

Retorna el nom del servlet, que és la cadena continguda en el element <servlet-name> es defineix en el WEB-INF\web.xml

Objecte PageContext

És un objecte de la classe PageContext. Entre altres coses, ens permet emmagatzemar informació localment a la pàgina. Per guardar i recuperar valors:

Object pageContext.getAttribute("clave");
void pageContext.setAttribute("clave", Object objeto);

També podem usar PageContext per emmagatzemar i recuperar informació en sessió i en aplicació: Emmagatzemar en context de pàgina:

PageContext.setAttribute("clave", obj, PageContext.PAGE_SCOPE);
PageContext.setAttribute("clave", obj);

Emmagatzemar en context de sessió:

PageContext.setAttribute("clave",obj, PageContext.SESSION_SCOPE);
session.setAttribute("clave", objeto);

Emmagatzemar en context de aplicació:

PageContext.setAttribute("clave",obj,PageContext.APPLICATION_SCOPE);
application.setAttribute("clave",objeto);

Un dels mètodes importants és removeAttribute, que accepta un o dos arguments. Per exemple, pageContext.removeAttribute("attrName") elimina l'atribut de tots els àmbits, mentre que el següent codi només l'elimina de l'àmbit pàgina.

pageContext.removeAttribute("attrName", PAGE_SCOPE);

Objecte Page

Aquest objecte és una referència real a la instància de la pàgina. Es pot considerar com un objecte que representa el pàgina JSP sencera. L'objecte de pàgina és realment un sinònim directe per el objecte this.

Exercicis

IP

Escriu una pàgina jsp que ens mostri la IP del PC que ha fet la petició.

Solució:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Nombre del ordenador: <%= request.getRemoteHost()%></h1>
        <h1>Direccion IP : <%= request.getRemoteAddr()%></h1>
    </body>
</html>

Pas de paràmetres

Escriviu una pàgina jsp que passa tres paràmetres a una altre pàgina JSP amb <jsp:include> i <jsp:param>. A més, la pàgina principal pot rebre tres paràmetres via GET (URL) i els mostra. Especifiqueu els tres paràmetres amb els noms: param1 , param2 i param3

//Pàgina ex_param_1.jsp
<html>
   <head></head>
   <body>
      <jsp:include page="//Pàgina ex_param_2.jsp" >
         <br>
         <jsp:param name="param1" value="val1" />
         <br>
         <jsp:param name="param2" value="val2" />
         <br>
         <jsp:param name="param3" value="val3" />
      </jsp:include>
      <br>
      <b>Calling page:<b>
      <br>    
      Name1: <%= request.getParameter("param1") %>
      <br>
      Name2: <%= request.getParameter("param2") %>
      <br>
      Name3: <%= request.getParameter("param3") %>
      <br>    
    </body>
</html>

//Pàgina ex_param_2.jsp
<html>
   <body>
      <h2>Called page: </h2>   
      <b>Names:</b>
      <br>
      Name1: <%= request.getParameter("param1") %>
      <br>
      Name2: <%= request.getParameter("param2") %>
      <br>		
      Name3: <%= request.getParameter("param3") %>
      <br>
   </body>
</html>

Bucle

Escriviu un programa per mostrar els múltiples de dos. Inclou un bucle en el bloc scriptlet i mostra els números.

<html>
     <body>
         <h1>Displaying </h1>
     <%
        int res;      
        int j=2;
        for(int i=1;i<11;i++)
        {
             res=j*i;         
             out.println(j + " * " + i + " = " + res);
             out.println("<br>");
        }
     %>
     </body>
</html>

Comunicació entre formularis HTML i pàgines JSP

JSP s'encarrega d'analitzar les dades del formulari automàticament utilitzant els mètodes següents depenent de la situació:

Método Descripción
getParameter() obtenir el valor d'un paràmetre.
getParameterValues() utilitza aquest mètode si el paràmetre apareix més d'una vegada i Retorna múltiple valors , per exemple checkbox.
getParameterNames() utilitza aquest mètode si desitges una llista completa de tots els noms dels paràmetres en la petició actual.
getInputStream(): utilitza aquest mètode per llegir flux de dades binàries que ve des del client.

Exemple GET

<html>
     <head>
          <title>Using GET Method to Read Form Data</title>
     </head>
     <body>
          <center>
                <h1>Using GET Method to Read Form Data</h1>
	  </center>
          <ul>
              <li><p><b>First Name:</b>
                  <%= request.getParameter("first_name")%>
              </p></li>
              <li><p><b>Last Name:</b>
                  <%= request.getParameter("last_name")%>
              </p></li>
          </ul>
     </body>
</html>

---------

<html>
    <body>
         <form action="main.jsp" method="GET">
              First Name: <input type="text" name="first_name">
              <br />
              Last Name: <input type="text" name="last_name" />
              <input type="submit" value="Submit" />
         </form>
     </body>
</html>

Exemple POST

<html>
    <body>
         <form action="main.jsp" method="POST">
              First Name: <input type="text" name="first_name">
              <br />
              Last Name: <input type="text" name="last_name" />
              <input type="submit" value="Submit" />
         </form>
    </body>
</html>

--------------
<html>
     <head>
          <title>Using GET and POST Method to Read Form Data</title>
     </head>
     <body>
          <center>
              <h1>Using GET Method to Read Form Data</h1>
          </center>
          <ul>
              <li><p><b>First Name:</b>
              <%= request.getParameter("first_name")%>
              </p></li>
              <li><p><b>Last Name:</b>
              <%= request.getParameter("last_name")%>
              </p></li>
          </ul>
     </body>
</html>

----------------
Exemple 2:
----------------
<html>
     <body>
          <form action="main.jsp" method="POST" target="_blank">
                <input type="checkbox" name="maths" checked="checked" /> Maths
                <input type="checkbox" name="physics" /> Physics
                <input type="checkbox" name="chemistry" checked="checked" /> Chem
                <input type="submit" value="Select Subject" />
          </form>
     </body>
</html>

<%@ page import="java.io.*,java.util.*" %>
<html>
      <head>
            <title>HTTP Header Request Example</title>
      </head>
      <body>
            <center>
                   <h2>HTTP Header Request Example</h2>
          
            <table width="100%" border="1" align="center">
                   <tr bgcolor="#949494">
                        <th>Param Name</th><th>Param Value(s)</th>
                   </tr>
                   <%
                       Enumeration paramNames = request.getParameterNames();
                       while(paramNames.hasMoreElements()) {
                               String paramName = ( String )paramNames.nextElement();
                               out.print("<tr><td>" + paramName + "</td>\n");
                               String paramValue = request.getHeader(paramName);
                               out.println("<td> " + paramValue + "</td></tr>\n");
                       }
                   %>
             </table>
          </center>
      </body>
</html>

Exercicis

JSP amb cap i peus

L’objectiu d’aquesta activitat és mostrar el funcionament de la inclusió d’arxius a PHP. Fer servir includes us permet simplificar el codi de les pàgines. Per exemple, podeu afegir un fitxer de capçalera (cap.jsp) i un de peu (peu.jsp) amb els continguts comuns de totes les pàgines del vostre lloc (el bàner, el menú, la informació general). Senzillament incloent aquests fitxers a totes les pàgines, podeu aconseguir una estètica comú. Si heu de canviar en algun moment la capçalera, modificant l’arxiu cap.php ho tindreu modificat a totes les pàgines del web. Feu una pàgina web amb continguts estructurats amb dos fitxers: cap.jsp i peu.jsp

Login

Crea un formulari HTML com el del proxy del institut que utilitzi el mètode GET i un altre que utilitzi el mètode POST. Imprimeix per pantalla el nom d'usuari i la contrasenya codificada en MD5 i en SAH1. A més a més, hi ha la possibilitat d'enviar una imatge (menor d'un 1 mb) com a avatar del usuari.

JSP SESSION

HTTP és un protocol "sense estat", la qual cosa significa que cada vegada que un client recupera una pàgina Web, el client obre una connexió independent per al servidor Web i el servidor de forma automàtica no manté cap registre de l'anterior petició del client.

JSP fa ús de la interfície HttpSession que proporciona una manera d'identificar a un usuari a través de més d'una sol·licitud de pàgina o visita a un lloc web i també, per emmagatzemar informació sobre aquest usuari.

De forma predeterminada, JSP permet el seguiment de sessió i,per això, es crea un nou objecte HttpSession per a cada nou client automàticament. La desactivació del seguiment de sessió requereix configurar la directiva de sessió de pàgina en fals de la següent manera:

<%@ page session="false" %>

Podem accedir a la sessió d'un usuari utilitzant l'objecte implícit que ens proporciona el motor JSP: session.

Des de l'objecte de sessió, el programador pot començar immediatament a emmagatzemar i recuperar dades sense haver d'inicialitzar la sessió.

Heus aquí un resum dels mètodes importants disponibles a través d'objecte de sessió:

Mètode Descripció
public Object getAttribute(String name) retorna l'objecte vinculat amb el nom especificat en aquesta sessió , o null si no hi ha cap objecte vinculat sota el nom
public Enumeration getAttributeNames() retorna una enumeració d'objectes String que contenen els noms de tots els objectes vinculats en aquesta sessió
public long getCreationTime() retorna el temps quan es va crear aquesta sessió, mesurat en mil·lisegons des de la mitjanit del 01 de gener 1970 GMT
public String getId() Retorna una cadena que conté l'identificador únic assignat a aquesta sessió.
public long getLastAccessedTime() retorna l'última vegada que el client va enviar una sol·licitud associada amb aquesta sessió, com el nombre

de mil·lisegons des de la mitjanit 01 de gener 1970 GMT .

public int getMaxInactiveInterval() retorna l'interval de temps màxim, en segons, que el contenidor de servlets mantindrà aquesta sessió

oberta entre diferents accessos del client

public void invalidate() invalida aquesta sessió i desvincula els objectes units a ell.
public boolean isNew() devuelve true si es la primera vez que l'usuari accedeix i llavors, s'acaba de crear la sessió.
public void removeAttribute(String name) elimina l'objecte vinculat amb el nom especificat d'aquesta sessió .
public void setAttribute(String name, Object value) s'uneix un objecte per a aquesta sessió, utilitzant el nom especificat ..
public void setMaxInactiveInterval(int interval) especifica el temps, en segons, entre les sol·licituds del client abans que el contenidor de servlets invalidi aquesta sessió

Web.xml

Si està utilitzant Tomcat , a part dels mètodes esmentats anteriorment, pots configurar temps de la sessió en l'arxiu web.xml de la següent manera:

<session-config>
      <session-timeout>15</session-timeout>
</session-config>

El temps d'espera s'expressa en minuts, i anul·la el temps d'espera predeterminat que està configurat a 30 minuts en Tomcat.

JSP Cookies

Són arxius de text emmagatzemats en l'equip client i que es mantenen durant un temps.

Normalment, les Cookies s'estableixen en el header de la petició HTTP. Una petició HTTP que vulgui enviar una cookie utilitzarà un header semblant a aquest:

HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT;
            path=/; domain=tutorialspoint.com
Connection: close
Content-Type: text/html

Si l'usuari accedix a la pàgina que coincideix amb la ruta i el domini de la cookie, el navegador enviarà la cookie al servidor. El header de la petició http seria la següent:

GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name=xyz

Heus aquí un resum dels mètodes importants disponibles a través d'objecte de sessió:

Mètode Descripció
public void setDomain(String pattern) assigna el domini de la cookie (ex: www.infomerce.es)
public String getDomain() Retorna el domini d'on la s'aplica la cookie
public void setMaxAge(int expiry) estableix l'edat màxima de la cookie, especificat en segons ,de forma predeterminada, -1 indica que perdurarà fins que és tanqui el navedador
public int getMaxAge() retorna l'edat màxima de la cookie, especificat en segons ,de forma predeterminada, -1 indica que perdurarà fins que és tanqui el navedador
public String getName() Retorna el nom de la cookie. Aquest nom no es pot modificar després de la seva creació.
public void setValue(String newValue) Estableix el valor de la cookie.
public String getValue() Retorna el valor de la cookie.
public void setPath(String uri) Estableix el 'path' on s'aplica la cookie. Si no s'especifica s'agafa el 'path' del fitxer que crea la cookie i es pot utilitzar en aquest path i en els subirectoris que hi hagin.
public void setSecure(boolean flag) Especifica si la cookie s'enviarà només si la connexió es segura. (True només l'envia si la connexió és SSL)
public void setComment(String purpose) Estableix un comentari que descriu el propòsit de la cookie.
public String getComment() Retorna el comentari de la cookie.


Crear i llegir una cookie amb JSP Pots crear una cookie cridant al constructor de la classe cookie. Al constructor s'ha de passar per paràmetres la clau i el valor de la cookie:

Cookie cookie = new Cookie("clau","valor");

No es pot utilitzar cap dels següents caràcters ni a les claus ni als valors:

" " [ ] = , " / ? @ : ; ( )

Una vegada creada la cookie s'ha de establir el temps màxim de vida:

cookie.setMaxAge(60*60*24);

Per últim, s'ha d'enviar al header de la peticiío HTTP mitjançant l'objecte response:

response.addCookie(cookie);

Exemple complert:

<%
// Create cookies for first and last names.
    Cookie firstName = new Cookie("first_name",
            request.getParameter("first_name"));
    Cookie lastName = new Cookie("last_name",
            request.getParameter("last_name"));
// Set expiry date after 24 Hrs for both the cookies.
    firstName.setMaxAge(60 * 60 * 24);
    lastName.setMaxAge(60 * 60 * 24);
// Add both the cookies in the response header.
    response.addCookie(firstName);
    response.addCookie(lastName);
%>
<html>
    <head>
        <title> Setting Cookies </title>
    </head>
    <body>
    <center>
        <h1> Setting Cookies </h1>
    </center>
    <ul>
        <li><p><b> First Name: </b>
                    <%= request.getParameter("first_name")%>
            </p></li>
        <li><p><b> Last
                    Name: </b>
                    <%= request.getParameter("last_name")%>
            </p></li>
    </ul>
</body>
</html>

Exemple per llegir una cookie:

<html>
    <head>
        <title> Reading Cookies </title>
    </head>
    <body>
    <center>
        <h1> Reading Cookies </h1>
    </center>
    <%
        Cookie cookie = null;
        Cookie[] cookies = null;
    // Get an array of Cookies associated with this domain
        cookies = request.getCookies();
        if (cookies != null) {
            out.println("<h2> Found Cookies Name and Value</h2>");
            for (int i = 0; i < cookies.length; i++) {
                cookie = cookies[i];
                out.print("Name : " + cookie.getName() + ", ");
                out.print("Value: " + cookie.getValue() + " <br/>");
            }
        } else {
            out.println("<h2>No cookies founds</h2>");
        }
    %>
</body>
</html>

Esborrar una cookie amb JSP

Si es vol esborrar una cookie s'ha de seguir tres passos:

  • Llegeix una cookie que existeix i guarda-la en un objecte cookie
  • Estableix a 0 la durada de la cookie amb setMaxAge()
  • Envia la cookie al navedador amb l'objecte response.

Exemple:

<html>
    <head>
        <title> Reading Cookies </title>
    </head>
    <body>
    <center>
        <h1> Reading Cookies </h1>
    </center>
    <%
        Cookie cookie = null;

        Cookie[] cookies = null;
    // Get an array of Cookies associated with this domain
        cookies = request.getCookies();
        if (cookies != null) {
            out.println("<h2> Found Cookies Name and Value</h2>");
            for (int i = 0; i < cookies.length; i++) {
                cookie = cookies[i];
                if ((cookie.getName()).compareTo("first_name") == 0) {
                    cookie.setMaxAge(0);
                    response.addCookie(cookie);
                    out.print("Deleted cookie: "
                            + cookie.getName() + "<br/>");
                }
                out.print("Name : " + cookie.getName() + ", ");
                out.print("Value: " + cookie.getValue() + " <br/>");
            }
        } else {
            out.println(
                    "<h2>No cookies founds</h2>");
        }
    %>
</body>
</html>

Exercici cookies i sessions

Exercici Sessions

Dona la següent informació de la sessió:

  • id
  • Data i hora de creació
  • La última vegada que es va accedir
  • L'identificador d'usuari
  • Número de visites

A més a més, fes que aparegui un titul donant la benvinguda a la pàgina. Fes que sigui diferent segons sigui la primera vegada que accedeix o un altre.

<html>
    <head>
        <title> JSP Expressions </title>
    </head>
    <body bgColor="white">
        <h2>Simple JSP Expression</h2>
        <ul><font color = “#0000FF”> 
            <li> <font color = “#0000FF”> Session id:<%= session.getId()%>
            <li> <font color = “#0000FF”> Creation time:<%= new java.util.Date(session.getCreationTime())%>
            <li> <font color = “#0000FF”> Time of last access: " + <%= new java.util.Date(session.getLastAccessedTime())%>
        </ul>
    </body>
</html>

Carret de la compra

Escribe un programa para mostrar la cesta de la compra. La página web debe tener un botón para agregar un elemento al carrito , y otro botón para eliminar un elemento de la compra. La página web debe mostrar los cambios realizados en el carrito.

<html>
    <%
    java.util.Vector v = (java.util.Vector)session.getAttribute("array");
    if (v == null)
    {
            v = new java.util.Vector();		
    }
String i = null;
String submit = request.getParameter("submit");

    if (submit == null) 
    {
            submit = "";
    }
if (submit.equals("add") || submit.equals(""))
    {
                    v.addElement(request.getParameter("item"));
    %>
    <br> Your cart Contains :
    <ol>
        <% 
                String[] items = new String[v.size()];
                v.copyInto(items);
                for (int ix=1; ix < items.length; ix++) {
        %>
        <li> <% out.print(items[ix]); 
        }
            %>
    </ol>

    <%
}
if (submit.equals("remove")) 
{
    String removeitem=request.getParameter("item");
            if(v.contains(removeitem))
{
                    v.removeElement(removeitem);
            }
            else
            {
                    out.println("element not found in vector");
            }
			
    %>		
    <br> Your cart Contains :
    <ol>
        <% 
                String[] items = new String[v.size()];
                v.copyInto(items);
                for (int ix=1; ix<items.length; ix++) {
        %>
        <li> <% out.print(items[ix]); 
        }
            %>
    </ol>

    <%
}
session.setAttribute("array",v);	
    %>

    </font>
    <hr>

    <font size = 3>
    <form type=POST>
        <BR>
        Please Select the item to add or remove:
        <br>
        Add / Remove Item:
        <select name="item">
            <option>Floppy
            <option>CD
            <option>Keyboard
        </select>
        <br> <br>
        <input type=submit name="submit" value="add">
        <input type=submit name="submit" value="remove">

    </form>
    </font>
</html>

Nombre de sessions

Escriu un programa que conti i mostri el nombre de sessions actives al servidor Tomcat.

Comptador

Crea un contador que mostri el número de vegades que ha entrat cada usuari. No és un comptador general, si no, un comptador per usuari.

Colors

Crea una pàgina jsp que permeti cambiar el color de fons de la pàgina. Aquest color l'ha de recordar i cada vegada que l'usuari entri s'estableixi el color que habioa escollit l'usuari.