10 Universidad de Java Desde Cero 10 JSP
10 Universidad de Java Desde Cero 10 JSP
10 Universidad de Java Desde Cero 10 JSP
Hola, te saluda Ubaldo Acosta. Bienvenida o bienvenido nuevamente. Espero que estés listo para
comenzar con esta lección.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 2
CURSO DE SERVLETS Y JSPS
Vamos a revisar los elementos básicos de un JSP. Un JSP se va compone de Expresiones, Scriptlets, Declaraciones y también existe una
característica en la cual vamos a manejar una sintaxis equivalente en XML.
Una Expresión tiene la siguiente sintaxis: Sintaxis <%=expresión%> Lo que vamos a hacer es utilizar la sintaxis <%= para abrir nuestra expresión,
posteriormente agregamos una expresión que puede ser cualquier expresión valida que a final de cuentas va a ser equivalente a poner la sintaxis
out.println y lo que tengamos en nuestra expresión lo va a mandar al cliente. Finalmente cerramos la expresión con %> Este tipo de sintaxis <%=
expresión %> se conoce como un tag o etiqueta de expresión. La expresión puede ser un valor como puede ser una cadena, una expresión
matemática, una suma, una resta etc. o también puede ser el resultado de una llamada a una función, pero si mandamos a llamar una función el
resultado de esta función no puede ser de tipo void, debe de regresar algún valor ya que como podemos observar el resultado de evaluar esta
expresión se va a mandar a nuestro cliente entonces por ello esta expresión debe de regresar algún resultado.
Otro elemento de los JSPs son los Scriptlets. Un Scriptlet contiene código Java a diferencia de una expresión que únicamente la utilizamos para
imprimir información a nuestro cliente, un Scriptlets puede contener código Java que no necesariamente va a visualizar nuestro cliente debido a
que si este código Java no manda imprimir nada al cliente, entonces nuestro cliente no va a visualizar la información que este procesando. Este
código Java puede ser bastante robusto y por ello hay que tener cuidado respecto al código que manejemos con los Scriptlets, ya que aunque nos
permiten agregar mucho código y puede ser muy poderoso para agregar código Java eso también puede ser contraproducente sobre todo para el
mantenimiento de un JSPs, por lo que demasiado código en un scriptlet se considera una mala práctica.
La sintaxis de un Scriptlet es <% codigoJava %> a diferencia de una expresión no tiene un signo de igual. Inicia de igual manera con <% y el cierre
para el tag de un Scriptlets es el mismo, entonces la sintaxis es: <% codigoJava %> Es importante mencionar que el código generado dentro de un
Scriptlets se inserta dentro del método service() del servlet generado a partir del JSP que se haya compilado, posteriormente vamos a ver algunos
ejemplos para observar y poder entender este párrafo. Los Scriptlets pueden contener cualquier código Java válido, es decir, puede tener
declaraciones de variables, llamadas a funciones y en general puede tener cualquier lógica siempre y cuando respetemos que este código está
dentro de otro método, en este caso del método service().
En los JSPs también vamos a manejar los tags de declaraciones y la sintaxis es: <%! codigoJava %> . En las declaraciones también es código Java,
pero este código lo vamos a utilizar para declarar ya sea variables o métodos que pertenezcan a la clase del servlet generado, y a diferencia del
código Java que está en un Scriptlets en el cual todas las variables que declaremos son locales al método service(), en el caso de las declaraciones
el código que agreguemos, si es que declaramos una variable, se vuelve una variable de instancia debido a que se está agregando como una
variable de la clase del servlet generado y no únicamente como una variable local a cierto método. También los métodos que agreguemos se
vuelven métodos que son parte de la clase del servlet generado aunque no es muy utilizado este concepto de declaraciones ya que lo más común
es que desde un Scriptlets mandemos a llamar funciones o utilicemos variables que están definidas en otras clases y no dentro de nuestro JSP,
entonces en el caso de las declaraciones lo vamos a utilizar siempre y cuando necesitemos agregar ya sea variables o métodos que pertenezcan a
nuestro servlet generado a partir del JSP.
Por último, cada uno de nuestros componentes, como expresiones, Scriptlets y las declaraciones tienen su equivalente en sintaxis XML. Esto
vamos a ver que tiene varias aplicaciones en el sentido de que vamos a tener mayor compatibilidad si es que nuestros JSPs los generamos con
sintaxis XML y no con la sintaxis estándar. Cuando revisemos el tema de las sintaxis XML vamos a ver las equivalencias para cada uno de estos
elementos.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 3
CURSO DE SERVLETS Y JSPS
Vamos a revisar a continuación el tema de las variables implícitas en un JSP dentro del uso de los Scriptlets.
Dentro de un JSP podemos utilizar objetos que ya están instanciados para que podamos usarlos de manera
inmediata. Por ejemplo tenemos los objetos request, response, out, el objeto sesión, application entre otros. El
objeto request es el mismo objeto que hemos trabajado por ejemplo en los Servlets cuando sobreescribimos el
método doGet o doPost recibimos tanto el objeto request como el objeto response como parámetros. Entonces
estos objetos ya los tenemos disponibles en un JSP y no tenemos que instanciarlos, simplemente ponemos el
nombre de nuestra variable y por medio del operador punto (.) podemos acceder a los atributos y métodos del
objeto del tipo HTTPServletRequest. Lo mismo sucede con el método response, simplemente con este nombre de
variable podemos acceder a los atributos y métodos de este objeto HTTPServletResponse.
La variable out es equivalente al objeto PrintWriter que hemos instanciado dentro de los Servlets, en este caso
existe una pequeña variante ya que esta variable out es de tipo JspWriter.
La variable session es una variable de tipo HttpSession y con esta variable podemos obtener información que ya
hemos agregado a nuestra sesión, por ejemplo por medio de un Servlet. Vamos a ver más adelante por medio de
un concepto llamado directivas que podemos deshabilitar el acceso a la sesión en caso de que no queramos que
los JSPs manipulen directamente los atributos de una sesión o simplemente que no queramos que un JSP acceda
a los atributos o modifique los elementos de una sesión.
Tenemos también la variable llamada application, esta es equivalente al objeto ServletContext, que en un servlet
podemos obtener a partir del método getServletContext(). Este concepto lo vamos a ver posteriormente a más
detalle.
En resumen, existen variables ya instanciadas que podemos acceder directamente en un JSP. Vamos a revisar a
continuación algunos ejercicios para revisar estos conceptos básicos de los JSP’s.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 4
CURSO DE SERVLETS Y JSPS
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 5
CURSO DE SERVLETS Y JSPS
En Global Mentoring promovemos la Pasión por la Tecnología Java. Te invitamos a visitar nuestro
sitio Web donde encontrarás cursos Java Online desde Niveles Básicos, Intermedios y Avanzados,
y así te conviertas en un experto programador Java.
Además agregamos nuevos cursos para que continúes con tu preparación como programador Java
profesional. A continuación te presentamos nuestro listado de cursos:
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 6
www.gl obal mentoring.com .mx
Crear un programa para el manejo básico de elementos de un
JSP. Al finalizar deberemos observar lo siguiente:
<!--Formulario -->
<h4>Formulario HTML</h4>
</body>
</html>
www.gl obal mentoring.com .mx
Archivo scriptlets.jsp: Dar click para ir al código
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP con ScripletsPage</title>
</head>
<body>
<h1>JSP con Scriplets</h1>
<br>
<!--Scriplet para enviar informacion al navegador-->
<%
out.println("Saludos desde un scriplet");
%>
<br>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Cambio de Color de Fondo</title>
</head>
<body bgcolor="<%=fondo%>">
<h1>Fondo de color aplicado: <%= fondo%></h1>
<br>
<a href="index.html">Regresar al Index</a>
</body>
</html>
www.gl obal mentoring.com .mx
El resultado es como sigue:
</body>
</html>
www.gl obal mentoring.com .mx
El resultado es como sigue:
<html>
<body bgcolor="yellow">
<h1>Ejemplo de un Documento JSPx</h1>
<br/>
<!--Ejemplo de un scriptlet-->
<jsp:scriptlet>
String nombreAplicacion = request.getContextPath();
</jsp:scriptlet>
Nombre Aplicación:
<jsp:expression> nombreAplicacion</jsp:expression>
<br/>
Contador de Visitas:
<jsp:expression> this.contadorVisitas++</jsp:expression>
</body>
</html>
</jsp:root>
• Vimos cómo los mismos elementos que hemos aplicado a los archivos
.jsp, también los podemos utilizar pero aplicando xml en los documentos
.jspx
Hola, te saluda nuevamente Ubaldo Acosta. Espero que estés listo para comenzar con esta
lección..
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 2
CURSO DE SERVLETS Y JSPS
Las directivas nos permiten controlar el comportamiento de un JSP, por ejemplo las clases que
vamos a utilizar dentro de un JSP y hacer el import de clases Java, especificar el tipo MIME con el
que vamos a responder a nuestro cliente.
Veamos a continuación a más detalle varias de las directivas que podemos utilizar en nuestros
JSP’s.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 3
CURSO DE SERVLETS Y JSPS
En esta lección vamos a revisar la directiva de page. Algunos de los atributos que podemos indicar en la
directiva page son:
Import: El atributo de import dentro de la directiva page nos va a permitir especificar cuáles son las clases que
vamos a importar dentro de nuestro JSP e indirectamente a nuestro servlet generado a partir de la solicitud a
nuestro JSP. Aunque el import lo podemos declarar en cualquier parte de nuestro JSP lo recomendable es
ponerlo al principio como una buena práctica. Para especificar las clases que queremos importar en nuestro JSP
podemos utilizar la sintaxis <%@ page import=”paquete.Clase1, paquete.ClaseN” %>. Podemos detectar que
es una directiva debido a que estamos utilizando ahora el símbolo de @ y posteriormente el nombre page.
Posteriormente utilizamos el atributo import e indicar el nombre completamente calificado de nuestras clases,
es decir, incluimos el paquete y el nombre de nuestra clase y si queremos especificar más de una clase a utilizar
vamos a separarlas por coma.
Posteriormente tenemos el atributo contentType <%@page contentType=”MIME-Type” %> . Este atributo nos
permite especificar el tipo de respuesta a nuestro cliente web.
Session: <% @page session=”true” %> También vamos a poder indicar por medio de esta directiva page si el
JSP va poder acceder al objeto sesión que se haya creado anteriormente por ejemplo desde un JSP o desde
otro servlet. Por default un JSP está configurado para que podamos acceder al objeto session, si queremos
indicar lo contrario tendremos que especificar false en esta directiva y si especificamos false en esta directiva lo
que sucede es que dentro de nuestras clases implícitas de un JSP ya no vamos a tener acceso a nuestra variable.
Atributo isELIgnored: <%@ page isELIgnored=”false” %> También tenemos otro atributo llamado isELIgnored
esto lo que significa es que si queremos deshabilitar el manejo de expression language que posteriormente
vamos a revisar, tendríamos que indicarlo por medio de esta directiva page indicando en el atributo isELIgnored
el valor de true, por default un JSP a partir de la versión 2.4 puede utilizar de manera automática el concepto de
Expression Language pero anterior a la versión 2.3 de los servlets los JSPs por default no pueden acceder al
lenguaje conocido como Expression Language.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 4
CURSO DE SERVLETS Y JSPS
Atributo buffer: <%@ page buffer=”tamañoEnKb” %> dentro de esta misma directiva page tenemos acceso al
atributo buffer. Con este atributo buffer podemos especificar el tamaño en Kb que puede contener nuestro
buffer del JSP y si llegamos al tamaño especificado en este JSP entonces se hace un flush o vaciado de manera
automática de todo el flujo que hayamos agregado a nuestro printWriter o a nuestro output servlet
dependiendo el caso.
También podemos observar el atributo isThreadSafe con sintaxis <%@ page isThreadSafe=”true” %> Por
default el contenedor de servlets, considera a un JSP como seguro para ser accedido por múltiples hilos, es
decir, el valor por default es true. Si se desea que el contenido del JSP no sea accedido por distintos hilos
entonces se debe especificar este valor como false.
Por ultimo vamos a mencionar el atributo extends <%@ page extends=”paquete.NombreClase” %> nos va a
permitir heredar de una clase según especifiquemos en ese atributo y por lo tanto nuestro JSP va a heredar las
características de la clase que especifiquemos normalmente ese atributo únicamente se utiliza si es que
queremos agregar comportamiento de terceros aunque este concepto rara vez lo configuramos y únicamente
se van a utilizar si es que algún software en particular alguna solución que compremos nos solicite hacer un
extends de clases ya creadas por este vendedor.
Vamos a poner a continuación en práctica alguno de estos atributos utilizando el concepto de directivas de un
JSP.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 5
CURSO DE SERVLETS Y JSPS
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 6
CURSO DE SERVLETS Y JSPS
En Global Mentoring promovemos la Pasión por la Tecnología Java. Te invitamos a visitar nuestro
sitio Web donde encontrarás cursos Java Online desde Niveles Básicos, Intermedios y Avanzados,
y así te conviertas en un experto programador Java.
Además agregamos nuevos cursos para que continúes con tu preparación como programador Java
profesional. A continuación te presentamos nuestro listado de cursos:
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 7
’
import java.text.SimpleDateFormat;
ir al código
import java.util.Date;
/**
*
* @author Ubaldo
*/
public class Conversiones {
/**
* Método que permite convertir una fecha en una cadena
* con el formato especificado
* @param fecha
* @return
*/
public static String format(Date fecha){
SimpleDateFormat formateador =
new SimpleDateFormat(FORMATO_FECHA);
return formateador.format( fecha );
}
}
www.gl obal mentoring.com .mx
El resultado es como sigue:
<%
String nombreArchivo="reporte.xls";
response.setHeader("Content-Disposition", "inline; filename=" +
nombreArchivo );
%>
<html>
<head>
<title>Reporte de Excel</title>
</head>
<body>
<h1>Reporte de Excel</h1>
<br>
<table border="1">
<tr>
<th>Curso</th>
<th>Descripción</th>
<th>Fecha Inicio</th>
</tr> www.gl obal mentoring.com .mx
( )
Archivo reporteExcel.jsp: Dar click para ir al código
<tr>
<td>1. Fudamentos de Java</td>
<td>Aprenderemos la sintaxis básica de Java</td>
<td><%= Conversiones.format( "500" ) %></td>
</tr>
<tr>
<td>2. Programación con Java</td>
<td>Pondremos en práctica conceptos de
la Programación Orientada a Objetos
</td>
<td><%= Conversiones.format( new Date() ) %></td>
</tr>
</table>
</body>
</html>
</body>
</html> www.gl obal mentoring.com .mx
Archivo funciones.js: Dar click para
var capa;
function cambio(idCapa){
ir al código
//Recuperamos la capa segun el elemento disponible
if (document.layers)
capa = eval("document." + idCapa);
if (document.all)
capa = eval(idCapa + ".style");
if (document.getElementById)
capa = eval('document.getElementById("' + idCapa + '").style');
import java.text.SimpleDateFormat;
ir al código
import java.util.Date;
Hola, te saluda Ubaldo Acosta. Bienvenida o bienvenido nuevamente. Espero que estés listo para
comenzar con esta lección.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 2
CURSO DE SERVLETS Y JSPS
En términos simples la inclusión de archivos, como su nombre lo dice, es agregar un JSP dentro de
otro, sin embargo existen dos formas de realizar esta acción cuando utilizamos JSPs.
En primer lugar tenemos la inclusión estática también conocida como inclusión en tiempo de
traducción (translation time), por otro lado tenemos la inclusión dinámica también conocida
como inclusión en tiempo de ejecución (request time). Vamos a revisar las diferencias entre cada
tipo de inclusión de archivos.
Comencemos con la inclusión estática. Este concepto lo podemos aplicar utilizando la directiva
include y según vimos anteriormente en el tema de directivas podemos reconocer a esta directiva
por medio del símbolo @. Posteriormente lo que hacemos es especificar por medio del atributo
file el nombre del JSP que vamos a incluir en el JSP principal.
En el caso de la inclusión dinámica lo que sucede es que vamos a utilizar, en lugar de una
directiva, el concepto de una acción, posteriormente vamos a revisar más acciones, sobre todo
para acceder a los JavaBeans, pero en este caso una acción también nos va a permitir hacer un
include de manera dinámica de otro JSP. Posterior al nombre de la acción, especificamos el
atributo page y como valor del atributo el JSP que queremos incluir en nuestro JSP principal.
Podemos observar que parte de las diferencias es que en nuestra directiva <%@ include
file=”paginaRelativa.jsp” %> estamos manejando el atributo de file y en la inclusión dinámica
<jsp:include page=”paginaRelativa.jsp” /> estamos utilizando el atributo de page, estas son
simplemente algunas de las diferencias y vamos a ir revisando estos dos conceptos a más detalle.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 3
CURSO DE SERVLETS Y JSPS
El objetivo de utilizar esta inclusión estática es reutilizar código que puede provenir de un texto
plano de un HTML o de otro JSP. En el caso de la inclusión estática, el JSP que estamos incluyendo
dentro del JSP principal puede afectar o compartir información con el JSP principal. En la inclusión
estática no se delega el control al JSP que vamos a incluir, si no que se va a generar un único JSP
que va a ser la combinación del JSP principal y del JSP que estamos incluyendo. Recordemos que
un JSP se compila finalmente en un Servlet, ya que es necesario la clase Java para poder ejecutar
el JSP asociado. Posteriormente veremos un ejemplo para tener más claro este concepto.
Una vez que tenemos ya un JSP o más bien un Servlet de manera única y que contiene a ambos
JSPs, entonces podemos compartir variables y métodos entre los diferentes JSPs que estamos
utilizando. Uno de los detalles es que, con la inclusión estática, para tener la versión más reciente
del JSP que estamos incluyendo se recomienda compilar y reconstruir nuevamente el proyecto
debido a que esta inclusión estática no garantiza que tengamos la última versión del JSP incluido.
Esto se debe a que el contenido del JSP incluido se va a vaciar en el JSP principal; esto lo vamos a
detallar más adelante.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 4
CURSO DE SERVLETS Y JSPS
El JSP principal (a.jsp) debe agregar la directiva según hemos visto en la sintaxis de
la inclusión estática y va agregar el contenido del JSP incluido (b.jsp). Una vez que
solicitamos nuestro recurso se hace una traducción del JSP, aquí la gran diferencia
de la inclusión estática es que únicamente se va a generar un solo Servlet, y este
Servlet contendrá el código de los dos JSPs (a.jsp y de b.jsp) y el código HTML
generado por cada uno de los JSPs los va a mezclar en un solo Servlet utilizando el
método out.write() .Este html ya incluye el resultado de los dos JSPs.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 5
CURSO DE SERVLETS Y JSPS
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 6
CURSO DE SERVLETS Y JSPS
Vamos a observar ahora un diagrama de inclusión dinámica. Podemos observar que ahora tenemos los
mismos bloques pero estamos separando ya a más detalle los archivos a.jsp y b.jsp.
También de igual manera observamos los archivos que vamos a utilizar (a.jsp y b.jsp), el tiempo de
traducción y observamos bloque de tiempo de ejecución.
El JSP principal va a utilizar una acción de los JSPs para incluir el archivo b.jsp dentro del archivo a.jsp,
posteriormente lo que sucede en tiempo de traducción es que se van a generar dos servlets, uno
correspondiente al JSP principal (a.jsp) y el otro correspondiente al JSP a incluir (b.jsp).
Entonces podemos observar que se genera un JSP con el contenido del archivo a.jsp y se genera otro
servlet con el contenido del archivo b.jsp, pero aquí viene lo interesante cuando ejecutamos este JSP. Lo
que sucede si utilizamos una inclusión dinámica es que estamos solicitando el recurso de a.jsp y en cuanto
este JSP detecta la inclusión del archivo que queremos agregar entonces delega el control al otro servlet
en este caso es el servlet asociado con el jsp de b.jsp y en cuanto termina de ejecutarse este JSP va a
regresar el control al jsp principal y finalmente lo que va hacer es generar una salida, esta salida del servlet
incluido se va agregar dentro del JSP principal, por ello es que podemos estar seguros que este JSP que se
está incluyendo siempre va a contener la última versión.
Finalmente la salida que se manda al cliente va a tener tanto la salida del JSP principal como la salida del
JSP que se incluyo.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 7
CURSO DE SERVLETS Y JSPS
Por último vamos a revisar una comparación entre los diferentes tipos de inclusión.
La inclusión estática en la cual utilizamos una directiva y la inclusión dinámica en la cual utilizamos una
acción de los JSPs, podemos observar cuando ocurre la inclusión, en el caso de una inclusión estática
ocurre en tiempo de traducción y en una inclusión dinámica ocurre en tiempo de ejecución.
También podemos responder a la pregunta de ¿Qué se incluye en el JSP principal? En el caso de la
inclusión estática se va a incluir directamente el contenido del archivo y en el caso de la inclusión dinámica
se va a incluir la salida de la página JSP.
El número de Servlets generados en una inclusión estática únicamente es 1 y en el caso de una inclusión
dinámica se generan dos Servlets, uno por cada JSP, el principal y el que se va a incluir.
También podemos responder a la pregunta ¿podemos incluir cabeceros que afecten al JSP principal? En el
caso de la inclusión estática únicamente se genera un Servlet, por lo que sí podemos modificar al JSP
principal por medio de cabeceros desde el JSP que estamos incluyendo. En el caso de la inclusión dinámica
esto no puede suceder debido a que los JSPs se ejecutan de manera independiente, por lo que no se
comparte información entre ellos, y tampoco cabeceros.
Respecto a la pregunta ¿Podemos incluir atributos o métodos en común? En el caso de la inclusión estática
es cierto y es debido a que se genera un único servlet por lo tanto vamos a poder compartir atributos o
métodos que estén definidos en un Servlet o en otro y en el caso de la inclusión dinámica esto no es
posible debido a que los JSPs nunca se mezclan simplemente se delega el control y por eso es falso.
Respecto a la pregunta ¿Debemos actualizar la página principal si se actualiza la página incluida? En el
caso de la inclusión estática esto es cierto para garantizar que tenemos la última versión del JSP incluido.
En el caso de la inclusión dinámica esto no es necesario debido a que como delegamos el control siempre
se está ejecutando la última versión del JSP incluido y en el caso del JSP principal delega el control al JSP
incluido.
A continuación vamos a revisar algunos ejercicios para poner en práctica el uso de las inclusiones estática y
dinámica utilizando JSPs.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 8
CURSO DE SERVLETS Y JSPS
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 9
CURSO DE SERVLETS Y JSPS
En Global Mentoring promovemos la Pasión por la Tecnología Java. Te invitamos a visitar nuestro
sitio Web donde encontrarás cursos Java Online desde Niveles Básicos, Intermedios y Avanzados,
y así te conviertas en un experto programador Java.
Además agregamos nuevos cursos para que continúes con tu preparación como programador Java
profesional. A continuación te presentamos nuestro listado de cursos:
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 10
’
</body>
</html>
<B>Universida Java</B>
<A HREF="http://universidadjava.com" target="_blank">
para más detalles...</A>
.ocultar_menu {
display: none;
}
<br>
<jsp:include page="recursoPublico.jsp" />
</body>
</html>
<br>
Hola, te saluda nuevamente Ubaldo Acosta. Espero que estés listo para comenzar con esta
lección..
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 2
CURSO DE SERVLETS Y JSPS
Los JSP’s nos van a permitir acceder a los JavaBeans que tengamos declarados en nuestra
aplicación web. Un JavaBean simplemente es una clase pura de Java que sigue ciertas reglas. Una
de las reglas es que debe de tener un constructor vacío y esa restricción es por lo siguiente, si
tenemos una clase que no tiene un constructor vacío entonces deberemos tener algún
constructor con cierto número de parámetros, por lo que cuando el JSP trate de acceder a este
JavaBean debe saber cuántos parámetros se le deben de especificar para poder crear una
estancia de objeto JavaBean, y esto implica mayor complejidad al momento de instanciar un
objeto Java.
Por ello, los JavaBeans requieren de un constructor vacío, para que no haya necesidad de indicar
cuales son los argumentos que se necesitan para poder instanciar una clase de un JavaBean.
Además de tener un constructor vacío, los JavaBeans deben tener atributos privados y por cada
uno de los atributos declarados debemos agregar su método get y set para cada atributo. Vamos
a ver más adelante que existen ciertas excepciones, por ejemplo, si únicamente queremos
acceder a la propiedad pero no tenemos intenciones de modificar la propiedad, entonces
podríamos tener únicamente su método get y viceversa, en dado caso que únicamente queramos
modificar la propiedad agregamos el método set respectivo y podemos omitir su método get.
Un JSP debe de utilizar el nombre de la propiedad del JavaBean. Indirectamente el JSP al colocar
el nombre de la propiedad se manda llamar el método get o set respectivo según indiquemos en
la acción que utilicemos en nuestro JSP. Vamos revisar más adelante como realizar este código.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 3
CURSO DE SERVLETS Y JSPS
Podemos observar los siguientes ejemplos, tenemos el nombre de la propiedad, el nombre de los métodos asociados get y set y el
código que estamos utilizando dentro del JSP.
Por ejemplo, si tenemos una propiedad llamada nombreUsuario podemos observar que su método get se debe de escribir como
sigue getNombreUsuario. Vamos a utilizar la notación de altas y bajas, o notación de camello, es decir la n se convierte en
mayúscula y la letra u también ser convierte a mayúscula, debido a que estamos separando cada palabra del nombre del método.
Esta es la notación de Java que debemos utilizar cuando creemos el método get y set respectivo de una propiedad.
Una vez que tenemos los métodos get y set dentro de la clase del JavaBean, dentro del JSP lo que tenemos que hacer es utilizar la
siguiente acción de los JSPs, escribiremos jsp: y dependiendo de la acción que queramos hacer será getProperty o setProperty.
Posteriormente indicamos el nombre de la propiedad a utilizar, (Ej. nombreUsuario) e indirectamente se ejecutará el nombre del
método asociado a la acción respectiva, ej. getNombreUsuario() y si estamos haciendo uso de la acción setProperty se manda a
llamar el método setNombreUsuario(). Por ello es que decimos que en el JSP vamos a utilizar el nombre de la propiedad e
indirectamente se va a mandar a llamar el método asociado dependiendo de la acción que estemos especificando.
Vamos a revisar algunos otros ejemplos. La propiedad eliminado es de tipo booleano y para las propiedades de tipo booleano en
lugar de tener un método get vamos a convertirlo por un método is, (isEliminado). El método set no cambia debido a que para
modificarlo se sigue utilizando la misma anotación (setEliminado) y en el código del JSP de igual manera no cambia, vamos a
utilizar su método get que indirectamente va a mandar a llamar el método is que es el de lectura, o el action de setProperty e
indicamos la propiedad y se manda llamar indirectamente el método setEliminado. De igual manera hay que notar que la
propiedad está en minúsculas y el método que se manda a llamar es setEliminado y la E comienza con mayúscula.
Ahora vamos a ver un caso interesante en el cual muchas veces podemos aprovecharlo para hacer nombres de métodos que no
necesariamente van a mapear a una propiedad de un JavaBean, ya que respetando la nomenclatura podemos mandar a llamar
métodos como podemos observar. La propiedad noTelefono, podemos crear métodos llamados getTelefono y setTelefono y las
acciones del JSP deben corresponder no al nombre de la propiedad, la puede incluso no existir, sino al nombre de los métodos
eliminando la palabra get o set y convirtiendo la primera letra en minúscula, con esto podrá acceder a métodos que incluso no
tengan mapeada una propiedad, sino posiblemente métodos que realicen cálculos dentro del JavaBean.
Y por ultimo, vemos otra anotación de una propiedad de un JavaBean, en este caso estamos utilizando la anotación que no es muy
común incluso no es recomendable, pero en ocasiones ya existe código creado de esta manera getCodigo_postal. Lo que tenemos
que hacer entonces es poner el nombre de la propiedad e indirectamente se va a mandar a llamar el método getCodigo_postal en
este orden si tenemos guion bajo ( _ ). Entonces no tenemos que hacer nada al respeto si no simplemente el único que se debe de
convertir en mayúsculas es la primera letra, por lo tanto el método que se manda a ejecutar es getCodigo_postal y la p sigue
siendo minúscula.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 4
CURSO DE SERVLETS Y JSPS
Por último, vamos a revisar el uso básico de los Java Beans desde los JSPs. Podemos utilizar las
siguientes acciones en los JSPs:
- Tenemos la acción de useBean, esto nos va a permitir acceder a un bean en un alcance
especificado. Podemos o no especificar el alcance, si no la especificamos dentro de nuestra
sintaxis del jsp:useBean, el alcance por default es de tipo page. En cambio si queremos indicar
alguno otro alcance tenemos que poner scope=request, session o application. La sintaxis que
vamos a utilizar es similar a esta <jsp:useBean id=”nombre” class=”paquete.NombreClase”/>.
Con esta sintaxis en pocas palabras es como si creáramos una nueva instancia y el nombreBean
es el nombre de nuestra variable y el paquete.NombreClase es el tipo de la clase que estamos
indicando para generar este nuevo objeto nombreBean.
- Posteriormente tenemos la acción de setProperty. Esta acción nos permite modificar una o
varias propiedades de un bean especificado. Para esta acción especificamos el nombre del bean
previamente definido con la acción jsp:useBean, posteriormente especificamos la propiedad a
modificar, seguido del valor del mismo. Ej. property=”nombreUsuario”, esto indirectamente va a
mandar a llamar el método setNombreUsuario del JavaBean respectivo.
- Por último tenemos la acción de getProperty. Esta acción nos permite acceder a una propiedad
del bean especificado. Utilizamos la acción jsp:getProperty, posteriormente indicamos el nombre
del bean nombreBean que vamos a utilizar, es decir, el nombre de la instancia declarada
previamente con la acción jsp:useBean. Posteriormente indicamos una propiedad a acceder, ej.
property=”nombreUsuario”, indirectamente se va a mandar a llamar el método
getNombreUsuario().
Estas son las acciones básicas que vamos a utilizar con los JavaBeans, existen varias
combinaciones que podemos utilizar al crear y utilizar los JavaBeans, por lo que vamos a ver a
continuación algunos ejemplos para ir detallando el uso básico de los JavaBeans en los JSPs.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 6
CURSO DE SERVLETS Y JSPS
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 7
CURSO DE SERVLETS Y JSPS
En Global Mentoring promovemos la Pasión por la Tecnología Java. Te invitamos a visitar nuestro
sitio Web donde encontrarás cursos Java Online desde Niveles Básicos, Intermedios y Avanzados,
y así te conviertas en un experto programador Java.
Además agregamos nuevos cursos para que continúes con tu preparación como programador Java
profesional. A continuación te presentamos nuestro listado de cursos:
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 8
www.gl obal mentoring.com .mx
Crear un proyecto para poner en práctica el manejo de
JavaBeans con JSPs. Al finalizar deberemos observar lo
siguiente:
<br>
Formulario 2:
<br>
<form name="form2" action="setterAllParamsJsp.jsp">
Base: <input type="text" name="base" >
<br>
Altura: <input type="text" name="altura" >
<input type="submit" value="Enviar">
</form>
</body>
</html>
<br>
<br>
<a href="index.jsp">Regresar al Inicio</a>
</body>
</html>
<jsp:setProperty name="rectangulo"
property="base" param="baseParam" />
<jsp:setProperty name="rectangulo"
property="altura" param="alturaParam" />
<br>
<br>
<a href="index.jsp">Regresar al Inicio</a>
</body>
</html>
}
}
www.gl obal mentoring.com .mx
www.gl obal mentoring.com .mx
www.gl obal mentoring.com .mx
• Probar con cada una de las opciones del proyecto.
• Verificar paso a paso (modo debug) cada una de las opciones para que
aclarar cualquier flujo o detalle que hiciera falta.
• Este concepto aunque parece simple, será uno de los más utilizados a lo
largo de nuestras aplicaciones Web, no solamente con la tecnología de
Servlets y JSPs, sino prácticamente con cualquier framework Web.
Hola, te saluda nuevamente Ubaldo Acosta. Espero que estés listo para
comenzar con esta lección..
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 2
CURSO DE SERVLETS Y JSP'S
El objetivo de este lenguaje es que nos permita simplificar la información que estamos desplegando en los JSPs.
Normalmente este tipo de despliegue de información nos apoyaremos de los JavaBeans, según ya hemos visto, para
desplegar información almacenada en una aplicación Web.
En la lamina podemos revisar una comparativa entre la sintaxis utilizando las acciones de los JavaBeans y la sintaxis de
Expression Language.
Como podemos observar la sintaxis de los JavaBeans según hemos visto tenemos que declarar el nombre del bean que
vamos a utilizar dentro del JSP y posteriormente acceder a la propiedad, esta sintaxis puede ser muy extensa si es que
estamos haciendo mucho código para despliegue de propiedades ejemplo:
En cambio, con la sintaxis de Expression Language únicamente debemos de especificar el nombre del bean que vamos
a utilizar y el nombre de la propiedad a la cual queremos acceder, la forma más común de hacerlo es:
${nombreBean.nombrePropiedad}, pero también tenemos otra forma ${nombreBean[“nombrePropiedad”]}.
Internamente el lenguaje de expresión (EL) lo que hace es almacenar sus atributos o beans como si fuera un mapa,
entonces por ello podemos especificar el nombre de la propiedad o también podemos especificarlo entre corchetes,
ya que puede funcionar como un índice para acceder al mapa y posteriormente recuperar el valor respectivo de la
propiedad.
Cualquiera de estas dos anotaciones nos va a permitir acceder a los JavaBean y a las propiedades de los JavaBean
utilizando Expression Language y cómo podemos observar se simplifica bastante la sintaxis si es que la comparamos
con el concepto de las acciones de los JavaBeans.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 3
CURSO DE SERVLETS Y JSP'S
Vamos a revisar a continuación algunas de las características del lenguaje de expresión de los JSPs.
Un detalle importante para hacer uso de este lenguaje es que los objetos JavaBeans a utilizar ya deben
de estar agregados previamente en algún alcance, por ejemplo, utilizando el método setAttribute() en
un Servlet. Si recordamos los alcances que tenemos en una aplicación web tenemos los alcances de
page, resquest, session y application.
Entonces, para que este lenguaje de Expression Language pueda acceder a un atributo que hayamos
agregado a nuestra aplicación web debe de estar previamente ya almacenado en cualquiera de estos
alcances.
Otra característica de este lenguaje es que la notación es muy simplificada según vimos en la lámina
anterior, se simplifica a una sola línea de código, perso solo nos permite leer información más no
modificarla en nuestros Java Beans.
El Expression Language nos va a permitir acceder a las propiedades de un JavaBean de manera anidada,
por ejemplo, supongamos que tenemos una clase Alumno y a su vez tiene una propiedad que es otra
clase llamada Dirección y esta clase Dirección tiene como atributo “calle”. Entonces, podemos observar
que ya no tenemos que instanciar cada uno de estos objetos para ir recuperando la información, si no
que de manera anidada y por medio de la notación de punto, podemos acceder a nuestro JavaBean
llamado alumno, posteriormente con este atributo se manda a llamar el método getDireccion(), el cual
regresa un objeto de tipo Dirección y finalmente se manda llamar el método getCalle(). Vamos a revisar
más adelante algunos ejercicios para poder entender a más detalle esta notación anidada.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 4
CURSO DE SERVLETS Y JSP'S
Continuando con las características de este lenguaje, podemos acceder a propiedades que están en una colección
o en un arreglo. Según hemos comentado, simplemente con el nombre del bean que queremos acceder
${listaPersonas[índice/llave ]} y entre llaves especificamos el índice de la colección a la cual queremos acceder o
la llave.
Por ejemplo, si es que el atributo es un mapa, esta notación nos va a permitir acceder de manera muy simple a
los elementos que tengamos en una colección. Sin embargo no es posible iterar los elementos. Si queremos iterar
cada uno de los elementos que tengamos en una colección debemos que utilizar JSTL (JSP Standard Tag Library) el
cual estudiaremos más adelante.
Otra característica que tenemos respecto al Expression Languaje es que el despliegue de la información se hace
una conversión al tipo especificado de manera automática. 55 4573 8370
Otra característica es que se maneja de manera automática los valores nulos o vacíos convirtiéndolos
simplemente en cadena vacía. Esto nos permite de alguna manera simplificar el manejo de excepciones utilizando
EL, el detalle con esto es que si existe alguna excepción por ejemplo por un nullPointerExcepcion el JSP no nos va
a mostrar esta excepción en nuestra pantalla, si no que ese mensaje únicamente se va a mandar a la salida
estándar y no se desplegará en el navegador web. Entonces esta característica puede facilitar el despliegue de
información pero también podría ocultar detalles importantes respecto al manejo de excepciones.
Otra característica es que este mismo lenguaje tiene un conjunto de operadores básicos para hacer operaciones
simples directamente. Por ejemplo la sintaxis ${3+2-1} internamente se realiza la evaluación de la expresión y nos
da un resultado que es finalmente lo que se despliega. Esto a final de cuentas es equivalente a tener un
out.println y va a desplegar la información contenida dentro de esta expresión evaluada. También algunas
conversiones ocurren de manera automática, por ejemplo ${ “x”>”y” } el valor que tenga X y el valor que tengas
Y se convierten a tipos enteros y se hace una comparación utilizando los elementos X y Y. Otro ejemplo es ${ 3>=
10/2 } de igual manera esta expresión se evalúa y es equivalente a tener la sintaxis del método out.print.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 5
CURSO DE SERVLETS Y JSP'S
El lenguaje de Expression Language nos permite acceder a algunos objetos implícitos, por ejemplo uno de ellos es el objeto cookie ${
cookie.nombreCookie.value } de manera automática ya tenemos disponible este objeto y podemos acceder directamente al objeto para
empezar a solicitar cookies u objetos cookies, simplificando bastante la sintaxis.
Uno de los objetos más importantes en JSPs es el objeto de pageContext. Este objeto contiene toda la información necesaria que requiere
un JSP. Este objeto pageContext contiene la mayoría de los objetos implícitos que utiliza un JSP, en solo mostramos como ejemplo
${pageContext.session.id} para acceder al objeto http session y cómo podemos obtener el identificador de nuestra sesión (JSession), pero
existen muchas más variables que se pueden acceder al revisar el API de los JSPs.
También vamos a poder acceder a los parámetros que recibamos desde un formulario o desde una petición get o post. Para poder acceder
a los parámetros de una petición HTTP podemos utilizar la variable implícita param o utilizar la variable paramValues, por ejemplo la
sintaxis ${param.nombre}.
También podemos acceder a los cabeceros HTTP por medio de las variables implícitas header o headerValues. Como ejemplo podemos
usar la sintaxis ${header[“user-agent“]}. Y según hemos comentado también tenemos el objeto cookie ${cookie.nombreCookie.value}
con el cual vamos a poder acceder directamente a las cookies que tengamos almacenadas en nuestro navegador web y simplemente
poniendo el nombre de la cookie podemos acceder posteriormente al valor de la cookie respectiva.
Por último observamos que podemos acceder a los atributos que tengamos almacenados en nuestra aplicación web por medio de los
objetos pageScope, requestScope, sessionScope o applicationScope. Según hemos comentado anteriormente a diferencia del uso de
pageContext.session nos va a regresar es el objeto http session, por medio del cual podemos acceder a los atributos pero del objeto
session y no a los atributos que hemos agregado en el alcance de session. Para poder acceder a los atributos que hemos agregado en el
alcance de sesión podemos utilizar el objeto sessionScope, por ejemplo si hemos agregado a la sesión un objeto llamado rectángulo
podemos utilizar dos sintaxis una es especificando ${sessionScope.rectangulo.area} que estamos buscando este objeto en el alcance de
sessionScope y posteriormente podemos acceder a la propiedad respectiva de este JavaBean, pero también podemos utilizar la siguiente
notación ${rectangulo.area}, en esta notación especificamos únicamente el nombre del JavaBean y posteriormente accedemos a la
propiedad respectiva. Si no especificamos el alcance lo que va hacer es primero revisar si es que ya existe una variable llamada rectángulo
en el alcance de pageScope, si no la encuentra aquí se sigue con los siguientes alcances, resquestScope, sessionScope y applicationScope
en ese orden. Si no se encuentra en ninguno de ellos el objeto sería nulo, pero según hemos comentado en Expression Language nos va a
permitir manejar el concepto de nulos y nos va a desplegar simplemente una cadena vacía.
¿Qué sucede si este objeto se encuentra en dos alcances, por ejemplo pageScope y en resquestScope? Lo que sucede es que va a tomar el
primero de ellos según el orden mencionado. El primer objeto en orden de los alcances mencionados que encuentre es el objeto que se va
a utilizar. A continuación vamos a revisar algunos ejercicios para poner en práctica el concepto de Expression Language utilizando JSPs.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 6
CURSO DE SERVLETS Y JSP'S
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 7
CURSO DE SERVLETS Y JSP'S
En Global Mentoring promovemos la Pasión por la Tecnología Java. Te invitamos a visitar nuestro
sitio Web donde encontrarás cursos Java Online desde Niveles Básicos, Intermedios y Avanzados,
y así te conviertas en un experto programador Java.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 8
’
’
www.gl obal mentoring.com .mx
Crear un proyecto Web para poner en práctica el concepto de
Expression Language. Al finalizar deberemos observar lo
siguiente:
’
www.gl obal mentoring.com .mx
Creamos un nuevo proyecto Web, como sigue:
’
www.gl obal mentoring.com .mx
( )
Creamos un nuevo proyecto Web, como sigue:
’
www.gl obal mentoring.com .mx
Borramos el archivo index.html:
’
www.gl obal mentoring.com .mx
Creamos el archivo accesoJavaBeans.jsp:
’
www.gl obal mentoring.com .mx
Creamos el archivo variablesImplicitas.jsp:
’
www.gl obal mentoring.com .mx
Creamos el archivo Rectangulo.java:
’
www.gl obal mentoring.com .mx
Creamos el archivo Rectangulo.java:
’
www.gl obal mentoring.com .mx
Archivo index.jsp: Dar click para ir al código
<html>
<head>
<meta charset="UTF-8">
<title>Ejemplo Expression Language</title>
</head>
<body>
<h1>Ejemplo de Expression Language</h1>
<br>
<a href="variablesImplicitas.jsp?usuario=juan">Objetos implícitos con EL</a>
<br>
<br>
</body>
</html>
www.gl obal mentoring.com .mx
Archivo accesoJavaBeans.jsp: Dar click para ir al código
<html>
<head>
<meta charset="UTF-8">
<title>Acceso a JavaBeans</title>
</head>
<body>
<h1>Acceso a JavaBeans</h1>
<jsp:useBean id="rectangulo" class="beans.Rectangulo" />
<ul>
<li>Nombre Aplicación: ${pageContext.request.contextPath}</li>
<li>Navegador del Cliente: ${ header["User-Agent"] }
<li>Id Session: ${cookie.JSESSIONID.value}</li>
<li>Web Server: ${pageContext.servletContext.serverInfo}
<li>Valor Parámetro Usuario: ${param["usuario"]}</li>
</ul>
<br>
<br>
<a href="index.jsp">Regresar al Inicio</a>
</body>
</html>
www.gl obal mentoring.com .mx
Archivo Rectangulo.java: Dar click para ir al código
package beans;
’
www.gl obal mentoring.com .mx
’
Por: Ing. Ubaldo Acosta
’
www.gl obal mentoring.com .mx
CURSO DE SERVLETS Y JSPS
Hola, te saluda nuevamente Ubaldo Acosta. Espero que estés listo para comenzar con esta
lección.
Vamos a estudiar una el tema de JSP Standard Tag Library, también conocido como JSTL.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 2
CURSO DE SERVLETS Y JSPS
JSTL significa JavaServer Pages Standard Tag Library, esta es una librería de los JSPs
que extiende la funcionalidad básica de los mismos, agregando principalmente las
siguientes librerías: core, xml, sql y fmt.
La librería de core nos va a permitir leer y manipular datos así como iterar y agregar
condiciones y otras funcionalidades básicas.
La librería de sql tiene tags que nos van a permitir tanto ejecutar consultas a una
base de datos así como crear conexiones a las mismas.
Finalmente la librería fmt nos va a permitir dar formato a las cadenas que estemos
manipulando para convertirlas por ejemplo de cadena a número o fecha. Incluso
esta librería nos permite apoyarnos de los conceptos como es internacionalización
o en inglés locale.
En esta lección estudiaremos algunos de estos tags para tener mayor conocimiento
de cómo podemos extender la funcionalidad básica de los JSP utilizando JSTL.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 3
CURSO DE SERVLETS Y JSPS
Para poder utilizar las librerías de JSTL en nuestra aplicación web en caso que usemos un servidor
como Glassfish ya cuenta con las librerías JSTL, si por alguna razón no estuvieran en el servidor
debemos agregar el .jar de estándar.jar y jstl.jar al classpath, sin embargo con Glassfish este paso
no es necesario.
Posteriormente para poder utilizar las librerías dentro de un JSP debemos agregar la siguiente
directiva: <%@ taglib uri=”http://java.sun.com/jstl/core”prefix=”c”%>
Como podemos observar estamos utilizando la sintaxis de las directivas en los JSPs según vimos
anteriormente. En este caso el atributo uri=”http://java.sun.com/jstl/core” es un uri que se
resuelve de manera local en nuestro servidor web al agregar los jars (estándar.jar, jstl.jar), por lo
que al solicitar desde un JSP un taglib, lo que hace el web server es buscar dentro de estos jars
cualquier archivo con terminación .tld (tag library definition), por lo que esta uri no es algo que se
tenga que buscar o resolver en internet, sino que simplemente se va a buscar un uri idéntica
dentro de los jars que tenemos en nuestra aplicación web.
Si utilizamos archivos jspx, es decir un documento JSP, lo que tenemos que hacer es lo siguiente
dentro de nuestro elemento root, por ejemplo en este caso dentro del tag de html lo que
hacemos es especificar el namespace de nuestro tag library con elprefijo core y posteriormente el
uri que es exactamente el mismo que especificamos anteriormente <%@ taglib
uri=”http://java.sun.com/jstl/core”prefix=”c”%> y de igual manera el prefijo es el mismo que
estamos utilizando para nuestro namespace. Hay que recordar que nuestro namespace
únicamente es un prefijo de igual manera como lo estamos especificando en la notación clasica
”prefix=”c”.
Existen más detalles respecto a la configuración de JSTL pero de manera básica y para empezar a
utilizar esta tecnología con esto es suficiente.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 4
CURSO DE SERVLETS Y JSPS
Vamos a estudiar la librería de core de JSTL. Una vez que hayamos puesto en práctica la librería de core es más sencillo utilizar las demás librerías
que hemos comentado anteriormente.
Dentro de la librería de core de jstl tenemos varios tags que nos van a permitir desplegar información, veamos como podemos hacer esto:
Tenemos un prefijo llamado c para el tag de core, según especificamos en el JSP. Posteriormente especificamos el nombre del tag que vamos a
utilizar, en este caso es como si utilizáramos una función pero debido a que estamos utilizando JSPs en lugar de una función se le conoce como un
tag o etiqueta y posteriormente utilizamos ciertos atributos y valores para terminar de configurar estos tags, por ejemplo: <c:out
value=”${persona.nombre}”>.
Hay que recordar que el objetivo de un JSP es únicamente manipular tags o etiquetas y no manipular código de Java (aunque pueda realizar esta
tarea) por ello la combinación de Expression Language con JSTL es muy práctica y son de las mejores prácticas de las que vamos a estar hablando
en los siguientes ejercicios.
Para desplegar el valor de un JavaBean, por ejemplo la clase Persona,y queremos accedemos a la propiedad de nombre simplemente basta con
utilizar el tag de out y especificamos el valor que queremos desplegar a nuestro cliente, ej. ”${persona.nombre}”. Podríamos poner aquí una
variable estática o una variable en código duro, pero en este caso podemos observar que al combinar JSTL con Expression Language podemos
acceder al JavaBean que se encuentran en algún alcance que puede ser page, request, session o application según hemos comentado
anteriormente.
También tenemos etiquetas para crear y manipula variables, debido a que el Expression Language tiene esa limitante respecto a modificar valores
de los JavaBeans o crear JavaBeans. JSTL nos va a permitir crear ese tipo de variables con el tag de set. Podemos declarar una nueva variable y
especificar el valor de dicha variable con<c:set var=”nombre” value… y una vez que hemos creado la variable opcionalmente podemos declarar el
alcance de esta variable, en este caso estamos especificando el alcance de manera explícita scope=”page” pero si omitiéramos este atributo
scope=”page”/> sucedería que esta variable nombre se agrega de manera automática al alcance de page. Entonces con este tag vamos a cubrir la
limitante de expression Language para crear variables y también por ello es que vamos a poder omitir el uso de scriptles, utilizando código mucho
más fácil de mantener y de entender en un JSP.
Posteriormente también tenemos tags para manejar elementos condicionales, por ejemplo el tag de if si es que necesitamos manejar algún código
condicional, ej. <c:if test=”${ i > 0 }> o también el tag de choose, este es un tag muy similar al switch de java, y los casos del switch se pueden
poner con <c:when test=”a”>.
También tenemos etiquetas de iteración <c:forEach var=”persona” ítems=”{personas}>… para poder procesar los elementos de una lista. Cada
uno de estos elementos se van a ir iterando y almacenando en el objeto persona. Esto va a ser un nuevo complemento respecto al Expression
Language debido a que en un Expression Language no podemos iterar los elementos pero si podemos ir accediendo a cada uno de ellos de
manera individual, entonces combinaremos JSTL con Expression Language para poder acceder a los elementos de una colección.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 5
CURSO DE SERVLETS Y JSPS
Existen muchos más tags dentro del core de JSTL pero vamos a mencionar unos cuantos más.
Uno de los tags bastante útiles respecto a JSTL es el tag de import <c:import url=”recursoInternoExterno”>
en este caso la diferencia con un include que hemos comentado anteriormente con los JSPs es que los
includes únicamente están restringidos a elementos que están dentro de nuestra aplicación web, en
cambio este tag de import nos va a permitir incluir recursos internos o externos a nuestra aplicación web.
Por lo que podemos incluir formularios de otras aplicaciones web o incluso páginas completas de otras
aplicaciones. Esto nos va a permitir manipular nuestra aplicación de tal manera que el usuario no tenga
que cambiarse de aplicación para estar navegando en diferentes aplicaciones web.
También tenemos el tag de redirect <c:redirect url=”${nuevaUrl}”/> este caso es algo similar al send
redirect que hemos utilizado en los Servlets, pero en este caso es un tag que nos va a permitir hacer una
manipulación más sencilla del redirect. Únicamente lo que vamos a especificar es la nueva URL, que puede
estar también de igual manera dentro de nuestra aplicación o en una aplicación externa a la nuestra.
Y finalmente tenemos el tag de manejo de parámetros, debido a que podemos incluir recursos de manera
dinámica podríamos necesitar de enviar cierta información a estos recursos externos y debido a que no
podemos proporcionar parámetros de manera dinámica en este url, vamos a poder combinar el manejo
del tag de import y enviar la información de los parámetros por medio del tag de param, ej. <c:param
name=”nombre” value = ”${param.select}”/> especificando el nombre del parámetro y el valor del
mismo, incluso podemos observar cómo podemos combinar de nueva cuenta Expression Language para
poder acceder a otros parámetros que estemos recibiendo y posteriormente propagarlos a otro
componente JSP.
Estos son simplemente alguno de los ejemplos de tags que podemos utilizar con JSTL. A continuación
vamos a crear algunos ejemplos para poner en práctica el uso de JSTL combinándolos con nuestros JSPs.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 6
CURSO DE SERVLETS Y JSPS
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 7
CURSO DE SERVLETS Y JSPS
En Global Mentoring promovemos la Pasión por la Tecnología Java. Te invitamos a visitar nuestro
sitio Web donde encontrarás cursos Java Online desde Niveles Básicos, Intermedios y Avanzados,
y así te conviertas en un experto programador Java.
Además agregamos nuevos cursos para que continúes con tu preparación como programador Java
profesional. A continuación te presentamos nuestro listado de cursos:
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 8
www.gl obal mentoring.com .mx
Crear un ejercicio para poner en práctica el uso de JSTL con
JSPs. Al finalizar deberemos observar lo siguiente:
<html>
<head>
<meta charset="UTF-8">
<title>JSTL Core</title>
</head>
<body>
<h1>JSTL Core</h1>
<br>
<br>
<br>
<br>
<br>
<!-- codigo condicionado, similar al switch -->
<c:if test="${param.opcion != null}">
<c:choose>
<c:when test="${param.opcion == 1}">
<br>
Opcion 1 proporcionada
<br>
</c:when>
<c:when test="${param.opcion == 2}">
<br>
Opcion 2 proporcionada
<br>
</c:when>
<c:otherwise>
<br>
Opcion proporcionada desconocida: ${param.opcion}
<br>
</c:otherwise>
</c:choose>
</c:if>
www.gl obal mentoring.com .mx
Archivo jstlCore.jsp:
<!--Iteracion de un arreglo -->
<%
//Uso de Scriptlet
//Craemos el arreglo con un scriplet (aunque no es buena practica)
String[] nombres = {"Claudia", "Pedro", "Carlos", "Ana"};
//Compartimos el arreglo de nombres
//en el alcance (scope) de request
request.setAttribute("nombres", nombres);
%>
<br>
Lista de Nombres en el arreglo:
<br>
<ul>
<c:forEach varStatus="status" var="persona" items="${nombres}">
<li>${status.count} - Nombre: ${persona}</li>
</c:forEach>
</ul>
<br>
<a href="index.jsp">Regresar al Inicio</a>
</body>
</html>
<body>
<br/>
<a href="index.jsp">Regresar al Inicio</a>
</body>
</jsp:root>
/**
* Este método nos permite simular una propuedad llamada
* "rectangulo" desde la accion jsp:setProperty en un JSP
* @param r
*/
public void setRectangulo(Rectangulo r){
this.lista.add( r );
}
Hola, te saluda Ubaldo Acosta. Bienvenida o bienvenido nuevamente. Espero que estés listo para
comenzar con esta lección.
Vamos a estudiar el tema de patrón de diseño Model View Controller, también conocido como
MVC.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 2
CURSO DE SERVLETS Y JSPS
En esta lección vamos a revisar los conceptos del patrón de diseño en Modelo-Vista-
Controlador, también conocido como MVC.
Según hemos estudiado hasta el momento los Servlets están enfocados en controlar el
flujo de la aplicación y en este caso procesan las peticiones HTTP, así como utilizar los
JavaBean para almacenar información y finalmente redireccionar al JSP respectivo.
Los JSP’s están enfocados en desplegar la información de la aplicación Web, en este caso
la información es proveída por medio de los Servlets y la información que se comparte
entre esos componentes, es decir, entre los Servlets y JSPs suele manejarse con
JavaBeans.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 3
CURSO DE SERVLETS Y JSPS
El patrón de diseño MVC lo podemos implementar de manera manual utilizando JSPs y Servlets y con la ayuda del objeto
RequestDispatcher vamos a poder controlar el flujo de nuestra aplicación.
Existe varios Frameworks que implementan ya este patrón, un patrón de diseño es simplemente una guía, por lo tanto cada
uno de estos Frameworks tanto Struts, JavaServer Faces, Spring MVC, entre otros, únicamente siguen esta guía o
recomendaciones pero realmente no es una especificación que nos indique paso a paso como implementar este patrón, sino
simplemente es una serie de pasos genéricos con los cuales cada uno de estos Frameworks implementa según las mejores
prácticas desde el punto de vista de cada uno de estos Frameworks.
Por ejemplo en el caso del Framework de Struts es un framework de Apache, el cual utiliza JSPs como la Vista utilizando
también a su vez tags de Struts, posteriormente utiliza el concepto llamado ActionForm que de alguna manera sustituye a
los JavaBeans, siendo el modelo de nuestra aplicación y finalmente tenemos el concepto de Action, el cual cubre el rol del
controlador. Estos son simplemente algunos componentes de los que se manejan dentro del Frameworks de Struts.
JavaServer Faces es una tecnología definida por Sun Microsystems, en el cual se utilizan conceptos como son los mismos JSPs
pero utilizando tags de JSF, también vamos a utilizar el concepto de ManagedBean los cuales cubren el rol del controlador y
finalmente tenemos el concepto de JavaBeans para manejar el concepto de modelo aunque también cabe resaltar que los
ManagedBean pueden jugar el rol tanto de controlador como de modelo, entonces todo podría mezclarse en un solo bean y
se podría omitir el uso de los JavaBeans.
Por último mencionaremos el framework de Spring MVC. Este framework es una extensión de Spring, en el cual se utilizan
JSPs como parte la vista y se pueden utilizar los tags de Spring para robustecer estos JSPs. Posteriormente se utilizan clases
de Java, también conocidas como POJOs (Plain Old Java Objects) o clases puras de Java y se utilizan como controladores y
también se utilizan JavaBeans como parte del modelo.
Existen muchos frameworks más que implementan el patrón MVC utilizando el lenguaje Java, esto son tan solo algunos de
los más representativos y como hemos comentado únicamente el patrón de diseño es una guía general y cada framework
define la especificación según las mejores prácticas desde el punto de vista de cada framework.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 4
CURSO DE SERVLETS Y JSPS
Como podemos observar, el flujo inicia con un formulario HTML, esta información está almacenada en nuestro cliente y del lado derecho
vamos a tener el servidor. Una vez que nuestro cliente envía la petición del formulario hacia el servidor web, quien va a procesar esta
petición es un Servlet (controlador) y a pesar que en ejercicios anteriores hemos colocado a un JSP para manejar directamente
formularios, según hemos comentado, esta no es buena práctica. Por lo tanto, las peticiones las debe de procesar un Servlet controlador,
incluso podemos observar los números con los cuales vamos a ir siguiendo nuestro flujo (1 al 5).
Una vez que el Servlet controlador ha recibido la petición, una de sus tareas puede ser procesar los parámetros del formulario HTML si es
que aplica y una vez que ya tenemos procesado los parámetros del formulario, normalmente lo que hacemos es apoyarnos de JavaBeans
para almacenar o procesar la información de lógica de negocio o lógica de presentación de nuestra aplicación Web.
Ya que hemos creado y almacenado la información en nuestros JavaBeans, regresamos el control al Servlet y este Servlet controlador
puede colocar estos JavaBean en algún alcance para compartir información hacia un JSP. Los alcances pueden ser request, session o
application. Los Servlets no conocen el alcance de page, ya que eso pertenece sólo a los JSPs, por ello únicamente podemos manejar los 3
alcances mencionados.
Una vez que el Servlet Controlador ya ha colocado los JavaBeans en algún alcance, hace un redireccionamiento por medio del objeto
RequestDispatcher que vamos a ver más adelante. En este punto también cabe mencionar que el Servlet Controlador toma la decisión de
cual JSP se va a utilizar, por ejemplo podríamos tener un JSP1 un JSP2 un JSP3 etc. todo va a depender del flujo de la aplicación Web, pero
en este caso el Servlet Controlador es quien va a decidir cuál es Vista o JSP es el que se va a utilizar.
Finalmente, una vez que ya estamos dentro del JSP seleccionado, lo que va a hacer el JSP es jugar el rol de la Vista, esto implica que
únicamente va a mostrar la información que le compartió el Servlet. Los JSP’s en teoría no deberían de crear nuevos objetos Java, para ello
toda la información que va a utilizar el JSP ya debió de haber sido proporcionada por el Servlet controlador.
Una vez que el JSP genera el HTML utilizando la información de los JavaBeans que el Servlets le proporcionó, lo que hace es regresar el
contenido al cliente y en este momento es cuando se genera el Render de nuestra aplicación según el Content Type que hayamos
utilizado. Por ejemplo, puede ser una salida en HTML, PDF, Video, un archivo de Excel, etc. según hemos visto anteriormente.
El punto es que el JSP únicamente va a desplegar la información que recibió del Servlet y enviará esta información al cliente. Con esto
termina el flujo y si el cliente necesitara de realizar una nueva petición el proceso se repite nuevamente.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 5
CURSO DE SERVLETS Y JSPS
Por último, vamos a comentar el código necesario a grandes rasgos que utiliza un Servlet controlador.
Según revisamos en la teoría de los Servlets, para procesar un parámetro podemos utilizar la siguiente notación:
request.getParameter(“nombreParametro”); podemos hacer uso del objeto request y del método getParameter indicando el nombre del
parámetro que queremos procesar.
Posteriormente, podemos validar los parámetros para saber si la información que estamos recibiendo es correcta. Una vez que ya hemos
procesado los parámetros podemos realizar la lógica de presentación respectiva o la lógica de negocio utilizando JavaBeans. El resultado
de procesar esta información la vamos a almacenar en objetos de tipo JavaBean, en este caso simplemente estamos creando un nuevo
objeto de tipo Rectangulo Rectangulo rec = new Rectangulo(). Únicamente estamos creando un nuevo JavaBean para tratar de
ejemplificar que estos JavaBeans van a tener la información de nuestra aplicación Web.
Posteriormente, antes de redireccionar y seleccionar el JSP que vamos a utilizar, debemos de compartir el objeto que estamos creando en
algún alcance, en este caso estamos seleccionado el alcance de request, pero podemos usar los alcances de session o el de servlet context.
En este caso usaremos el método setAttribute del objeto request e indicamos el nombre del bean que se va a recuperar por parte del JSP.
Finalmente seleccionaremos el JSP que desplegará la información al cliente, por medio del código:
RequestDispatcher dispatcher = request.getRequestDispatcher(“resultado.jsp”); lo que hacemos es seleccionar el JSP apoyándonos del
objeto request y del método getRequestDispatcher, aquí lo que vamos hacer es proporcionar el JSP que estamos seleccionando como la
Vista que va a desplegar la información que estamos compartiendo por medio del objeto request y una vez que hemos seleccionado el JSP
que vamos a utilizar, lo asignamos a un objeto llamado RequestDispatcher. Este es el objeto que hemos venido comentando y que nos va
a permitir redireccionar hacia el JSP respectivo.
Finalmente usamos el método dispatcher.forward(request, response); lo que hacemos es utilizar el objeto dispatcher para ejecutar el
método forward. Aquí lo importante es que podemos observar que tenemos 2 argumentos, el argumento de request y el argumento de
response. Si recordamos, una vez que estamos procesando un método de un Servlet Controlador, por ejemplo si tenemos el método
doGet o el método doPost, estamos recibiendo como argumentos el objeto request y el objeto response, en pocas palabras lo que
estamos haciendo aquí es únicamente proporcionar los mismos objetos que ya hemos recibido en este Servlet, con la intención de que la
información que hemos compartido en nuestros objetos de request, session o application se sigan compartiendo con los demás elementos
que vamos a seguir utilizando. En este caso, por medio del método forward estamos proporcionando y enviando toda la información
necesaria al JSP para que no tenga ningún problema y pueda acceder a la información que hemos compartido previamente por medio del
Servlet. A continuación vamos hacer un ejercicio para poner en práctica el concepto del patrón de diseño MVC.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 6
CURSO DE SERVLETS Y JSPS
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 7
CURSO DE SERVLETS Y JSPS
En Global Mentoring promovemos la Pasión por la Tecnología Java. Te invitamos a visitar nuestro
sitio Web donde encontrarás cursos Java Online desde Niveles Básicos, Intermedios y Avanzados,
y así te conviertas en un experto programador Java.
Además agregamos nuevos cursos para que continúes con tu preparación como programador Java
profesional. A continuación te presentamos nuestro listado de cursos:
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 8
www.globalmentoring.com.mx
Crear un programa para el manejo del patrón de diseño MVC.
Al finalizar deberemos observar lo siguiente:
www.globalmentoring.com.mx
Diagrama que tomaremos como base para desarrollar el ejercicio:
www.globalmentoring.com.mx
Vamos a crear el proyecto:
www.globalmentoring.com.mx
Vamos a crear el proyecto:
www.globalmentoring.com.mx
Vamos a borrar el archivo index.html:
www.globalmentoring.com.mx
Vamos a crear un nuevo JSP:
www.globalmentoring.com.mx
( )
Vamos a crear un nuevo JSP:
www.globalmentoring.com.mx
Vamos a crear un nuevo JSP:
www.globalmentoring.com.mx
( )
Vamos a crear un nuevo JSP:
www.globalmentoring.com.mx
Vamos a crear la clase ServletControlador.java:
www.globalmentoring.com.mx
( )
Vamos a crear la clase ServletControlador.java:
www.globalmentoring.com.mx
Vamos a crear la clase Rectangulo.java:
www.globalmentoring.com.mx
( )
Vamos a crear la clase Rectangulo.java:
www.globalmentoring.com.mx
Archivo index.jsp: Dar click para ir al código
<html>
<head>
<meta charset="UTF-8">
<title>Ejemplo MVC</title>
</head>
<body>
<h1>Ejemplo MVC</h1>
<br>
<a href="${pageContext.request.contextPath}/ServletControlador">
Link al servlet controlador que despliega las variables
</a>
</body>
</html>
www.globalmentoring.com.mx
Archivo desplegarVariables.jsp: Dar click para ir al código
<html>
<head>
<meta charset="UTF-8">
<title>Despliegue de Variables</title>
</head>
<body>
<h1>Despliegue de Variables</h1>
<br>
<br>
<br>
<br>
<a href="${pageContext.request.contextPath}/index.jsp">
Regresar al Inicio
</a>
</body>
</html>
www.globalmentoring.com.mx
Archivo ServletControlador.java: Dar click para ir al código
package controller;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import model.Rectangulo;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. En este caso no hay necesidad de procesar parametros
public Rectangulo(){}
public Rectangulo(int base, int altura){
this.base = base;
this.altura = altura;
}
www.globalmentoring.com.mx
( )
El resultado es como sigue:
www.globalmentoring.com.mx
• Con este ejercicio hemos puesto en práctica lo básico del
patrón de diseño MVC.
www.globalmentoring.com.mx
’
Por: Ing. Ubaldo Acosta
www.globalmentoring.com.mx
www.gl obal mentoring.com .mx
Crear un programa para el manejo básico de elementos de un
JSP. Al finalizar deberemos observar lo siguiente:
<br><br>
Variable application:
Base: ${rectanguloApplication.base}
Altura: ${rectanguloApplication.altura}
Area: ${rectanguloApplication.area}
<br><br>
<a href="${pageContext.request.contextPath}/index.jsp">
Regresar al inicio
</a>
</body>
</html>
www.gl obal mentoring.com .mx
Archivo ServletControlador.java: Dar click para ir al código
package controller;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import model.Rectangulo;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//Procesamos la peticion
//1. Procesamos los parametros
String accion = request.getParameter("accion");
if ("agregaVariables".equals(accion)) {
//3. Compartimos las variables en el alcance
//seleccionado
//Alcance request
request.setAttribute("rectanguloRequest", recRequest);
//Alcance application
ServletContext application = this.getServletContext();
application.setAttribute("rectanguloApplication", recApplication);
//Agregamos un mensaje
request.setAttribute("mensaje", "Las variables fueron agregadas");
} else if ("listarVariables".equals(accion)) {
//4. Unicamente redireccionamos, ya no agregamos variables
//y se desplegaran solamente las que sigan disponibles
//segun el alcance de cada variable
request.getRequestDispatcher("/WEB-INF/alcanceVariables.jsp").forward(request, response);
} else {
//4. Redireccionamos a la pagina de inicio
//agregamos un mensaje
request.setAttribute("mensaje", "Accion no proporcionada o desconocida");
request.getRequestDispatcher("index.jsp").forward(request, response);
public Rectangulo(){}
public Rectangulo(int base, int altura){
this.base = base;
this.altura = altura;
}
Global Mentoring
Sistema de Gestión de Alumnos (SGA)
Versión 1.0
Historial de Revisión
Versión Autor Descripción
1.0 Ing. Ubaldo Acosta Soto Visión Inicial del Proyecto
Confidencial:
Ing. Ubaldo Acosta Soto – Global Mentoring Página 1 de 16 www.globalmentoring.com.mx
Proyecto: SGA – Sistema de Gestión de Alumnos
Documento de Especificación de Requerimientos
Del Sistema “SRS”
Tabla de Contenido
1. INTRODUCCIÓN 4
1.1 PROPÓSITO 4
1.2 ALCANCE 4
1.3 CONTEXTO DEL SISTEMA 4
1.4 ACTORES PRINCIPALES DEL PROCESO DE NEGOCIO 4
1.5 CÓMO ESTÁ ORGANIZADO ESTE DOCUMENTO 4
1.6 REGISTRO DE LOS CAMBIOS AL SGA 5
1.7 REFERENCIAS 5
2. RESTRICCIONES Y SUPOSICIONES 5
4. REQUERIMIENTOS FUNCIONALES 7
5. REQUERIMIENTOS NO-FUNCIONALES 12
5.1.1 RENDIMIENTO 12
5.1.2 ESCALABILIDAD 12
Confidencial:
Ing. Ubaldo Acosta Soto – Global Mentoring Página 2 de 16 www.globalmentoring.com.mx
Proyecto: SGA – Sistema de Gestión de Alumnos
Documento de Especificación de Requerimientos
Del Sistema “SRS”
5.2 DISPONIBILIDAD 13
5.3 SEGURIDAD 13
5.4 USABILIDAD 13
5.5 ACCESIBILIDAD 14
5.6 REUSABILIDAD 14
5.7 MANTENIMIENTO 14
Confidencial:
Ing. Ubaldo Acosta Soto – Global Mentoring Página 3 de 16 www.globalmentoring.com.mx
Proyecto: SGA – Sistema de Gestión de Alumnos
Documento de Especificación de Requerimientos
Del Sistema “SRS”
1. Introducción
1.1 Propósito
El propósito de este documento es definir los requerimientos específicos del Sistema de Gestión
de Alumnos (por sus siglas SGA), y detallar las especificaciones respecto a las características,
capacidades y atributos principales del sistema. Este documento debe ser leído por el equipo de
desarrollo del Sistema, para evaluar los beneficios y la viabilidad del proyecto, así como proveer
una estimación básica del tiempo y esfuerzo necesario para la construcción, pruebas, puesta en
marcha y mantenimiento del SGA. Este documento no describe como, cuando, o donde se
realizarán las actividades o quién las llevará a cabo, ya que se detallará en otros documentos.
1.2 Alcance
El SGA será una aplicación Web que permita gestionar los alumnos que participan en cursos en
Global Mentoring, a su vez tiene como uno de los principales objetivos ofrecer un seguimiento
claro y puntual de cada uno de los pendientes con cada uno de los alumnos, tales como venta de
cursos, pagos, envío de boletines, envío de mensajes SMS para noticias, entre otros.
Otra de las responsabilidades del SGA será permitir al usuario realizar búsquedas de alumnos,
cursos, pendientes con alumnos, agregar al sistema fotos y/o documentos digitalizados asociados
al alumno.
La seguridad de la información es un tema inherente, por lo que se restringirá a los usuarios
respecto a qué es lo que pueden consultar y/o modificar en el sistema.
1.3 Contexto del Sistema
El sistema inicialmente se utilizará en la intranet de Global Mentoring, y posteriormente se
publicará en internet, pudiendo ser accedida por varios tipos de usuarios, como pueden ser:
Administrador, Instructor, Alumno, Asistente, entre otros.
1.4 Actores principales del proceso de negocio
A continuación se muestra una lista de los principales actores que interactuarán en el proceso de
negocio del SGA. Cada rol puede tener varias personas que realicen la misma labor, y que
podrían proporcionar más detalle para la recolección de los requerimientos. Cada rol tiene un
actor principal, quien es el encargado de resolver las diferencias y es quien aprueba el
requerimiento final para este rol.
Rol Actor Principal Actores de Referencia
Coordinador Ubaldo Acosta N/A
Confidencial:
Ing. Ubaldo Acosta Soto – Global Mentoring Página 4 de 16 www.globalmentoring.com.mx
Proyecto: SGA – Sistema de Gestión de Alumnos
Documento de Especificación de Requerimientos
Del Sistema “SRS”
La sección 2 describe las restricciones y suposiciones del sistema. La sección 3 describe los
riesgos del proyecto y cómo pueden ser estos mitigados. La sección 4 describe los
requerimientos funcionales (FRs) del sistema. La mayoría de estos requerimientos existen por
que directamente soportan el proceso de negocio, otros existen debido a que soportan la correcta
operación del sistema, aunque no sean parte esencial del negocio. Todos los requerimientos
funcionales están descritos en términos de casos de uso. La sección 5 describe los requerimientos
no funcionales (NFRs) del sistema. La sección 6 provee un glosario del proyecto, que incluye
términos del negocio, como propios del sistema.
1.6 Registro de los cambios al SGA
Estos cambios se irán registrando dentro de los requerimientos ya sean funcionales o no
funcionales según se vayan solicitando cambios.
No existen cambios
1.7 Referencias
Documento de Visión del Proyecto para el SGA.
Object-Oriented Analysis and Design Using UML, sun educational services, S00-226-V030
2. Restricciones y Suposiciones
La siguiente sección provee el detalle de lo que se explicó brevemente en el Documento de
Visión del Proyecto.
2.1 Restricciones en el Proceso de Desarrollo y del Equipo de Trabajo
El tiempo asignado al desarrollo del proyecto, es definitivamente una de las mayores
restricciones, debido a que se depende del tiempo que los alumnos aporten al proyecto, se
establecerán planes de trabajo acorde a los tiempos de aporte de cada alumno.
El equipo de trabajo está conformado por 1 Líder de Proyecto y varios programadores
(alumnos), los cuales no están asignados de tiempo completo a este proyecto, por lo que
existe el riesgo de atrasos en el desarrollo del sistema debido a las demás actividades y/o
prioridades de los alumnos en Global Mentoring.
2.2 Restricciones Tecnológicas
2.2.1 Restricciones de Software
El equipo de desarrollo de Global Mentoring ha decidido construir el SGA usando la tecnología
Java (Java SE JDK) debido a la portabilidad, flexibilidad y el costo de entre varios productos.
http://www.oracle.com/technetwork/es/java/javase/downloads/index.html
Inicialmente el sistema utilizará la tecnología más básica posible, utilizando solo JSP’s y
Servlets, y posteriormente se podrá utilizar la siguiente tecnología para el sistema.
El servidor Web será Glassfish. La seguridad en la aplicación será proporcionada por el
framework Spring Security. En la capa de presentación se utilizará JSF con primeFaces y AJAX
para Java. Los servicios de negocio se desarrollaran utilizando clases puras de java (POJOs) con
apoyo del framework de Spring. La capa de persistencia se utilizará el framework de JPA
implementado por Hibernate. La base de datos será MySql. El motor de reportes para la
aplicación será JasperReports y el IDE para el desarrollo del prototipo y el software final será
NetBeans. El sistema operativo del servidor Web será Windows, mismo que almacenará la base
de datos. Cabe mencionar que todo el software utilizado en el proyecto es software libre, a
excepción del sistema operativo.
Glassfish – https://glassfish.java.net/download.html
primeFaces – http://www.primefaces.org/
Spring – https://spring.io/
Confidencial:
Ing. Ubaldo Acosta Soto – Global Mentoring Página 5 de 16 www.globalmentoring.com.mx
Proyecto: SGA – Sistema de Gestión de Alumnos
Documento de Especificación de Requerimientos
Del Sistema “SRS”
Hibernate – http://www.hibernate.org/
Netbeans - http://www.netbeans.org/
2.2.2 Restricciones de Hardware
El SGA es una aplicación Web con una base de datos centralizada, por lo que los equipos cliente
deberán estar conectados a la intranet de Global Mentoring. Posteriormente se liberará el sistema
en la plataforma de Google GAE en Internet.
El SGA ofrecerá la característica para subir archivos digitalizados, por lo que los usuarios
requerirán de un scanner para realizar esta labor.
El servidor donde será alojado el servidor Web y el servidor de base de datos, tendrá las
siguientes características:
Procesador Intel i7
8 Gb Ram
1 Tb de espacio en disco duro
Por parte de los usuarios del sistema puede tener las siguientes características como mínimo:
Procesador Intel i5 (o similar)
4 Gb Ram
Disco duro de 500 Gb, con mínimo el 50% libre
Resolución del monitor 1024x768 píxeles
Internet Explorer 10 o superior (o similar).
Sistema Operativo Windows 7 o superior
Acrobar Reader
Microsoft Office o Open Office para el manejo de hojas de cálculo (version compatible
2007)
2.3 Restricciones en la Liberación y Despliegue del Sistema
Se utilizarán los servidores de la intranet de Global Mentoring (no dedicados) para albergar
inicialmente la aplicación, compartiendo los recursos con otras aplicaciones y con las otras bases
de datos en el mismo servidor.
El lenguaje de programación del SGA será Java, permitiendo con ello que el software sea
independiente de plataforma, robusto, y fácilmente mantenible.
Confidencial:
Ing. Ubaldo Acosta Soto – Global Mentoring Página 6 de 16 www.globalmentoring.com.mx
Proyecto: SGA – Sistema de Gestión de Alumnos
Documento de Especificación de Requerimientos
Del Sistema “SRS”
4. Requerimientos Funcionales
Esta sección define los actores que utilizan el sistema que a su vez se relacionan con los procesos
de negocio principales, así como los casos de uso que el sistema provee para los actores
mencionados.
4.1 Características Principales
En esta sección, clasificaremos las características principales del SGA en tres tipos de categorías.
Características esenciales, de alto valor y futuras. En todos los casos la lista no es exhaustiva,
pero si incluye los procesos de negocio más importantes.
4.1.1 Características Esenciales
El SGA será una aplicación Web con una base de datos centralizada capaz de mostrar la
información a los usuarios en cuanto sea capturada o modificada, es decir, en línea.
El sistema deberá permitir la captura, modificación y asociación de todos los alumnos.
El sistema deberá proporcionar mecanismos para dar un seguimiento claro y oportuno de cada
uno de los pendientes con los alumnos.
El SGA deberá ofrecer reportes para explotar la información almacenada en la base de datos.
4.1.2 Características de Alto Valor
El sistema permitirá agregar archivos digitalizados de los alumnos y sus anexos, tales como
Currículo Vitae, para tener disponible la información en el sistema.
Uso de cámara web para tomar una foto de los alumnos y tenerla en sus registros.
4.1.3 Características futuras
El sistema permitirá realizar consultas para encontrar la información de manera precisa y rápida.
En un principio con consultas esenciales, para posteriormente, en otra versión, agregar filtros de
búsqueda avanzados.
El sistema deberá permitir administrar los usuarios del sistema.
El sistema deberá administrar todos los catálogos del sistema.
El sistema deberá simplificar su interfaz para manejar el concepto de web 2.0, incluyendo
AJAX.
Confidencial:
Ing. Ubaldo Acosta Soto – Global Mentoring Página 7 de 16 www.globalmentoring.com.mx
Proyecto: SGA – Sistema de Gestión de Alumnos
Documento de Especificación de Requerimientos
Del Sistema “SRS”
4.2 Actores
La lista que se muestra a continuación es una lista de los roles y/o sistemas que interactuarán con
el SGA.
Alto Valor: A
Futuro: F
Nota: No se incluyen todos los casos de uso futuros, ya que el objetivo es solamente ejemplificar la metodología.
Confidencial:
Ing. Ubaldo Acosta Soto – Global Mentoring Página 9 de 16 www.globalmentoring.com.mx
Proyecto: SGA – Sistema de Gestión de Alumnos
Documento de Especificación de Requerimientos
Del Sistema “SRS”
Confidencial:
Ing. Ubaldo Acosta Soto – Global Mentoring Página 10 de 16 www.globalmentoring.com.mx
Proyecto: SGA – Sistema de Gestión de Alumnos
Documento de Especificación de Requerimientos
Del Sistema “SRS”
E2-1 El sistema deberá permitir agregar o modificar los alumnos registrados en el sistema. La
eliminación está restringida, ya que en lugar de eliminar un registro, se cambiará un campo
que maneje el estatus (Campo “deleted”)
E2-2 El sistema deberá permitir asociar uno o varios cursos a un alumno
E2-3 Los datos que se deben capturar del alumno son:
Nombre
Apellido Paterno
Apellido Materno
Dirección (Calle, No. Exterior, No. Interior, Colonia, C.P., Municipio/Delegación,
Estado)
Teléfonos
Particular
Oficina
Celular
E-mail (Debe permitir capturar varios e-mails)
Cursos asignados
Fecha del sistema (solo es informativo, y solo se visualiza en la consulta y/o
modificación, ya que en el alta se registran estos datos hasta que se guardan en la
BD)
Hora del Sistema (solo es informativo)
E2-4 Los datos que se deben capturar por cada curso son:
Nombre del curso
Instructor
Fecha de Inicio
Fecha Término (si es que aplica)
Ubicación
Horario
Precio
E2-5 Los datos que se deben capturar por instructor son:
Nombre
Apellido Paterno
Apellido Materno
Dirección (Calle, No. Exterior, No. Interior, Colonia, C.P., Municipio/Delegación,
Estado)
Teléfonos
Particular
Oficina
Celular
E-mail (Debe permitir capturar varios e-mails)
5. Requerimientos No-Funcionales
Los Requerimientos No Funcionales (por sus siglas en inglés, NFRs) se diferencian de los
Requerimientos Funcionales (por sus siglas en inglés, FRs) debido a que comienzan con el
número 100. Por lo tanto, el primer NFR para el caso de uso E1, tendrá el Código de
Requerimiento E1-101.
5.1.1 Rendimiento
Versión Actual
Código Req. Descripción Requerimiento
E1-101 Debido a que el SGA es una aplicación Web, los tiempos de respuesta deberán ser muy
reducidos (menor a 3 segundos en las consultas), ya que la velocidad de captura es esencial.
E1-102 Se tiene contemplado un acceso de 50 usuarios al día, y un volumen de 100 transacciones
diarias, esperando un incremento del 10% mensual
E1-103 El sistema deberá soportar como mínimo un total de 10 usuarios concurrentes en el sistema
(10 conexiones a base de datos activas)
E1-104 Para completar el registro un alumno, el rol de asistente no debe tardar más de 3 minutos en
hacer un registro completo de un registro
Versión Futura
Código Req. Descripción Requerimiento
E1-105 Inicialmente el sistema se usará únicamente en la Intranet de Global Mentoring.
Posteriormente se liberará una versión para internet con el soporte de la infraestructura de
Google GAE.
E1-106 El SGA en un futuro podría crecer a más de 100 usuarios al día, dependiendo del número de
alumnos y maestros que utilicen el sistema.
5.1.2 Escalabilidad
Versión Actual
Código Req. Descripción Requerimiento
E1-107 La capacidad de los registros de los oficios podría crecer a 150 registros por día,
dependiendo del uso y exactitud que el usuario almacene en el sistema, por ejemplo, si se
genera un registro de seguimiento por cada copia que se observa en los oficios.
Versión Futura
Código Req. Descripción Requerimiento
Confidencial:
Ing. Ubaldo Acosta Soto – Global Mentoring Página 12 de 16 www.globalmentoring.com.mx
Proyecto: SGA – Sistema de Gestión de Alumnos
Documento de Especificación de Requerimientos
Del Sistema “SRS”
5.2 Disponibilidad
Versión Actual
Código Req. Descripción Requerimiento
E1-109 Debido a que es un sistema Web, por naturaleza debe tener una disponibilidad de 7 por 24
los 365 días del año, excepto por una hora de baja del servicio (para mantenimiento del
software, respaldo de datos, etc.), siendo aceptable una vez a la semana en horarios que no
afecte la operación, excepto en ocasiones de emergencia o extraordinarias, como puede ser
la falta de servicio de luz, falta de conexión a Internet o a la Intranet, entre otros.
Versión Futura
No existen requerimientos futuros para este rubro
5.3 Seguridad
Versión Actual
Código Req. Descripción Requerimiento
E1-110 El SGA deberá tener un mecanismo de autenticación basado en nombre de usuario y
contraseña para acceder a cualquier información del sistema
E1.111 El SGA deberá solicitar nuevamente el nombre de usuario y contraseña después de 30
minutos de inactividad
E1-112 El sistema tendrá un mecanismo de autorización a los datos del sistema, basado en roles,
además de asignación de permisos de acceso de cada uno de los módulos del sistema.
Además el menú del sistema se generará de manera dinámica, dependiendo de los permisos
que se hayan asignado a cierto rol por cada módulo.
E1-113 El sistema registrará cada una de las acciones que cada usuario del sistema ejecute, teniendo
una bitácora que permita auditorias en caso de problemas o aclaraciones
E1-114 El sistema manejará una auditoria de las tablas de base de datos más importantes, para tener
la historia de los registros, y saber cuando, qué y quién modificó los registros en caso de
problemas o aclaraciones
E1-115 Los principales roles de seguridad del sistema serán: Administrador del sistema,
Coordinador, Instructor, Asistente y Alumno.
Versión Futura
No existen requerimientos futuros para este rubro
5.4 Usabilidad
Versión Actual
Código Req. Descripción Requerimiento
E1-116 El sistema deberá tener una interfaz de fácil uso e intuitiva.
Confidencial:
Ing. Ubaldo Acosta Soto – Global Mentoring Página 13 de 16 www.globalmentoring.com.mx
Proyecto: SGA – Sistema de Gestión de Alumnos
Documento de Especificación de Requerimientos
Del Sistema “SRS”
Versión Futura
Código Req. Descripción Requerimiento
E1-117 Se utilizarán frameworks como iceFaces para tener una interfaz con características web 2.0
5.5 Accesibilidad
Versión Actual
Código Req. Descripción Requerimiento
E1-118 El SGA deberá poder accederse desde cualquier computadora conectada a la Intranet de
Global Mentoring
Versión Futura
Código Req. Descripción Requerimiento
E1-119 El SGA deberá poder accederse desde cualquier computadora conectada a Internet
5.6 Reusabilidad
Versión Actual
Código Req. Descripción Requerimiento
E1-120 El sistema deberá utilizar todos los componentes generados y/o utilizados en proyectos
anteriores desarrollados por los participantes en el proyecto
Versión Futura
No existen requerimientos futuros para este rubro
5.7 Mantenimiento
Las categorías de un problema de sistemas típicamente se dividen como se muestra a
continuación.
Severidad 1, Fatal – El sistema complete no funciona y no puede ser utilizado para nada.
Severidad 2, Error – Una parte crítica del sistema no funciona, y no se acepta otra
alternativa
Severidad 3, Media – Un problema en el sistema requiere revisarse lo antes posible, para
evitar problemas. No es posible aplazar por mucho tiempo este punto.
Severidad 4, Menor – El funcionamiento del sistema no afecta significativamente al
Usuario, y éste puede vivir con el problema por ahora.
Severidad 5, Mejora – Es deseable agregar un cambio o algún agregado al sistema para
evitar problemas de deficiencia.
Esta clasificación nos permitirá asignar la prioridad a los problemas que surjan durante la
operación del sistema.
Confidencial:
Ing. Ubaldo Acosta Soto – Global Mentoring Página 14 de 16 www.globalmentoring.com.mx
Proyecto: SGA – Sistema de Gestión de Alumnos
Documento de Especificación de Requerimientos
Del Sistema “SRS”
Confidencial:
Ing. Ubaldo Acosta Soto – Global Mentoring Página 15 de 16 www.globalmentoring.com.mx
Proyecto: SGA – Sistema de Gestión de Alumnos
Documento de Especificación de Requerimientos
Del Sistema “SRS”
Confidencial:
Ing. Ubaldo Acosta Soto – Global Mentoring Página 16 de 16 www.globalmentoring.com.mx
CURSO DE SERVLETS Y JSP'S
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 2
CURSO DE SERVLETS Y JSP'S
Como podemos observar estamos mostrando el diagrama de caso de uso inicial de nuestro sistema de
gestión de alumnos SGA. Tenemos como actores el Administrador del Sistema, el Coordinador de los
cursos, el Instructor, el Asistente y el Alumno, cada uno de estos actores va a estar interactuando con
alguno de los módulos de nuestro sistema y por medio de un análisis previo obtuvimos los siguientes
casos de uso.
Obtuvimos el caso de uso para la Gestión de Usuarios, para la Gestión de Alumnos, para la Gestión de
Catálogos, para la gestión de Pendientes, el seguimiento de Pendientes y el caso de uso de Reportes.
Cada uno de estos casos de usos se debería ir detallando conforme se avanzara en el desarrollo y
documentación de nuestra aplicación. En este caso únicamente estamos mostrando el diagrama de caso
de uso inicial para que tengamos una idea de que es lo que va hacer nuestro sistema, y por ejemplo en
el caso de uso de Gestión de Alumnos debe incluir por ejemplo el Alta, el Cambio y la Baja de los
Alumnos y en concreto entonces cada uno de estos caso de uso se debería ir detallando conforme se
vaya avanzando en el desarrollo del sistema.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 3
CURSO DE SERVLETS Y JSP'S
En este segundo diagrama que incluimos dentro de la documentación, podemos observar un diagrama
de iteraciones.
Aquí lo que estamos mostrando es que en la primera etapa vamos a tener una primera iteración, en la
cual vamos a tener una duración aproximada de 2 meses. Posteriormente, una segunda iteración para el
caso de uso de Gestión de Alumnos, el cual se debería concluir en aproximadamente 3 meses.
Cabe resaltar que como hemos comentado estos caso de uso son muy genéricos, entonces engloban
mucha más información. Conforme se va avanzando se debería ir detallando cada uno de los casos de
uso y de igual manera se muestran los actores que van a interactuar con estos casos de uso.
A su vez, mostramos un cuadro en el cual estamos indicando la duración de cada una de las etapas
conforme se va realizando cada una de estas iteraciones. Por ejemplo, para esta iteración 1, el caso de
uso de Gestión de Usuarios va a tardar en la etapa de inicio 10 días, en la etapa de elaboración 15 días,
en la etapa de construcción 1 mes y en la etapa de transición 5 días, dando un total de 2 meses.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 4
CURSO DE SERVLETS Y JSP'S
Los diagramas de caso de uso se pueden validar, por lo tanto se incluyen las imágenes de los diagramas
para poder visualizar estos diagramas.
Estamos mostrando un diagrama que es la validación del caso de uso de gestión de usuarios, entonces
si se requiere más detalle se deja como ejercicio revisar el diagrama que representa a esta validación.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 5
CURSO DE SERVLETS Y JSP'S
De igual manera se incluye otra validación que es la validación de gestión de alumnos, también se deja
como tarea revisar a más detalle este diagrama.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 6
CURSO DE SERVLETS Y JSP'S
En este caso además de las clases que tenemos en nuestro sistema, estamos agregando los paquetes del mismo.
Si revisamos el código fuente es únicamente a grandes rasgos, debido a que en el sistema tenemos más paquetes
de Java que organizan la información de manera adecuada y con las mejores prácticas.
Para esta aplicación estamos considerando, según hemos comentado, 3 capas. Tenemos la Capa de Datos, la Capa
de Negocio y la Capa de Presentación en este caso la Capa Web.
En la Capa de Datos tenemos clases como pueden ser nuestros DTOs, tenemos clases como son nuestros DAOs y
tenemos también nuestras clases que son las fabricas (los Factory) de los DAO. A su vez, agregamos un manejo de
excepciones y la clase que nos permite hacer una conexión hacia la base de datos.
En la Capa de Negocio tenemos clases como pueden ser las de servicio para el usuario y para el catálogo de
persona.
Y finalmente en la Capa Web tenemos un Servlet controlador y tenemos distintas páginas que nos van a permitir
mostrar la información hacia el cliente y finalmente tenemos un usuario que es el que va a estar procesando la
información en nuestro sistema.
Existen más diagramas que se pueden agregar a esta documentación, como pueden ser diagramas de secuencia,
aunque para ello se requiere más documentación y más tiempo al respecto, por ello en este caso únicamente
estamos incluyendo los diagramas esenciales para documentar nuestro sistema.
A continuación vamos a revisar ya la etapa de construcción en la cual vamos a poder estudiar el código de
nuestro sistema y el mismo ya ejecutándose.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 7
CURSO DE SERVLETS Y JSP'S
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 8
CURSO DE SERVLETS Y JSP'S
En Global Mentoring promovemos la Pasión por la Tecnología Java. Te invitamos a visitar nuestro
sitio Web donde encontrarás cursos Java Online desde Niveles Básicos, Intermedios y Avanzados,
y así te conviertas en un experto programador Java.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 9
CURSO DE SERVLETS Y JSP'S
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 2
CURSO DE SERVLETS Y JSP'S
Ahora queda como ejercicio final para el alumno, agregar el caso de uso de Gestión de Usuarios al
sistema SGA.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 3
CURSO DE SERVLETS Y JSP'S
Se debe agregar la opción de catálogo de Usuarios y también validarse por medio del login de la
aplicación.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 4
CURSO DE SERVLETS Y JSP'S
Se debe agregar las acciones de Listado, Agregar, Editar y Eliminar usuarios. Se pueden apoyar del caso
de uso de personas el cual ya está desarrollado para la realización de este caso de uso.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 5
CURSO DE SERVLETS Y JSP'S
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 6
CURSO DE SERVLETS Y JSP'S
En Global Mentoring promovemos la Pasión por la Tecnología Java. Te invitamos a visitar nuestro
sitio Web donde encontrarás cursos Java Online desde Niveles Básicos, Intermedios y Avanzados,
y así te conviertas en un experto programador Java.
© Todos los Derechos Reservados Global Mentoring Experiencia y Conocimiento para tu Vida 7