NF2 - Llenguatge JSP (15h)

De wikiserver
La revisió el 00:44, 9 nov 2014 per Asalinas (Discussió | contribucions) (Exercicis)
Dreceres ràpides: navegació, cerca

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>

Scriplets

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:scriplet>codi</jsp:scriplet>

<%-- 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:scriplet>
         out.println("Your IP address is " + request.getRemoteAddr());
     </jsp:scriplet>
   </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 servle. 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ó [1]

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.

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.


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

jsp:fordwawrd

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

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 scriplet. 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ó.

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