NF2 - Llenguatge JSP (15h)
Contingut
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]
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.