Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manual 2014-II 04 Lenguaje de Programación II (0870)
Manual 2014-II 04 Lenguaje de Programación II (0870)
Programacin II
NDICE
Presentacin
Red de contenidos
Servlet y JSP
21
67
85
HttpSession
53
126
139
CARRERAS PROFESIONALES
103
CIBERTEC
LENGUAJE DE PROGRAMACIN II
PRESENTACIN
CIBERTEC
CARRERAS PROFESIONALES
RED DE CONTENIDOS
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
UNIDAD DE
APRENDIZAJE
SERVLET Y JSP
LOGRO DE LA UNIDAD DE APRENDIZAJE
TEMARIO
ACTIVIDADES PROPUESTAS
CIBERTEC
CARRERAS PROFESIONALES
1. JEE
Java Platform, Enterprise Edition o Java EE (anteriormente conocido como
Java 2 Platform, Enterprise Edition o J2EE hasta la versin 1.4), es una
plataforma de programacinparte de la Plataforma Javapara desarrollar y
ejecutar software de aplicaciones en Lenguaje de programacin Java con
arquitectura de N niveles distribuida, basndose ampliamente en componentes
de software modulares ejecutndose sobre un servidor de aplicaciones. La
plataforma Java EE est definida por una especificacin. Similar a otras
especificaciones del Java Community Process, Java EE es tambin
considerada informalmente como un estndar debido a que los
suministradores deben cumplir ciertos requisitos de conformidad para declarar
que sus productos son conformes a Java EE; estandarizado por The Java
Community Process / JCP.
Java EE incluye varias especificaciones de API, tales como JDBC, RMI, e-mail,
JMS, Servicios Web, XML, etc. y define cmo coordinarlos. Java EE tambin
configura algunas especificaciones nicas para Java EE para componentes.
Estas incluyen Enterprise JavaBeans, servlets, portlets (siguiendo la
especificacin de Portlets Java), JavaServer Pages y varias tecnologas de
servicios web. Esto permite al desarrollador crear una Aplicacin de Empresa
portable entre plataformas y escalable, a la vez que integrable con tecnologas
anteriores. Otros beneficios aadidos son, por ejemplo, que el servidor de
aplicaciones puede manejar transacciones, la seguridad, escalabilidad,
concurrencia y gestin de los componentes desplegados, significando que los
desarrolladores pueden concentrarse ms en la lgica de negocio de los
componentes en lugar de en tareas de mantenimiento de bajo nivel.
Las razones que empujan a la creacin de la plataforma JEE son las
siguientes:
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
CIBERTEC
CARRERAS PROFESIONALES
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
CARRERAS PROFESIONALES
10
CIBERTEC
LENGUAJE DE PROGRAMACIN II
11
CIBERTEC
CARRERAS PROFESIONALES
12
CIBERTEC
LENGUAJE DE PROGRAMACIN II
13
2. TOMCAT
2.1 Tomcat - Definicin
Jakarta-Tomcat es un servidor de aplicaciones que extiende la
funcionalidad de un servidor web. Por s solo, un servidor web slo puede
mostrar pginas estticas html. Tomcat extiende y mejora esta
funcionalidad al permitir ejecutar componentes Java tales como JSPs,
Servlets, etc.
Tomcat no soporta Enteprise Java Beans (EJBs). Es bsicamente un
contenedor de Servlets y JSPs.
Ejemplos de otros servidores de aplicaciones que soportan Servlets y
JSPs son los siguientes:
iPlanet
Jetty
JRun
Bluestone
Borland Enterprise Server
Se puede trabajar con Tomcat como contenedor de JSPs y Servlets
y algn otro servidor de aplicaciones como contenedor de EJBs. A
continuacin, se listan ejemplos de servidores de aplicaciones que
soportan EJBs:
CIBERTEC
CARRERAS PROFESIONALES
14
Oracle 9iAS
JBoss (gratuito)
JOnAS (gratuito)
Web Logic
IBM WebSphere
Exampl
es
ROOT
Manag
er .
miwebapp
WEB-INF
web.xml
classes
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
15
login.jsp
home.jsp
index.html
Configuracin de la sesin
Definiciones de Servlets y Registro de Servlets
Registro de tipos MIME
Pginas de error
Pginas de bienvenida (tag <welcome-file-list>)
Archivos War
Un archivo WAR (web Archive) es la representacin de una aplicacin web
en una unidad nica distribuible. Es el mtodo estndar empleado para
empaquetar una aplicacin web y dejarla lista para su distribucin y
acceso a travs de servidores web con soporte para Servlets y pginas
JSP.
No importa el nmero o tipo de recursos (Servlets, JSPs, HTMLs, etc.);
un archivo WAR agrupa una aplicacin web completa, en una nica
unidad de distribucin, en un nico archivo.
CIBERTEC
CARRERAS PROFESIONALES
16
Resumen
Exampl
es
ROOT
Manag
er .
miwebapp
web.xml
WEB-INF
classes
lib
login.jsp
home.jsp
index.html
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
17
UNIDAD DE
APRENDIZAJE
SERVLET Y JSP
LOGRO DE LA UNIDAD DE APRENDIZAJE
TEMARIO
Servlets
Objeto RequestDispatcher
ACTIVIDADES PROPUESTAS
CIBERTEC
CARRERAS PROFESIONALES
18
1. SERVLETS
Un servlet es un componente JEE que extiende la capacidad de proceso de un
servidor que emplea el paradigma request response. Por lo tanto, Un servlet
es una clase Java que recibe requerimientos de un cliente para cumplir con un
servicio; luego de cumplir con el servicio, enva la respuesta hacia el cliente.
javax.servlet
javax.servlet.http
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
19
3. La clase HTTPSERVLET
Los clientes web (browsers) interactan con los Servlets usando el protocolo
HTTP (Request-Response); por lo tanto, para crear Servlets que soporten este
protocolo, se debe heredar de la clase javax.servlet.http.HttpServlet.
La clase HttpServlet provee una estructura de trabajo adecuada para
manipular el protocolo HTTP junto con los mtodos GET y POST.
El servlet debe ser creado dentro de la carpeta classes del web application con
el que
se
est
trabajando.
Ejemplo:
Webapps
Miwebapp
WEB-INF
classes
CARRERAS PROFESIONALES
20
...
<!--=======================================================-->
<!-- La etiqueta <servlet> define el nombre fsico de un servlet -->
<!-- =======================================================-->
<servlet>
<servlet-name>
SampleServlet
</servlet-name>
<servlet-class>
edu.cibertec.servlet.SampleServlet
</servlet-class>
</servlet>
<!--==========================================================-->
<!-- La etiqueta <servlet-mapping> define el nombre lgico de un servlet -->
<!--==========================================================-->
<servlet-mapping>
<servlet-name>
SampleServlet
</servlet-name>
<url-pattern>
/servlet1
</url-pattern>
</servlet-mapping>
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
21
CIBERTEC
CARRERAS PROFESIONALES
22
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
23
Returns the portion of the request URI that indicates the context
of the request.
Cookie[] getCookies()
Returns the name of the HTTP method with which this request
was made, for example, GET, POST, or PUT.
String getPathInfo()
Returns any extra path information associated with the URL the
client sent when it made this request.
String getPathTranslated()
Returns any extra path information after the servlet name but
before the query string, and translates it to a real path.
String getQueryString()
Returns the login of the user making this request, if the user
has been authenticated, or null if the user has not been authenticated.
String getRequestedSessionId()
Returns the part of this request's URL from the protocol name
CIBERTEC
CARRERAS PROFESIONALES
24
Returns the part of this request's URL that calls the servlet.
HttpSession getSession()
rd=getServletContext
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
25
8. COMPARTIENDO OBJETOS
Existen dos formas de compartir objetos entre Servlets:
El objeto ServletContext y
El objeto HttpServletRequest
ElObjeto =(MiClase)request.getAttribute(objeto);
CIBERTEC
CARRERAS PROFESIONALES
26
Preguntas de Certificacin
1. Cules mtodos en la clase HttpServlet sirve el pedido del HTTP POST?
(Seleccione uno)
a.
b.
c.
d.
doPost(ServletRequest, ServletResponse)
doPOST(ServletRequest, ServletResponse)
servicePost(HttpServletRequest, HttpServletResponse)
doPost(HttpServletRequest, HttpServletResponse)
doGet
doPost
doForm
doHref
serviceGet
session.setAttribute("userid", userid);
req.setAttribute("userid", userid);
ctx.addAttribute("userid", userid);
session.addAttribute("userid", userid);
this.addParameter("userid", userid);
this.setAttribute("userid", userid);
4. Cul de las siguientes lneas se deber usar en la salida del DataServlet para
invocar algn otro servlet? (Seleccione uno)
a.
RequestDispatcher rd =
request.getRequestDispatcher("/servlet/DataServlet");
rd.include(request, response);
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
27
b.
RequestDispatcher rd =
request.getRequestDispatcher("/servlet/DataServlet");
rd.include(response);
c.
RequestDispatcher rd = request.getRequestDispatcher();
rd.include("/servlet/DataServlet", request, response);
d.
RequestDispatcher rd = request.getRequestDispatcher();
rd.include("/servlet/DataServlet", response);
e.
RequestDispatcher rd = request.getRequestDispatcher();
rd.include("/servlet/DataServlet");
Resumen
CIBERTEC
CARRERAS PROFESIONALES
28
UNIDAD DE
APRENDIZAJE
SERVLET Y JSP
LOGRO DE LA UNIDAD DE APRENDIZAJE
TEMARIO
ACTIVIDADES PROPUESTAS
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
29
<HTML>
<HEAD><TITLE>Saludo</TITLE><HEAD>
<BODY>
<% String miAlias=request.getParameter(miAlias); %>
<H1>Hola <%=miAlias%></H1>
</BODY>
</HTML>
jspInit,
_jspService y
jspDestroy
CIBERTEC
CARRERAS PROFESIONALES
30
3. DIRECTIVAS JSP
Las directivas JSP son usadas para definir informacin al traductor java acerca
de la pgina.
La sintaxis es la siguiente:
<%@ directiva[ atributo=valor ] %>
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
31
4. JSP SCRIPTING
El scripting es utilizado para codificar el JSP. El scripting est conformado de:
Declarations
Scriplets
Expressions
a)
Ejemplo:
<%! private int contador = 0; %>
b)
Ejemplo:
<%
String sexo = request.getParameter(sexo);
If(sexo.equals(M)){
%>
<H2>Sr.</H2>
<%
}else{
%>
<H2>Sr.</H2>
<% } %>
c) Expressions. Las expresiones son para incluir directamente dentro de la
salida de la pgina cadenas (Strings), que son el resultado de evaluar una
expresin de cdigo Java y luego convertirla en una cadena.
Sintaxis:
Ejemplo:
La fecha actual es <%=new java.util.Date() %>
CARRERAS PROFESIONALES
32
<FORM ACTION=/aplicacionWeb/nombrejsp.jsp>
<A HREF=/aplicacionWeb/nombrejsp.jsp> texto </A>
c) HTML Presentation.
incorrectamente.
Si
algn
elemento
HTML
est
definido
CIBERTEC
LENGUAJE DE PROGRAMACIN II
33
Objeto out. Es usado para las salidas de texto que se quieran incluir en la
pgina.
Se usa lo siguiente:
setAttribute(String,Object) para cargar(setear) el objeto en la sesin y
CIBERTEC
CARRERAS PROFESIONALES
34
Significado
request
response
out
session
application
config
pageContext
page
exception
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
35
javax.servlet.ServletContextListener
javax.servlet.http.HttpSessionListener
10.2 ServletContextListener:
Esta interfaz contiene dos mtodos:
CARRERAS PROFESIONALES
36
10.3 HttpSessionListener
Esta interfaz te permite poder escuchar al crear o destruir una sesin.
/*
Expediente: SessionCounter.java
*/
javax.servlet.http.HttpSessionListener de importacin;
javax.servlet.http.HttpSessionEvent de importacin;
clase pblica SessionCounter implementa
HttpSessionListener (
private static int activeSessions = 0;
/ * Creacin de eventos de sesin * /
public void sessionCreated (HttpSessionEvent se) (
activeSessions + +;
)
/ * Sesin de invalidacin del evento * /
public void sessionDestroyed (HttpSessionEvent se) (
if (activeSessions> 0)
activeSessions -;
)
public static int getActiveSessions () (
activeSessions retorno;
)
)
En el cdigo anterior, SessionCounter clase implementa HttpSessionListener para
contar el nmero de sesiones activas.
Se ha aprendido cules son los eventos de aplicaciones web, interfaz de lo que
est disponible para nosotros y tambin se han visto ejemplos de la aplicacin de
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
37
CIBERTEC
CARRERAS PROFESIONALES
38
11.1 Ventajas
11.2 Funcionamiento
Cada filtro responde a un Servlet o un URL que represente uno o ms recursos
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
39
La interfaz javax.servlet.FilterConfig
Define cuatro mtodos:
o getFilterName() : Retorna el nombre asociado al filtro en la
configuracin en un String
o getInitParameter(String): Retorna el valor de un parmetro de
configuracin
o getInitParameterNames(): Retorna los nombres de los parmetros
de configuracin.
o getServletContext() : Retorna la referencia al ServletContext en el
que trabajar el filtro
Define un nico mtodo:
o doFilter() throws ServletException
o El mtodo doFilter recibe como argumentos ServletRequest y
ServletResponse.
Es invocado por el contenedor cuando el filtro forma parte de la cadena
creada ante la peticin/respuesta de un recurso web.
CIBERTEC
CARRERAS PROFESIONALES
40
<filter>
<filter-name>Filtro Aniversario Java</filter-name>
<filter-class>MiFiltro</filter-class>
<init-param>
<param-name>aniversarioNumero</param-name>
<param-value>10</param-value>
</init-param>
</filter>
Mapping a un Servlet
<filter-mapping>
<filter-name>Filtro Aniversario Java</filter-name>
<servlet-name>MiServlet</ servlet-name >
</filter-mapping>
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
41
<filter>
<filter-name>FiltroJSP</filter-name>
<filter-class>MiFiltro</filter-class>
<init-param>
<param-name>param</param-name>
<param-value>10</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FiltroJSP</filter-name>
<url-pattern>/*.jsp</url-pattern>
</filter-mapping>
<filter>
<filter-name>FiltroHTM</filter-name>
<filter-class>MiFiltro</filter-class>
<init-param>
<param-name>param</param-name>
<param-value>20</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FiltroHTM</filter-name>
<url-pattern>/*.htm</url-pattern>
</filter-mapping>
CIBERTEC
CARRERAS PROFESIONALES
42
Por qu un filtro?
Premisas de trabajo:
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
43
CIBERTEC
CARRERAS PROFESIONALES
44
Preguntas de Certificacin
1 Considere el siguiente cdigo y seleccione la sentencia correcta acerca del
siguiente supuesto. (Seleccione uno.)
<html><body>
<%! int aNum=5 %>
The value of aNum is <%= aNum %>
</body></html>
a It will print "The value of aNum is 5" to the output.
b It will flag a compile-time error because of an incorrect
declaration. c It will throw a runtime exception while executing
the expression.
d It will not flag any compile time or runtime errors and will not print anything to
the output.
CIBERTEC
LENGUAJE DE PROGRAMACIN II
45
(Seleccione uno.)
a
javax.servlet.ServletExceptio
n
b
javax.servlet.jsp.JSPExceptio
n
c javax.servlet.ServletException and
javax.servlet.jsp.JSPException d
javax.servlet.ServletException and java.io.IOException e
javax.servlet.jsp.JSPException and java.io.IOException
Resumen
Existen tres mbitos:
CIBERTEC
CARRERAS PROFESIONALES
46
UNIDAD DE
APRENDIZAJE
SERVLET Y JSP
LOGRO DE LA UNIDAD DE APRENDIZAJE
TEMARIO
HttpSession
ACTIVIDADES PROPUESTAS
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
1.
47
HTTPSESSION
En una transaccin http, cada conexin entre un cliente y un servidor es muy
breve. Esta es una caracterstica tpica de cualquier protocolo sin estado
(staless). El protocolo http no mantiene el estado, es decir, no tiene un
mecanismo para saber que una serie de peticiones (request) provienen de
un mismo cliente. Ante esta limitacin, surge la sesin como el mecanismo
adecuado para identificar un usuario que est interactuando con el sitio web.
La sesin puede ser implementada a travs de diferentes opciones:
HttpSession
Cookies
URL Rewriting
...
HttpSession miSesion = req.getSession( true);
...
Sintaxis:
request.getSession() o request.getSession(true). Retornan la sesin
actual si existe; de lo contrario, crean una nueva.
request.getSession(false). Retorna la sesin actual si existe; de lo
contrario, retorna un objeto nulo.
CIBERTEC
CARRERAS PROFESIONALES
48
3. CONTENIDO DE LA SESIN
El objeto HttpSession contiene informacin acerca de la sesin. Para
acceder a esta informacin, existen una serie de mtodos getters de los
cuales mostraremos los ms utilizados:
3.
...
session.setAttribute("miNombre",nombre);
CARRERAS PROFESIONALES
Programticamente
Por tiempo de expiracin
Cuando el usuario cierra el browser
CIBERTEC
LENGUAJE DE PROGRAMACIN II
49
Programticamente:
a) Usando el mtodo invalidate() del objeto session
b) Removiendo todos los objetos de la sesin con el mtodo
removeAttribute()
Sintaxis
:
removeAttribute(String
nombreAtributo)
nombreAtributo es el nombre del atributo a ser removido.
...
HttpSession session = req.getSession(true);
session.removeAttribute(nombre);
session.sinvalidate();
...
5 Cookies
Las sesiones vistas anteriormente basan su funcionamiento en los cookies.
Cuando se hace uso de la interfaz HttpSession de forma interna y totalmente
transparente al programador se est haciendo uso de los cookies. De
hecho, cuando a travs de una pgina JSP se comienza una sesin, se crea
un cookie llamado JSSESIONID. La diferencia es que este cookie es
temporal y durar el tiempo que permanezca el navegador ejecutndose,
siendo borrada cuando el usuario cierre el navegador.
El objetivo de utilizar cookies es poder reconocer al usuario en el momento
en el que se conecta al servidor. Una de las pginas que recoge la peticin
del usuario puede comprobar si existe un cookie que ha dejado
anteriormente; si es as, sabe que ese usuario ya ha visitado ese website y,
por lo tanto, puede leer valores que le identifiquen. Otro de los usos de los
CIBERTEC
CARRERAS PROFESIONALES
50
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
51
CARRERAS PROFESIONALES
52
Igualmente, para conocer el dominio sobre el que acta el cookie, basta con
utilizar el mtodo getDomain() para obtener esa informacin. Una vez que
se ha creado el objeto Cookie, y se ha establecido todos los atributos
necesarios es el momento de crear realmente, ya que hasta ahora slo se
tena un objeto que representa ese cookie. Para crear el archivo cookie real,
se utiliza el mtodo addCookie() de la interfaz HttpServletResponse:
<%
response.addCookie(unCookie);
%>
Una vez ejecutada esta lnea es cuando el cookie existe en el disco del
cliente que ha accedido a la pgina JSP. Es importante sealar que si no se
ejecuta esta ltima lnea, el cookie no habr sido grabado en el disco y, por
lo tanto, cualquier aplicacin o pgina que espere encontrar dicho cookie no
lo encontrar.
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
53
<%
Cookie [] todosLosCookies=request.getCookies();
/* El siguiente paso es crear un bucle que vaya
leyendo todos los cookies. */ for(int
i=0;i<todosLosCookies.length;i++)
{
Cookie unCookie=todosLosCookies[i];
/* A continuacin se compara los nombres de cada uno de
los cookies con el que se est buscando. Si se encuentra
un cookie con ese nombre se ha dado con el que se est
buscando, de forma que se sale del bucle mediante break.
*/ if(unCookie.getName().equals(nombre)) break;
}
/* Una vez localizado tan slo queda utilizar los mtodos
apropiados para obtener la informacin necesaria que
contiene. */ out.println(Nombre:
+unCookie.getName()+<BR>); out.println(Valor:
+unCookie.getValue()+<BR>); out.println(Path:
+unCookie.getPath()+<BR>); out.println(Tiempo de
vida:+unCookie.getMaxAge()+<BR>); out.println(Dominio:
+unCookie.getDomain()+<BR>);
%>
CIBERTEC
CARRERAS PROFESIONALES
54
Cookie[] todosLosCookies =
request.getCookies(); for (int i=0;
i<todosLosCookies.length; i++) { Cookie
unCookie = todosLosCookies[i]; if
(unCookie.getName().equals("cokieUsu")) {
usuario = unCookie.getValue();
}
}
/* Para mostrar la fecha del ltimo acceso a la pgina.
Para ver si el cookie que almacena la fecha existe, se busca
en los cookies existentes. */
for (int i=0; i<todosLosCookies.length; i++) {
Cookie unCookie = todosLosCookies[i]; if
(unCookie.getName().equals("ultimoAcceso")) {
fechaUltimoAcceso = unCookie.getValue();
}
}
/* Se comprueba que la variable es igual a vaco, es
decir no hay ningn cookie llamado ultimoAcceso, por lo
que se recupera la fecha, y se guarda en un nuevo cookie.
*/ if (fechaUltimoAcceso.equals(""))
{
Date fechaActual = new Date();
fechaUltimoAcceso = fechaActual.toString();
Cookie cookieFecha = new
Cookie("ultimoAcceso",fechaUltimoAcceso);
cookieFecha.setPath("/");
cookieFecha.setMaxAge(60*60*24);
response.addCookie(cookieFecha);
}
%>
<html>
<head><title>Proceso de login</title>
</head>
<body>
<b>PROCESO DE IDENTIFICACIN</b>
<br>ltima vez que accedi a esta
pgina:<br><%=fechaUltimoAcceso%>
<p> <% if (request.getParameter("error") !=
null) {
out.println(request.getParameter("error"));
}
%>
<form action="checklogin.jsp" method="post">
usuario: <input type="text" name="usuario" size="20"
value="<%=usuario%>"><br>
clave: <input type="password" name="clave" size="20"><br>
Recordar mi usuario: <input type="checkbox"
name="recordarUsuario" value="on"><br>
<input type="submit" value="enviar">
</form>
</body>
</html>
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
55
CIBERTEC
CARRERAS PROFESIONALES
56
Cookie("ultimoAcceso",fechaUltimoAcceso);
cookieFecha.setPath("/");
cookieFecha.setMaxAge(60*60*24);
response.addCookie(cookieFecha);
%>
<jsp:forward page="menu.jsp" />
<%
} else {
%>
<jsp:forward page="login.jsp">
<jsp:param name="error" value="Usuario y/o clave
incorrectos.<br>Vuelve a intentarlo."/>
</jsp:forward>
<%
}
%>
Preguntas de Certificacin
1 Cul de las siguientes interfaz o clases son usadas para recibir una sesin
asociado con un usuario? (Seleccione uno.)
a)
b)
c)
d)
e)
f)
GenericServlet
ServletConfig
ServletContext
HttpServlet
HttpServletRequest
HttpServletResponse
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
57
sessionDestroyed of HttpSessionListener
attributeRemoved of HttpSessionAttributeListener
valueUnbound of HttpSessionBindingListener
sessionWillPassivate of HttpSessionActivationListener
Resumen
El tiempo que durar la sesin de inactividad en el Tomcat se registra en el
web.xml en minutos.
<session-config>
<session-timeout>30</session-timeout>
</session-config>
Mtodo para destruir una sesin programaticamente
session.sinvalidate();
Si desea saber ms acerca de estos temas, puede consultar la siguiente pgina.
http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpSession.html
CIBERTEC
CARRERAS PROFESIONALES
58
UNIDAD DE
APRENDIZAJE
SERVLET Y JSP
LOGRO DE LA UNIDAD DE APRENDIZAJE
TEMARIO
ACTIVIDADES PROPUESTAS
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
59
1.1 Historia
El concepto de "patrn de diseo" que tenemos en Ingeniera del Software se ha
tomado prestado de la arquitectura. En 1977, se publica el libro "A Pattern
Language: Towns/Building/Construction", de Christopher Alexander, Sara
Ishikawa, Murray Silverstein, Max Jacobson, Ingrid Fiksdahl-King y Shlomo Angel,
Oxford University Press. Contiene numerosos patrones con una notacin especfica
de Alexander.
Alexander comenta que cada patrn describe un problema que ocurre una y otra
vez en nuestro entorno, para describir despus el ncleo de la solucin a ese
problema, de tal manera que esa solucin pueda ser usada ms de un milln de
veces sin hacerlo siquiera dos veces de la misma forma. El patrn es un esquema
de solucin que se aplica a un tipo de problema. Esta aplicacin del patrn no es
mecnica, sino que requiere de adaptacin y matices. Por ello, dice Alexander
que los numerosos usos de un patrn no se repiten dos veces de la misma forma.
La idea de patrones de diseo estaba "en el aire", la prueba es que numerosos
diseadores se dirigieron a aplicar las ideas de Alexander a su contexto. El catlogo
ms famoso de patrones se encuentra en Design Patterns: Elements of
Reusable Object-Oriented Software, de Erich Gamma, Richard Helm, Ralph
Johnson y John
Vlissides, 1995, Addison-Wesley, tambin conocido como el libro GOF (GangOfFour).
Siguiendo el libro de GOF, los patrones se clasifican segn el propsito para el que
han sido definidos:
CIBERTEC
CARRERAS PROFESIONALES
60
Creacin
Clase
Objeto
CARRERAS PROFESIONALES
Mtodo de
Fabricacin
Estructural
De Conducta
Interprete
Adaptador (clases)
Plantilla
Cadena de
Responsabilidad,
Adaptador
Comando (orden),
Fbrica,
(objetos), Puente,
Iterador,
Constructor,
Composicin,
Intermediario,
Prototipo, Singleton Decorador,
Observador, Estado,
Fachada, Flyweight
Estrategia, Visitante,
Memoria
CIBERTEC
LENGUAJE DE PROGRAMACIN II
61
CIBERTEC
CARRERAS PROFESIONALES
62
Capa de Presentacin
Decorating Filter / Intercepting Filter
View Helper
Composite view
Service To Worker
Dispatcher View
Capa de Negocios
Business Delegate
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
63
Replicate Object
Aggregate Entity
Service Locator
Capa de Integracin
Service Activator
CARRERAS PROFESIONALES
64
Nombre
Propsito o finalidad
Sinnimos (otros nombres por los que puede ser conocido)
Problema al que es aplicable
Estructura (diagrama de clases)
Participantes (responsabilidad de cada clase)
Colaboraciones (diagrama de interacciones)
Implementacin (consejos, notas y ejemplos)
Otros patrones con los que est relacionado Ventajas de los
patrones:
La clave para la reutilizacin es anticiparse a los nuevos requisitos y cambios, de
modo que los sistemas evolucionen de forma adecuada. Cada patrn permite que
algunos aspectos de la estructura del sistema puedan cambiar independientemente
de otros aspectos. Facilitan la reusabilidad, extensibilidad y mantenimiento.
Un patrn es un esquema o microarquitectura que supone una solucin a
problemas (dominios de aplicacin) semejantes (aunque los dominios de problema
pueden ser muy diferentes e ir desde una aplicacin CAD a un cuadro de mando
empresarial). Interesa constatar una vez ms la vieja distincin entre dominio del
problema (donde aparecen las clases propias del dominio, como cuenta, empleado,
coche o beneficiario) y el dominio de la solucin o aplicacin (donde adems
aparecen clases como ventana, men, contenedor o listener). Los patrones son
patrones del dominio de la solucin.
Tambin, conviene distinguir entre un patrn y una arquitectura global del sistema.
Por decirlo en breve, es la misma distancia que hay entre el diseo de un
componente (o mdulo) y el anlisis del sistema. Es la diferencia que hay entre el
aspecto micro y el macro; por ello, en ocasiones, se denomina a los patrones como
"microarquitecturas".
En resumen, un patrn es el denominador comn, una estructura comn que tienen
aplicaciones semejantes. Esto tambin ocurre en otros rdenes de la vida. Por
ejemplo, en nuestra vida cotidiana, aplicamos a menudo el esquema
saludopresentacin-mensaje-despedida en ocasiones diversas.
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
65
import java.util.Comparator;
public class comparador implements Comparator {
public int compare( Object o1, Object o2 ) {
if ( ((ente)o1).obt_id() < ((ente)o2).obt_id() )
return 1;
if ( ((ente)o1).obt_id() > ((ente)o2).obt_id() )
return 1;
return 0;
}
CIBERTEC
CARRERAS PROFESIONALES
66
Pasos:
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
67
void b_abrir_actionPerformed(ActionEvent e) {
String texto_archivo = model.cargar_texto( indice_ref );
// Obtener texto de archivo
/*** Si la carga de archivo es ok, lo muestro. Si no, aviso
de error ****/
if (texto_archivo != null) {
vista.mostrar_texto(texto_archivo);
//
Mostrar texto
vista.mostrar_aviso("Carga de " + path
+ " completada.");
}
else
vista.mostrar_aviso("Error en la carga de " + path);
}
CIBERTEC
Factora simple: una clase que crea objetos de otras clases. No delega en
otras subclases y sus mtodos pueden ser estticos.
Factory Method: Se define como una interfaz para crear objetos, como en
el Abstract Factory, pero se delega a las subclases implementar la creacin
en concreto
Abstract Factory: Nos da una interfaz para crear objetos de alguna familia,
sin especificar la clase en concreto.
CARRERAS PROFESIONALES
68
public
public
CIBERTEC
LENGUAJE DE PROGRAMACIN II
69
CIBERTEC
CARRERAS PROFESIONALES
70
/***************************************************************
*********************
* Lanza dos veces
****************************************************************
******************/
public static void
jugar( Juego juego ) {
juego.lanzar();
juego.lanzar();
}
}
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
71
import java.io.*;
public class FactoriaJuegos
{
// true=Carga de Properties desde archivo
static boolean propiedadesCargadas = false;
private
// Propiedades
private static java.util.Properties prop = new
java.util.Properties();
/*****************************************************
* Crea y devuelve el juego
***************************************************************/
public static Juego getJuego( String nombreJuego ) {
try {
//// La clase se consigue leyendo del archivo properties
Class clase = Class.forName( getClase( nombreJuego ) );
//// Creo una instancia
return (Juego) clase.newInstance();
}
catch (ClassNotFoundException e) { // No existe la clase
e.printStackTrace();
return null;
}
catch (Exception e) {
// No puedo instanciar la clase
e.printStackTrace();
return null;
}
}
/***************************************************************
***********
* Lee un archivo properties donde se indica la clase que debe
ser instanciada
****************************************************************
******************/
private static String getClase( String nombrePropiedad )
CIBERTEC
CARRERAS PROFESIONALES
72
try {
//// Carga de propiedades desde archivo
if ( !propiedadesCargadas ) {
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
73
Resumen
Factora simple: una clase que crea objetos de otras clases. No delega en
otras subclases y sus mtodos pueden ser estticos.
Factory Method: se define una interfaz para crear objetos, como en el
Abstract Factory, pero se delega a las subclases implementar la creacin
en concreto.
Abstract Factory: da una interfaz para crear objetos de alguna familia, sin
especificar la clase en concreto.
CIBERTEC
CARRERAS PROFESIONALES
74
UNIDAD DE
APRENDIZAJE
SERVLET Y JSP
LOGRO DE LA UNIDAD DE APRENDIZAJE
TEMARIO
ACTIVIDADES PROPUESTAS
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
75
Contexto
1.2
Problema
1.3
Solucin
Utilizar un Data Access Object (DAO) para abstraer y encapsular todos
los accesos a la fuente de datos. El DAO maneja la conexin con la
fuente de datos para obtener y almacenar datos.
El DAO implementa el mecanismo de acceso requerido para trabajar con
la fuente de datos.
CARRERAS PROFESIONALES
76
1.4
Diagrama de Clases
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
77
CIBERTEC
CARRERAS PROFESIONALES
78
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
79
3. CARRITO DE COMPRAS
3.1 Definicin
El carrito de compras es una funcionalidad tpica de toda aplicacin
web comercial y permite a un usuario adquirir productos y/o servicios
de manera fcil e intuitiva.
CIBERTEC
CARRERAS PROFESIONALES
80
Catlogo de Productos
Carrito de Compras
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
81
venta_productomain.jsp
JSP que visualiza el catlogo de productos y a partir del cual se accede al
carrito de compras.
CIBERTEC
CARRERAS PROFESIONALES
82
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
83
ServletCarrito.java
Implementa toda la funcionalidad base del Carrito de compras.
CIBERTEC
CARRERAS PROFESIONALES
84
package edu.cibertec.admin.servlet;
import javax.servlet.http.*;
import java.util.*;
public class ServletCarrito extends javax.servlet.http.HttpServlet {
public void elimina(
javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response)
throws javax.servlet.ServletException, java.io.IOException {
// --- Para cdigo de producto.
String sCodigo;
// --- Para manejo de la sesin.
HttpSession se = request.getSession();
sCodigo = request.getParameter("optCodigo");
// --- Para eliminar.
if (sCodigo != null) {
// --- Declaramos una tabla.
Hashtable htCarrito;
// --- Obtenemos la tabla a partir de la sesin.
htCarrito = (Hashtable) (se.getAttribute("objCarrito"));
// --- Elimino el elemento.
htCarrito.remove(sCodigo);
// --- Guardamos la tabla actualizada en la sesin.
se.setAttribute("objCarrito", htCarrito);
}
// --- Mostramos el contenido del carrito.
response.sendRedirect("venta_productocarrito.jsp");
}
public void limpia(
javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response)
throws javax.servlet.ServletException, java.io.IOException {
// --- Para manejo de la sesin.
HttpSession se = request.getSession();
// --- Declaramos una tabla.
Hashtable htCarrito;
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
85
CIBERTEC
CARRERAS PROFESIONALES
86
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
87
venta_productocarrito.jsp
JSP que visualiza el carrito de compras e invoca al ServletCarrito para administrar
el carrito.
CIBERTEC
CARRERAS PROFESIONALES
88
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
CIBERTEC
89
CARRERAS PROFESIONALES
90
Resumen
http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o
Aqu hallar definiciones de patrones.
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
91
UNIDAD DE
APRENDIZAJE
TEMARIO
ACTIVIDADES PROPUESTAS
Los alumnos crearn aplicaciones que permitan utilizar una seguridad adecuada.
CIBERTEC
CARRERAS PROFESIONALES
92
1 Mecanismos de seguridad
La seguridad en los Servlets se reduce a cuatro conceptos principales:
data integrity: Es el proceso que asegura que los datos que se reciben
(tanto el cliente como el servidor) no han sido corrompidos. Generalmente
se usan algoritmos de encriptacin para lograr esto.
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
93
3 Autorizacin
El primer paso es definir los roles que se encontrarn definidos dentro de nuestro
sistema. Para el caso de Tomcat, estos se definen en el archivo tomcat-users.xml.
Dentro de este archivo, cada usuario tiene asignado un usuario y password; y
puede estar asociado a uno o ms roles.
<tomcat-users>
<role rolename="Admin/">
<role rolename="Member/">
<role rolename="Guest/">
<user username="jose" password="duke" roles="Admin,">
</tomcat-users>
<security-constraint>
<web-resource-collection>
<web-resource-name>ActulizarDatos</web-resource-name>
<url-pattern>/cl/jug/actualizar/*</url-pattern>
<url-pattern>/cl/jug/listar/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>Admin</role-name>
<role-name>Member</role-name>
</auth-constraint>
CIBERTEC
CARRERAS PROFESIONALES
94
</security-constraint>
El elemento <web-resource-name>
principalmente por los IDEs.
es
obligatorio
utilizado
4 Autentificacin
Anteriormente mencionamos que la especificacin de servlet ofrece cuatro tipos de
autentificacin: BASIC, FORM, CLIENT-CERT y DIGEST.
Cada uno de estos tipos se puede definir en el web.xml de la siguiente forma:
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
95
<form-login-page>/loginUsuario.html</form-login-page>
<form-error-page>/loginError.html</form-error-page>
</form-login-config>
</login-config>
<login-config>
<auth-method>CLIENT-CERT</auth-method>
</login-config>
<login-config>
<auth-method>DIGEST</auth-method>
</login-config>
5 Modos de transporte
La especificacin tambin define tres modos para indicar la seguridad del transporte
de los datos a travs de la web.
<security-constraint>
<web-resource-collection>
<web-resource-name>ActulizarDatos</web-resource-name>
<url-pattern>/cl/jug/actualizar/*</url-pattern>
<url-pattern>/cl/jug/listar/*</url-pattern>
<httpmethod>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>Admin</role-name>
<role-name>Member</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transportguarantee>
</user-data-constraint>
</security-constraint>
CIBERTEC
CARRERAS PROFESIONALES
96
6 El mtodo isUserInRole()
La clase HTTPServletRequest tiene tres mtodos que estn asociados al manejo
de la seguridad de manera programtica. Uno de estos es el mtodo
isUserInRole.
A travs del mtodo isUserInRole(), en vez de manejar el acceso a nivel de
mtodo HTTP, ahora podremos autorizar el acceso a una parte del cdigo de
nuestro mtodo basados en los roles del usuario.
Antes de que se llame al mtodo isUserInRole(), el usuario necesita estar
autenticado. En el caso de que llame al mtodo sobre un usuario que no ha
autenticado, el contenedor retornar false.
En el caso de que est autenticado, el contenedor toma el argumento del mtodo y
compara este con los roles definidos para el usuario en el request.
Si el usuario es ubicado a este rol, el contenedor retornar true.Por ejemplo,
dentro del cdigo en el servlet:
if( request.isUserInRole(DukeChile)) {
// Permiso para actualizar la informacion
}
else {
// permiso solo para consultar la informacion
}
<servlet>
<security-role-ref>
<role-name> DukeChile </role-name>
<role-link>Admin</role-link>
</security-role-ref>
...
</servlet>
<security-role>
<role-name>Admin</role-name>
</security-role>
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
97
Preguntas de Certificacin
1. Cul de las siguientes sentencias sigue los conceptos de integridad?
(Seleccione uno.)
a It guarantees that information is accessible only to certain users. b It
guarantees that the information is kept in encrypted form on the
server. c It guarantees that unintended parties cannot read the
information during transmission between the client and the server.
d It guarantees that the information is not altered during transmission between
the client and the server.
2. Cul de los siguientes procesos se utiliza cuando un usuario ha accedido a un
recurso en particular? (Seleccione uno.)
a
Authorization
b
Authenticatio
nc
Confidentialit
y
d Secrecy
3. Cul de los siguientes procesos se realiza despus de haber hecho la
autorizacin? (Seleccione uno.)
a Data validation
b User
authentication c
Data encryption
d Data compression
4. Cules de las siguientes acciones debern ejecutarse para prevenir que su sitio
web sea atacado? (Seleccione tres.)
a Block network traffic at all the ports except the HTTP port.
b Audit the usage pattern of your server.
c Audit the Servlet/JSP code. d Use HTTPS instead of HTTP.
CIBERTEC
CARRERAS PROFESIONALES
98
Resumen
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
CIBERTEC
99
CARRERAS PROFESIONALES
100
UNIDAD DE
APRENDIZAJE
STANDARD ACTIONS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, los alumnos crearn aplicaciones web en Java que
utilice en los JSP la tecnologia Standard Actions, que utilice jsp:useBean,
jsp:setProperty, jsp:getProperty, jsp:atribute en la implemetacin de cada
JSP.
TEMARIO
ACTIVIDADES PROPUESTAS
Los alumnos crearn aplicaciones que permitan utilizar los tag estndares.
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
101
1 La accin <jsp:include>
Esta accin incluye en una pgina la salida generada por otra perteneciente a la
misma aplicacin web. La peticin se redirige a la pgina incluida, y la respuesta
que genera se incluye en la generada por la principal. Su sintaxis es la siguiente:
La accin <jsp:plugin>
Esta accin sirve para incluir, de manera portable e independiente del navegador,
applets que utilicen alguna librera de Java 2 (Swing, colecciones, Java 2D), ya que
las mquinas virtuales Java distribuidas con algunos navegadores relativamente
antiguos (Explorer 5.x, Netscape 4.x) son de una versin anterior a Java 2.
La accin <jsp:forward>
Esta accin se utiliza para redirigir la peticin hacia otra pgina JSP que est en la
misma aplicacin web que la actual. Un ejemplo de su sintaxis bsica es la
siguiente:
<jsp:forward page="principal.jsp"/>
La salida generada hasta el momento por la pgina actual se descarta (se borra el
buffer). En caso de que no se utilizara buffer de salida, se producira una excepcin.
Al igual que en el caso de <jsp:include>, se pueden aadir parmetros a la peticin
original para que los reciba la nueva pgina JSP:
<jsp:forward page="principal.jsp">
<jsp:param name="privilegios" value="root" />
CIBERTEC
CARRERAS PROFESIONALES
102
</jsp:forward>
2 Accin jsp:include
Esta accin nos permite insertar archivos en una pgina que est siendo generada.
La sintaxis se parece a esto:
<jsp:include page="relative URL" flush="true" />
WhatsNew.jsp
<OL>
<LI><jsp:include
<LI><jsp:include
<LI><jsp:include
<LI><jsp:include
</OL>
CARRERAS PROFESIONALES
page="news/Item1.html"
page="news/Item2.html"
page="news/Item3.html"
page="news/Item4.html"
flush="true"/>
flush="true"/>
flush="true"/>
flush="true"/>
CIBERTEC
LENGUAJE DE PROGRAMACIN II
103
</BODY>
</HTML>
Accin jsp:useBean
Esta accin nos permite cargar y utilizar un JavaBean en la pgina JSP. Esta es
una capacidad muy til porque nos permite utilizar la reusabilidad de las clases
Java sin sacrificar la conveniencia de aadir JSP sobre Servlets solitarios. La
sintaxis ms simple para especificar que se debera usar un Bean es la siguiente:
<jsp:useBean id="name" class="package.class" />
CIBERTEC
CARRERAS PROFESIONALES
104
BeanTest.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Reusing JavaBeans in JSP</TITLE>
<LINK REL=STYLESHEET
HREF="My-Style-Sheet.css"
TYPE="text/css">
</HEAD>
<BODY>
<CENTER>
<table BORDER=5>
<TR><TH CLASS="TITLE">
Reusing JavaBeans in JSP</table>
</CENTER>
<P>
<jsp:useBean id="test" class="hall.SimpleBean" />
<jsp:setProperty name="test"
property="message"
value="Hello WWW" />
<H1>Message: <I>
<jsp:getProperty name="test" property="message" />
</I></H1>
</BODY>
</HTML>
SimpleBean.java
Aqu est el cdigo fuente empleado para el bean usado en la pgina BeanTest.
Tambin, se puede emplear as:
package hall;
public class SimpleBean {
private String
message = "No message specified";
public String getMessage()
{
return(message);
}
this.message =
CIBERTEC
LENGUAJE DE PROGRAMACIN II
105
Ms detalles de jsp:useBean
La forma ms sencilla de usar un bean es usar
<jsp:useBean id="name" class="package.class" />
para indicar que la porcin Body slo se debera ejecutar cuando el bean es
ejemplarizado por primera vez, no cuando un bean existente se encuentre y se
utilice. Como se explica abajo, los bean pueden ser compartidos, por eso no todas
las sentencias jsp:useBean resultan en la ejemplarizacin de un bean. Segundo,
adems de id y class, hay otros tres atributos que podemos usar: scope, type, y
beanName.
id
Uso
Da un nombre a la variable que referenciar el bean. Se usar un objeto bean anterior en
lugar de ejemplarizar uno nuevo si se puede encontrar uno con el mismo id y scope.
class
Atributo
scope
Indica el contexto en el que el bean debera estar disponible. Hay cuatro posibles valores:
page, request, session, y application. El valor por defecto, page, indica que el bean estar
slo disponible para la pgina actual (almacenado en el PageContext de la pgina actual).
Un valor de request indica que el bean slo est disponible para la peticin actual del
cliente (almacenado en el objeto ServletRequest). Un valor de session indica que el objeto
est disponible para todas las pginas durante el tiempo de vida de la HttpSession actual.
Finalmente, un valor de application indica que est disponible para todas las pginas que
compartan el mismo ServletContext. La razn de la importancia del mbito
es que una entrada jsp:useBean slo resultar en la ejemplarizacin de
un nuevo objeto si no haba objetos anteriores con el mismo id y scope.
De otra forma, se usarn los objetos existentes, y cualquier elemento
jsp:setParameter u otras entradas entre las etiquetas de inicio
jsp:useBean y la etiqueta de final, sern ignoradas.
CARRERAS PROFESIONALES
106
3 Accin jsp:setProperty
Usamos jsp:setProperty para obtener valores de propiedades de los beans que se
han referenciado anteriormente. Podemos hacer esto en dos contextos. Primero,
podemos usar antes jsp:setProperty, pero fuera de un elemento jsp:useBean, de
esta forma:
<jsp:useBean id="myName" ... />
...
<jsp:setProperty name="myName"
property="someProperty" ... />
En este caso, el jsp:setProperty se ejecuta sin importar si se ha ejemplarizado un
nuevo bean o se ha encontrado uno ya existente. Un segundo contexto en el que
jsp:setProperty puede aparecer dentro del cuerpo de un elemento jsp:useBean, de
esta forma:
<jsp:useBean id="myName" ... >
...
<jsp:setProperty name="myName"
property="someProperty" ... />
</jsp:useBean>
Aqu, el jsp:setProperty slo se ejecuta si se ha ejemplarizado un nuevo objeto, no
si se encontr uno ya existente.
Aqu tenemos los cuatro atributos posibles de jsp:setProperty:
Atributo
Uso
CIBERTEC
LENGUAJE DE PROGRAMACIN II
107
Accin jsp:getProperty
Este elemento recupera el valor de una propiedad del bean, lo convierte a un string
e inserta el valor en la salida. Los dos atributos requeridos son name, el nombre de
un bean referenciado anteriormente mediante jsp:useBean, y property, la propiedad
cuyo valor debera ser insertado. Aqu tenemos un ejemplo:
CIBERTEC
CARRERAS PROFESIONALES
108
Accin jsp:forward
Esta accin nos permite reenviar la peticin a otra pgina. Tiene un slo atributo,
page, que debera consistir en una URL relativa. Este podra ser un valor esttico
o podra ser calculado en el momento de la peticin, como en estos dos ejemplos:
<jsp:forward page="/utils/errorReporter.jsp" />
<jsp:forward page="<%= someJavaExpression %>" />
Accin jsp:plugin
Esta accin nos permite insertar un elemento OBJECT o EMBED especfico del
navegador para especificar que el navegador debera ejecutar un applet usando el
Plug-in Java.
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
109
Preguntas de Certificacin
1. Cul de las siguientes sentencias es vlida para usar la accin
<jsp:useBean>?
(Seleccione una opcin.)
a. <jsp:useBean id="address" class="AddressBean" />
b. <jsp:useBean name="address" class="AddressBean"/>
c. <jsp:useBean bean="address" class="AddressBean" />
d. <jsp:useBean beanName="address" class="AddressBean" />
2. Cul de las siguientes sentencias es el camino vlido para obtener el atributo
de los beans? (Seleccione una opcin.)
a. <jsp:useBean action="get" id="address" property="city" />
b. <jsp:getProperty id="address" property="city" />
c. <jsp:getProperty name="address" property="city" />
d. <jsp:getProperty bean="address" property="*" />
3. Cules de los siguientes son usos vlidos de la accin <jsp:useBean>?
(Seleccione dos opciones.)
a. <jsp:useBean id="address" class="AddressBean" name="address" />
b. <jsp:useBean id="address" class="AddressBean" type="AddressBean" />
c. <jsp:useBean
id="address"
beanName="AddressBean"
class="AddressBean" />
d. <jsp:useBean
id="address"
beanName="AddressBean"
type="AddressBean" />
4. Cul de los siguientes gets or sets del bean es vlido en el contenedor
ServletContext? (Seleccione una opcin.)
a. <jsp:useBean id="address" class="AddressBean" />
b. <jsp:useBean id="address" class="AddressBean" scope="application" />
c. <jsp:useBean id="address" class="AddressBean" scope="servlet" />
d. <jsp:useBean id="address" class="AddressBean" scope="session" />
e. Ninguna de las anteriores
5. Considere el siguiente cdigo:
<html><body>
<jsp:useBean id="address" class="AddressBean" scope="session" />
state = <jsp:getProperty name="address" property="state" />
</body></html>
Cules de las siguientes lneas es vlida para remplazar la primera lnea de
cdigo Java? (Seleccione tres lneas.)
a. <% state = address.getState(); %>
b. <% out.write("state = "); out.print(address.getState()); %>
c. <% out.write("state = "); out.print(address.getstate()); %>
d. <% out.print("state = " + address.getState()); %>
e. state = <%= address.getState() %>
f. state = <%! address.getState(); %>
CIBERTEC
CARRERAS PROFESIONALES
110
Resumen
Aqu est el cdigo fuente usado para el Bean usado en la pgina BeanTest.
package hall;
public class SimpleBean { private String
message = "No message specified";
public String getMessage() {
return(message);
}
public void setMessage(String message) {
this.message = message;
}
}
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
111
UNIDAD DE
APRENDIZAJE
CUSTOM TAG
LOGRO DE LA UNIDAD DE APRENDIZAJE
TEMARIO
Custom Tag
ACTIVIDADES PROPUESTAS
Los alumnos crearn aplicaciones que permitan utilizar los tag personalizados.
CIBERTEC
CARRERAS PROFESIONALES
112
1 CustomTag
La tecnologa JSP nos permite introducir cdigo Java en pginas HTML. Este
documento supone que est familiarizado con la creacin de pginas JSP y que
tiene instalado Apache-Tomcat (en realidad, valdria cualquier servidor de JSP que
cumpla la especificacion JSP 1.1, pero los ejemplos se han probado en Tomcat).
Las JSP estn compuestas por varios tags o, como las denominaremos en
adelante, etiquetas. Ejemplos de etiquetas JSP son setProperty, include,
forward, usebean. Todas ellas encapsulan comportamientos de una manera
sencilla. Nos detendremos en la etiqueta <jsp:useBean>. Esta etiqueta crea una
instancia de una clase definida como un JavaBean. El uso de la etiqueta
<jsp:useBean> en conjuncin con los JavaBeans hace que podamos separar la
lgica de presentacin de la de proceso y consigue unos archivos JSP ms claros,
y lo que es ms importante, el que escribe la JSP no tiene por qu tener unos
conocimientos avanzados de programacin para crear pginas JSP de
funcionalidades avanzadas. Pues bien, las JSP Custom Tags son un paso ms all.
Con ellas se pueden aadir nuevas etiquetas a las ya existentes en JSP (eso s a
partir de la especificacion JSP 1.1) que encapsulen comportamientos ms o menos
complicados. Antes de seguir, vamos a revisar algunos conceptos.
Hay dos tipos principales de etiquetas: etiquetas que no tienen cuerpo y etiquetas
que s lo tienen. Ejemplos son la etiqueta <img src="asdfa.gif"> que no tiene cuerpo
y no tiene etiqueta de final; y <title>manolo</title> que tiene cuerpo y etiqueta de
final. Estos son tambin los dos tipos de etiquetas JSP que nos podemos crear a
medida.
CIBERTEC
LENGUAJE DE PROGRAMACIN II
113
return SKIP_BODY;
CIBERTEC
CARRERAS PROFESIONALES
114
}
public void setPageContext(PageContext pc){
this.pc = pc;
}
public void setParent(Tag parent){
this.parent = parent;
}
public Tag getParent(){
return parent;
HolaMundoTag.java
Vemos que la funcionalidad de la etiqueta es mnima, la cantidad de mtodos a
implementar es bastante grande y la mayora de ellos triviales. La especificacin
JSP 1.1 nos provee de una clase que implementa una Custom Tag con la
funcionalidad mnima y de la que podemos heredar para sobreescribir los mtodos
que necesitemos. Esta clase es TagSupport, el cdigo anterior se puede reescribir
de la siguiente manera:
// HolaMundoTag.java import
java.io.*; import
javax.servlet.jsp.*; import
javax.servlet.jsp.tagext.*;
public class HolaMundoTag extends TagSupport{
public int doStartTag() throws JspException {
try{
pageContext.getOut().print("Hola
Mundo");
} catch (IOException e) {
throw new
JspException ("Error: IOException" +
e.getMessage());
}
return
SKIP_BODY;
}
public int doEndTag() throws JspException {
return EVAL_PAGE;
}
}
HolaMundoTag.java
Se necesita importar java.io.* para escribir en el cliente. Los otros dos import son
los tpicos para una JSP Custom Tag. El mtodo doStartTag se invoca cuando se
encuentra la etiqueta de apertura, el cdigo tiene que ir incluido en un try-catch
porque el mtodo print() puede generar una IOException, al final se devuelve el
valor SKIP_BODY que le indica al motor de JSP que la etiqueta no tiene cuerpo (en
realidad que no queremos evaluar el cuerpo). El mtodo doEndtag se invoca
cuando se encuentra la etiqueta de cierre. En este ejemplo, se devuelve
EVAL_PAGE para que siga evaluando el resto de la pgina. Si no queremos
evaluar el resto de la pgina, el valor por devolver ser SKIP_PAGE.
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
115
Tomcat
est
instalado
en
c:\tomcat:
javac
-classpath
c:\tomcat\lib\common\servlet.jar HolaMundoTag.java
Ya tenemos la etiqueta compilada. Ahora tenemos que decirle a Tomcat cmo y
cundo utilizarla. Para esto tenemos que crear un archivo que describa a esta
etiqueta, en concreto que describa una librera de etiquetas. Este archivo se llama
Tag Library Descriptor y sigue una sintaxis xml:
<!-- Ejemplos.tld -->
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library
1.1//EN"
"http://java.sun.com/JEE/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>ejemplos</shortname>
<uri></uri>
<info>Etiquetas de ejemplo</info>
<tag>
<name>holamundo</name>
<tagclass>HolaMundoTag</tagclass>
<bodycontent>empty</bodycontent>
<info>Saludo</info>
</tag>
</taglib>
Ejemplos.tld
El documento empieza con la etiqueta que declara que es un documento xml y la
declaracin DOCTYPE. Luego, el resto estar encerrado entre <taglib> y </taglib>.
Las etiquetas <tlibversion> y <jspversion> definen las versiones de la librera de
etiquetas y de la especificacin JSP, respectivamente. Vemos que cada etiqueta
va encerrada entre <tag> y </tag> y lleva el nombre de la etiqueta (<name>), la
clase que implementa la etiqueta (<tagclass>), si tiene cuerpo (<bodycontent>, en
este caso empty para indicar que no lleva) y la etiqueta <info> que almacena una
descripcin de la etiqueta.
Ya tenemos la clase que implementa la etiqueta (que por cierto, para probarla, la
guardaremos
en
c:\tomcat\webapps\ejemplos\WEBINF\classes\HolaMundoTag.class, suponiendo que el Tomcat est en c:\tomcat), el
tag
library
descriptor
(que
guardaremos
en
c:\tomcat\webapps\ejemplos\Ejemplos.tld) y necesitamos una pgina JSP para
probar nuestra primera etiqueta personalizada; por ejemplo, esta:
<!-- HolaMundo.jsp -->
<%@ taglib uri="Ejemplos.tld" prefix="ejemplos" %>
<HTML>
<HEAD>
<TITLE>Tag Hola Mundo</TITLE>
CIBERTEC
CARRERAS PROFESIONALES
116
</HEAD>
<ejemplos:holamundo/>
</BODY>
</HTML>
HolaMundo.jsp
Vemos que es una JSP normal a excepcin de nuestra nueva etiqueta. Obsrvese
que no tiene etiqueta de cierre porque no tiene cuerpo. En la directiva taglib
definimos dnde se encuentra la librera de etiquetas y el nombre por el que nos
referiremos a esta librera durante todo el documento.
Si
situamos
el
archivo
HolaMundo.jsp
en
c:\tomcat\webapps\ejemplos\HolaMundo.jsp, arrancamos el Tomcat y visitando la
direccin http://localhost:8080/ejemplos/HolaMundo.jsp (sustituyendo el host y el
puerto de acuerdo con nuestra configuracin) veremos nuestra primera etiqueta en
accin.
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
117
import javax.servlet.jsp.*;
import
javax.servlet.jsp.tagext.*;
public class SumaTag extends
TagSupport{
private int num1,num2;
public void setNum1(int num1){
this.num1 = num1;
}
public void setNum2(int num2){
this.num2 = num2;
}
public int doStartTag() throws JspException {
try{
pageContext.getOut().print("Suma: " +
(num1+num2));
} catch (IOException e) {
throw new
JspException ("Error: IOException" +
e.getMessage());
}
return
SKIP_BODY;
}
public int doEndTag() throws JspException {
return SKIP_PAGE;
}
}
SumaTag.java
Tenemos que aadir la nueva etiqueta, a la librera de ejemplos, el archivo
Ejemplos.tld. El esqueleto es el mismo que el anterior, solo que ahora tenemos que
aadir una serie de etiquetas para cada atributo. Por cada atributo, le diremos su
nombre, con la etiqueta <name>, si es necesaria o no, con la etiqueta <required> y
si tiene que ser averiguada en tiempo de ejecucin con la etiqueta <rtexprvalue>.
En nuestro caso, tenemos que aadir esto a Ejemplos.tld entre <taglib> y </taglib>:
<tag>
<name>suma</name>
<tagclass>SumaTag</tagclass>
<bodycontent>empty</bodycontent>
<info>Saludo</info>
<attribute>
<name>num1</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>num2</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
CIBERTEC
CARRERAS PROFESIONALES
118
Ejemplos.tld
El cdigo de la jsp es igual de complicado que el de la etiqueta anterior:
<%@ taglib uri="Ejemplos.tld" prefix="ejemplos" %>
<HTML>
<HEAD>
<TITLE>Tag Suma</TITLE>
</HEAD>
<ejemplos:suma num1="2" num2="3"/>
</BODY>
</HTML>
Ejemplos.tld
Si
colocamos
los
archivos
de
la
misma
forma
que
antes
(c:\tomcat\webapps\ejemplos\Ejemplos.tld,
c:\tomcat\webapps\ejemplos\Suma.jsp,
c:\tomcat\webapps\ejemplos\classes\SumaTag.class)
y
visitamos
http://localhost:8080/ejemplos/Suma.jsp, veremos cmo funciona nuestra segunda
etiqueta personalizada.
// LongitudTag.java
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
119
LongitudTag.java
Primero, tomamos el contenido del cuerpo y lo almacenamos en bc. Lo tratamos
como cadena y lo guardamos en cuerpo y obtenemos un canal de salida para
escribir en el cliente con getEnclosingWriter(). Compilamos LogitudTag.
Ahora tenemos que incluir la nueva etiqueta en nuestra librera:
<tag>
<name>longitud</name>
<tagclass>LongitudTag</tagclass>
<bodycontent>JSP</bodycontent>
<info>calcula longitud de una cadena</info>
</tag>
Ejemplos.tld
La nueva etiqueta <bodycontent> le indica al motor de jsp cul va a ser el contenido
del cuerpo.Si el contenido es texto, html u otras etiquetas, se indica JSP. Otros tipos
de contenidos son tagdependent. Esto no afecta a la interpretacin de la etiqueta,
solamente es informativo.
La jsp de prueba es tanto o ms complicada que las anteriores:
<%@ taglib uri="Ejemplos.tld" prefix="ejemplos" %>
<HTML>
<HEAD>
<TITLE>Tag Longitud</TITLE>
</HEAD>
<ejemplos:longitud>
CIBERTEC
CARRERAS PROFESIONALES
120
Longitud.jsp
Como siempre, se colocan los archivos en su sitio, se ejecuta el Tomcat y se visita
http://localhost:8080/ejemplos/Longitud.jsp
Hay un caso concreto de etiquetas con cuerpo, cuando se necesita que se evale
el cuerpo ms de una vez. Esto se consigue devolviendo EVAL_BODY_TAG en
lugar de SKIP_BODY en el mtodo doAfterBody().
Como ejemplo, vamos a programar una etiqueta personalizada que realice un
bucle, que escriba un nmero determinado de veces el cuerpo de la etiqueta.
El cdigo de la clase de la etiqueta bucle es el siguiente:
// BucleTag.java import
java.io.*; import
javax.servlet.jsp.*; import
javax.servlet.jsp.tagext.*;
public class BucleTag extends BodyTagSupport{
int veces = 0;
BodyContent bc;
public void setVeces(int veces) {
this.veces = veces;
}
public void
setBodyContent(BodyContent bc){
this.bc = bc;
}
public int doAfterBody() throws
JspException {
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
121
if (veces-->0){
try {
JspWriter out = bc.getEnclosingWriter();
out.println(bc.getString());
bc.clearBody();
} catch (IOException e) {
system.out.println("Error en Tag Bucle" +
e.getMessage());
return EVAL_BODY_TAG;
} else {
return SKIP_BODY;
}
}
}
BucleTag.java
Debemos aadir la descripcin de esta nueva etiqueta a la librera:
<tag>
<name>bucle</name>
<tagclass>BucleTag</tagclass>
<bodycontent>JSP</bodycontent>
<info>realiza un bucle</info>
<attribute>
<name>veces</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
Ejemplos.tld
Como es la ltima etiqueta de esta introduccin, la JSP va a ser la ms complicada
XD.
<!-- Bucle.jsp-->
<%@ taglib uri="Ejemplos.tld" prefix="ejemplos" %>
<HTML>
<HEAD>
<TITLE>Tag Bucle</TITLE>
</HEAD>
<ejemplos:bucle veces="5">
Dentro del bucle<br>
</ejemplos:bucle>
</BODY>
</HTML>
CIBERTEC
CARRERAS PROFESIONALES
122
Bucle.jsp
Despus de colocar los archivos en sus lugares habituales, lanzamos el Tomcat y
visitamos http://localhost:8080/ejemplos/Bucle.jsp.
Resumen
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
123
UNIDAD DE
APRENDIZAJE
TEMARIO
JSTL
Objetos Implcitos
ACTIVIDADES PROPUESTAS
CIBERTEC
Los alumnos crearn aplicaciones que permitan utilizar los tag estndares.
CARRERAS PROFESIONALES
124
Prefijo
URI por Defecto
c
http://java.sun.com/jstl/core
x
http://java.sun.com/jstl/xml
http://java.sun.com/jstl/fmt
http://java.sun.com/jstl/sql
La Librera Core contiene acciones para las tareas rutinarias, como incluir o excluir
una parte de una pgina dependiendo de una condicin en tiempo de ejecucin,
hacer un bucle sobre una coleccin de tems, manipular URLs para seguimiento de
sesin, y la correcta interpretacin del recurso objetivo. Asimismo, tiene acciones
para importar contenido de otros recursos y redireccionar la respuesta a una URL
diferente.
La Librera XML contiene acciones para procesamiento XML, incluido validar un
documento XML y transformarlo usando XSLT. Tambin, proporciona acciones
para extraer parte de un documento XML validado, hacer bucles sobre un conjunto
de nodos y procesamiendo condicional basado en valores de nodos.
La Internationalizacin (i18n) y el formateo general estn soportados por las
acciones de la Librera I18N & Formatting. Podemos leer y modificar informacin
almacenada en una base de datos con las acciones proporcionadas por la Librera
Database Access.
Ms adelante, podemos esperar que todos los contenedores web incluyan una
implementacin de las libreras JSTL, as no tendremos que instalar ningn cdigo
adicional. Hasta que esto suceda, podemos descargar e instalar la implementacin
de referencia (RI) de JSTL. Se ha desarrollado dentro del proyecto Apache Taglibs
como una librera llamada Standard.
Instalar RI es fcil, slo hay que copiar los archivos JAR del directorio lib de la
distribucin al directorio WEB-INF/lib de nuestra aplicacin. Obsrvese que JSTL
1.0 requiere un contenedor JSP 1.2; por ello, debemos asegurarnos de tener un
contenedor compatible con JSP 1.2 antes de probar esto.
Para usar una librera JSTL, tanto si la implementacin est incluida con el
contenedor o con el RI, debemos declarar la librera usando una directiva taglib,
como lo haramos con una librera de etiquetas personalizadas normal:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
125
Obsrvese que siempre deberamos usar la URI por defecto, incluso aunque la
especificacin JSP nos permita sobreescribirla. Un contenedor puede generar
cdigo optimizado para la accin JSTL en la clase correspondiente a una pgina
JSP. Esto puede resultar en un mejor rendimiento que cuando el cdigo generado
llama a los manejadores de etiquetas a travs del API estndar. Sin embargo, slo
cuando se usa la URI por defecto, es cuando el contenedor puede utilizar una
implementacin optimizada.
${myList[2]}$
${myList[aVar + 1]}$
CIBERTEC
CARRERAS PROFESIONALES
126
Descripcin
Operad
or
.
Accede a una propiedad.
[]
Accede a un elemento de un array/lista.
()
Suma
/ o div Divisin
% o mod Mdulo (resto)
== o eq
Comprueba Igualdad.
!= o ne
Comprueba desigualdad.
< o lt
> o gt
<= o le
>= o gt
Comprueba mayor o igual que.
&& o and Comrpueba AND lgico.
|| o or
Comprueba OR lgico. ! o
not
Complemento
binario
booleano
empty
String
Integer
Coma
Floating
Boolean
Descripcin
Encerrado con comillas simples o dobles. Una comilla del mismo tipo
dentro del string puede ser escapada con una barra invertida: (\' en un
string
encerrado con comillas simples; \" en un string encerrado con comillas
dobles). El carcter de barra invertida debe ser escapado como \\ en
ambos casos.
Un signo opcional (+ o -) seguido por dgitos entre 0 y 9.
Lo mismo que un literal entero, excepto que usa un punto como
separador de la parte fraccional y que se puede especificar un exponente
con e o E, seguido por un literal entero.
true o false
Null
null
Cualquier objeto en uno de los mbitos de JSP (pgina, solicitud, sesin o
aplicacin) se puede utilizar como una variable en una expresin EL. Por ejemplo,
si tenemos un bean con una propiedad firstName en el mbito de la solicitud bajo
el nombre customer, esta expresin EL representa el valor de la propiedad
firstName del bean.
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
127
${customer.firstName}
Descripcin
Una collection de todos de los parmetros de la solicitud como un slo valor string
param
para cada parmetro
Una collection de todos los valores de los parmetros de la solicitud como un array
paramValues de valores string por cada parmetro
Una collection de todas las cabeceras de solicitud como un slo valor string por
header
cada cabecera
Una collection de todos los valores de cabecera de la solicitud como un array de
headerValues valores string por cada cabecera
Una collection con todas las cookies de la solicitud en un slo ejemplar de
cookie
javax.servlet.http.Cookie por cada cokkie
Una collection de todos los parmetros de inicializacin de la aplicacin en un slo
initParams
valor string por cada parmetro
pageContext Un ejemplar de la clase javax.servlet.jspPageContext
pageScope
${param.listType}
${header['User-Agent']}
Observe cmo se debe usar la sintaxis de array para la cabecera, porque el nombre
incluye un guion; con la sintaxis de propiedad, sera interpretado como la expresin
vairable header.User menos el valor de una variable llamada Agent.
La variable initParameter proporciona acceso a los parmetros de inicializacin que
se definen en el archivo web.xml de la aplicacin. La variable pageContext tiene
varias propiedades que proporcionan acceso al objeto servlet que representa la
solicitud, la respuesta, la sesin y la aplicacin, etc.
Las cuatro ltimas variables son colecciones que contienen todos los objetos de
cada mbito especfico. Podemos usarlas para limitar la bsqueda de un objeto en
slo un mbito en lugar de buscar en todos ellos, lo que est por defecto si no se
especifica ningn mbito. En otras palabras, si hay un objeto llamado customer en
el mbito de sesin, estas dos primeras expresiones encuentran el mismo objeto,
pero la tercera vuelve vaca:
CIBERTEC
CARRERAS PROFESIONALES
128
${customer}
${sessionScope.customer}
${requestScope.customer}
Todas las acciones JSTL aceptan expresiones EL como valores de atributo, para
todos los atributos excepto para var y scope, porque estos valores de atributo
podran usarse para chequear el tipo en el momento de la traduccin en una futura
versin. Hay un atributo de una accin JSTL adicional que no toma un valor de
expresin EL, pero slo se usa en la librera XML, por eso lo ignoraremos por ahora.
Se pueden usar una o ms expresiones EL en el mismo valor de atributo, y el texto
fijo y las expresiones EL se pueden mezclar en el mismo valor de atributo:
Antes de saltar a ver ejemplos de utilizacin de las acciones Core, se ver lo que
dijimos anteriormente: todas las acciones JSTL de la librera EL aceptan
expresiones EL. Realmente hay un conjunto parelelo de libreras JSTL, llamado
conjunto de librera RT que slo acepta expresiones Java del antiguo estilo:
First name: <c_rt:out value="<%= customer.getFirstName() %>" />
El valor del atributo test es una expresin EL que chequea si la cookie existe. El
operador empty combinado con el operador "not" (!) significa que evala a true si
el cookie no existe, haciendo que el cuerpo del elemento sea procesado. Dentro
del cuerpo, la accin <c:out> aade el valor de la cookie a la respuesta. As de
sencillo.
Pasar a travs de una coleccin de datos es casi tan sencillo. Este fragmento itera
sobre una coleccin de filas de una base de datos con informacin del tiempo de
diferentes ciudades:
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
129
La accin <c:set> selecciona una variable con el valor especificado por el atributo
value; que puede ser un valor esttico, como en este ejemplo, o una expresin EL.
Tambin, podemos especificar el mbito de la variable con el atributo scope (page,
request, session o application). En este ejemplo, hemos seleccionado una variable
llamada noOfRows a 10 en el mbito de la pgina (por defecto). Este es el nmero
de filas que mostraremos en cada solicitud.
El <c:forEach>, en este ejemplo, toma los mismos valores para los atributos tems
y var como antes, pero hemos aadido dos nuevos atributos:
CIBERTEC
130
CIBERTEC
LENGUAJE DE PROGRAMACIN II
131
<c:url> soporta un atributo var, usado para especificar una variable para contener
la URL codificada, y un atributo value para contener la URL a codificar. Se pueden
especificar parmetros string para solicitar la URL usando acciones <c:param>. Los
caracteres especiales en los parmetros especificados por elementos anidados son
codificados (si es necesario) y luego aadidos a la URL como parmetros string de
la consulta. El resultado final se pasa a travs del proceso de reescritura de URL,
aadiendo un ID de sesin si est desactivado el seguimiento de sesin usando
cookies. En este ejemplo, se utiliza la URL codificada como un valor de atributo href
en un elemento de enlace HTML.
<c:url> tambin realiza otro buen servicio. Las URL relativas en elementos HTML
tambin deben ser relativas a la pgina que los contiene o al directorio raz del
servidor (si empiezan con una barra inclinada). La primera parte del path de una
URL de una pgina JSP se llama path de contexto, y podra variar de instalacin a
instalacin. Por lo tanto, deberamos evitar codificar el path de contexto en las
pginas JSP. Pero algunas veces realmente queremos utilizar un path de URL
relativo al servidor en elemento HTML; por ejemplo, cuando necesitamos referirnos
a un archivo de imagen localizado en el directorio /images compartido por todas las
pginas JSP. Las buenas noticias es que si especificamos una URL con un barra
inclinada como el valor <c:url>, lo convierte en un path relativo al servidor. Por
ejemplo, en una aplicacin con el path de contexto /myApp, la accin <c:url>
convierte el path a /myApp/images/logo.gif:
<c:url value="/images/logo.gif" />
Hay unas cuantas acciones ms relacionadas con las URL en la librera corazn.
La accin <c:import> es una accin ms flexible que la accin estndar
<jsp:include>. Podemos usarla para incluir contenido desde los recursos dentro de
la misma aplicacin web, desde otras aplicaciones web en el mismo contenedor, o
desde otros servidores, usando protocolos como HTTP y FTP. La accion
<c:redirect> nos permite redirigir a otro recurso en la misma aplicacin web, en otra
aplicacin web o en un servidor diferente.
CIBERTEC
CARRERAS PROFESIONALES
132
La primera lnea es la directiva taglib para la librera JSTL que contiene las acciones
de formateo e internacionalizacin. El prefijo por defecto, usado aqu, es fmt. Para
obtener un valor a formatear, entonces crea un objeto java.util.Date que representa
la fecha y hora actuales, y lo graba como una variable llamada now.
Ya estamos preparados para hacer algn formateo sensible a la localidad. La
accin JSTL <fmt:formatDate> formatea el valor de la variable now asignado al
valor del atributo value usando el tipo de expresin EL que aprendimos en la pgina
anterior. El atributo dateStyle le dice a la accin cmo debe formatear la fecha.
Podemos usar cualquiera de los valores default, short, medium, long, o full para el
atributo dateStyle. El tipo de formateo que representa cada uno de estos tipos
depende exactamente de la localidad. Para la localidad English, full resulta en un
string como Thursday, August 29, 2002. En este ejemplo, slo hemos formateado
la parte de la fecha, pero tambin podemos incluir la parte de la hora (o formatear
slo la hora), y definir reglas de formateo personalizadas tanto para la fecha como
para la hora en lugar de los estilos dependientes de la localidad:
<fmt:formatDate value="${now}" type="both"
pattern="EEEE, dd MMMM yyyy, HH:mm" />
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
133
El atributo pattern toma un patrn de formateo personalizado del mismo tipo que la
clase java.text.SimpleDateFormat. El patrn usado aqu resulta en Thursday, 29
August 2002, 17:29 con la localidad English. La accin <fmt:formatNumber>
soporta atributos similares para especificar cmo formatear un nmero usando
estilos dependientes de la localidad para nmeros normales, valores de moneda, o
un porcentaje, as como usar patrones personalizados de diferentes tipos.
CARRERAS PROFESIONALES
134
Aqu, primero hemos usado la accin JSTL <c:if> para comprobar si con la solicitud
se ha recibido una cookie llamada preferredLocale. Si es as, la accin
<fmt:setLocale> sobreescribe la localidad para la pgina actual y selecciona la
variable de configuracin de la localidad en el mbito de la pgina. Si lo queremos,
podemos seleccionar la localidad para otro mbito usando el atributo scope.
Finalmente, se formatean la fecha y el nmero de acuerdo con las reglas de la
localidad especificada por la cookie, o la localidad por defecto, si la cookie no est
presente.
Adems de acciones para formateo, JSTL incluye acciones para interpretar
(analizar) fechas y nmero de una forma sensible a la localidad: <fmt:parseDate>
y <fmt:parseNumber>. Estas acciones soportan casi todos los mismos atributos que
sus contrapartidas de formateo, y se pueden utilizar para convertir entradas de
fechas y nmeros en sus formas nativas antes de procesarlas.
CIBERTEC
LENGUAJE DE PROGRAMACIN II
135
CARRERAS PROFESIONALES
136
CIBERTEC
LENGUAJE DE PROGRAMACIN II
137
<context-param> <param-name>
javax.servlet.jsp.jstl.sql.dataSource
</param-name> <paramvalue>
jdbc/Production
</param-value>
</context-param>
Se deben utilizar las herramientas de configuracin JNDI del contenedor WEB para
configurar un recurso JNDI con el nombre especificado; por ejemplo, con un nombre
de usuario y una password de una cuenta de usuario en una base de datos, las
conexiones mnimas y mximas en el almacen, etc. La forma de realizar esto vara
entre los contenedores y est fuera del mbito de este artculo.
Una alternativa para los contenedores que no soportan JNDI es que un oyente del
ciclo de vida de la aplicacin (contexto del servlet) cree y configure un DataSource
y lo seleccione como el valor por defecto usando la clase Config de JSTL:
CIBERTEC
CARRERAS PROFESIONALES
sce){
138
ds = new OracleConnectionCacheImpl();
ds.setURL("jdbc:oracle:thin:@voyager2:1521:Oracle9i");
ds.setMaxLimit(20);
ds.setUser("scott");
ds.setPassword("tiger");
}
catch
(Exception e){
application.log("Failed to create data source:"+
e.getMessage());
}
Config.set(application, Config.SQL_DATASOURCE,
ds);
} ...
}
Esta accin crea una sencilla fuente de datos, sin almacenamiento, para la URL
JDBC especificada, con el usuario y la password, usando el driver JDBC
especificado. Podramos usar esta accin para empezar, pero recomendamos la
utilizacin de una de las otras alternativas para una site del mundo real. Adems
de privarnos del almacn de conexiones para una fuente de datos creada de esta
forma, no es una buena idea incluir informacin sensible como la URL de la base
de datos, el nombre de usuario y la password en una pgina JSP, ya que sera
posible para alguien acceder al cdigo fuente de la pgina.
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
139
columnNames
Descripcin
Un array con un mapa insensible a las
maysculas por cada fila con las claves
java.util.SortedMap[] correspondiendo con los nombres de
columna y valores correspondiendo con los
valores de columna
Un array con un array por fila con valores
Object[][]
de columna
String[]
Un array con nombres de columnas
rowCount
int
rows
rowsByIndex
Tipo Java
CARRERAS PROFESIONALES
140
CIBERTEC
LENGUAJE DE PROGRAMACIN II
141
VALUES(?, ?, ?)
<sql:param value="${param.firstName}" />
<sql:param value="${param.lastName}" />
<sql:dateParam value="${empDate}" type="date" />
</sql:update>
Antes de insertar la fila, este ejemplo ilustra cmo usar las acciones de validacin
JSTL. La pgina espera que todos los datos para la nueva fila se enven como
parmetros de solicitud (quizs introducidos en un formulario HTML), incluyendo
una fecha de contratacin. Antes de que la fecha se pueda insertar en la base de
datos, debemos convertirla a su forma nativa Java. Esto es lo que hace la accin
<fmt:parseDate>. El atributo value contiene una expresin EL que obtiene el valor
del parmetro de solicitud empDate. La accin trata de interpretarlo como una fecha
escrita en el formato especificado por el atributo pattern (un ao de cuatro dgitos,
seguido por dos dgitos del mes y dos dgitos del da, separados por barras
inclinadas). Si tiene xito, almacena la fecha en su forma nativa con el nombre
especificado por el atributo var.
La accin <c:catch> tiene en cuenta los strings invlidos. Si el valor del parmetro
no puede ser interpretado como una fecha, el <fmt:parseDate> lanza una
excepcin, que la accin <c:catch> captura y graba en la variable especificada.
Cuando esto sucede, la condicin de comprobacin de la accin <c:if> se evala a
true, por lo que la fecha de contratacin es creada por la accin <jsp:useBean>
anidada.
Para insertar la fila, usamos la accin <sql:update>. Como la accin de consulta, la
sentencia SQL se puede especificar como el cuerpo del elemento o mediante un
atributo sql. La accin <sql:update> se puede usar para ejecutar sentencias
INSERT, UPDATE, DELETE, asi como sentencias para crear o eliminar objetos en
la base de datos, como CREATE TABLE y DROP TABLE. El nmero de filas
afectado por la sentencia puede capturarse de forma opcional en una variable
nombrada por el atributo var.
En este ejemplo (como en las mayora de las aplicaciones del mundo real), no se
conocen los nombres de las columnas en tiempo de ejecucin; vienen de los
parmetros de la solicitud. Por lo tanto, la sentencia INSERT de SQL incluye una
marca de interrogacin por cada valor como un contenedor y parmetros internos
de la accin que seleccionan el valor dinmicamente. Las columnas FirstName y
LastName son columnas de texto y las aciones <sql:param> seleccionan sus
valores al valor del parmetro de solicitud correspondiente.
Sin embargo, la columna EmpDate es una columna de fecha, demandando una
atencin especial. Primero de todo, debemos usar una variable que contenga la
fecha en su forma nativa (un objeto java.util.Date) en lugar de usar el valor del
parmetro de solicitud, usamos la variable crada por las acciones <fmt:parseDate>
o <jsp:useBean>. Segundo, debemos usar la accin <sql:dateParam> para
seleccionar el valor. En este ejemplo, hemos usado la parte de la fecha, por eso
hemos seleccionado el atributo opcional type a date. Otros valores vlidos son time
y timestamp (por defecto), para las columnas que slo toman la hora, o la fecha y
la hora.
Hay una accin JSTL ms que no hemos descrito hasta ahora: <sql:transaction>.
Podemos usarla para agrupar varias acciones update (o incluso query) donde todas
ellas se deben ejecutar como parte de la misma transaccin de la base de datos.
El ejemplo estndar es transferir una cantidad de dinero de una cuenta a otra;
implementada como una sentencia SQL que elimina el dinero de la primera cuenta
y otra sentencia que lo aade a la segunda.
CIBERTEC
CARRERAS PROFESIONALES
142
Si encapsulamos todos los accesos a una base de datos en clases Java en lugar
de usar las acciones de JSTL, todava hay una parte de JSTL que nos puede ser
til. Es una clase llamada javax.servlet.jsp.jstl.sql.ResultSupport, con estos dos
mtodos:
public static Result toResult(java.sql.ResultSet rs); public
static Result toResult(java.sql.ResultSet rs, int maxRows);
Podemos usar esta clase para convertir un objeto ResultSet estndar JDBC en un
objeto Result JSTL antes de reenviarlo a la pgina JSP para mostrarlo. Las
acciones JSTL pueden acceder fcilmente a los datos de un objeto Result, como
vimos anteriormente. Otra aproximacin, todava mejor, es pasar el resultado de la
consulta a la pgina JSP como una estructura de datos personalizada, como una
List de beans que contienen los datos de cada fila, pero el objeto Result an es un
buen candidato para prototipos y pequeas aplicaciones.
Funcin
fn:contains(string, substring)
fn:containsIgnoreCase(string, substring)
Descripcin
Devuelve true si el string
contiene substring.
Devuelve true si el string
contiene a substring, ignorando
capitalizacin.
fn:endsWith(string, suffix)
Devuelve true si el string
termina con suffix.
fn:escapeXml(string)
Devuelve el string con todos
aquellos caracteres con
especial significado en XML y
HTML convertidos a sus
cdigos de escape pertinentes.
fn:indexOf(string, substring)
fn:join(array, separator)
fn:length(item)
fn:split(string, separator)
CARRERAS PROFESIONALES
LENGUAJE DE PROGRAMACIN II
fn:startsWith(string, prefix)
fn:substringAfter(string, substring)
fn:substringBefore(string, substring)
fn:toLowerCase(string)
fn:toUpperCase(string)
fn:trim(string)
143
Preguntas de Certificacin
CARRERAS PROFESIONALES
144
e ${header.'accept'}
3. Cul de los siguientes mtodos permite registrar el nombre de una funcin?
a <function-signature></functionsignature> b <functionname></function-name> c <methodclass></method-class> d <methodsignature></method-signature>
e <function-class></function-class>
4. Cul de los siguientes mtodos es correcto para el uso de una funcin EL?
a public static
expFun(void) b
expFun(void) c private
expFun(void) d public
expFun(void)
e public native expFun(void)
Resumen
Los usos de Lenguaje de Expresiones es obtener las propiedades de un objeto
directamente a travs de estas formas:
${myObj.myProperty}$
${myObj["myProperty"]}$
${myObj[varWithTheName]}$
CARRERAS PROFESIONALES
CIBERTEC
LENGUAJE DE PROGRAMACIN II
CIBERTEC
145
CARRERAS PROFESIONALES