Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Desarrollo de Aplicaciones Web I
Desarrollo de Aplicaciones Web I
Aplicaciones Web I
CARRERAS PROFESIONALES
CIBERTEC
NDICE
Pgina
Presentacin
Red de contenidos
: Fundamentos de Struts 2
13
29
51
1.2 Tema 2
63
caractersticas Struts 2
1.2.1. : Uso de un pool de conexiones para acceso a la fuente
63
de datos
1.2.2. : Librera de Etiquetas de Struts 2 Principales
72
componentes
1.2.3. : Patrn Composite View Struts 2 Tiles
87
: Introduccin a IBATIS
101
101
110
IBATIS
2.2 Tema 4
119
119
128
Struts 2
CIBERTEC
139
CARRERAS PROFESIONALES
141
herramienta Ireport
3.2 Tema 6
: Struts 2 y JasperReport
142
142
Anexo 1
157
Anexo 2
167
Anexo 3
172
CARRERAS PROFESIONALES
CIBERTEC
PRESENTACIN
Desarrollo de Aplicaciones Web I pertenece a la lnea de Programacin y
Desarrollo de Aplicaciones. Es un curso de especialidad slo en la carrera de
Computacin e Informtica. Permite al estudiante concretizar proyectos
informticos web, aplicando conocimientos previos aprendidos en diferentes
cursos y poniendo en prctica la teora adquirida. De esta manera, consolida
conocimientos de diversos cursos de especialidad. Es prctico y desarrollado en
laboratorio. Se implementarn soluciones web que utilizarn los Frameworks
Struts 2 e IBATIS en forma combinada.
CIBERTEC
CARRERAS PROFESIONALES
RED DE CONTENIDOS
Modelo Vista
Controlador
Patrn MVC
Fundame
ntos de
Struts 2
Otras
Caractersticas
Struts 2
CARRERAS PROFESIONALES
Persistencia de
datos
Framework
IBATIS
Introduccin
a IBATIS
Otras
operaciones
IBATIS
Reportes en
sistemas
empresariales
Tema 5
JasperReport
CIBERTEC
Tema 6
Struts 2 y
Jasper
UNIDAD DE
APRENDIZAJE
TEMARIO
1.1 Tema 1 : Fundamentos de Struts 2
1.1.1. : Arquitectura y Configuracin de aplicaciones
1.1.2. : La clase Action
1.1.3. : Libreras de etiquetas de Struts 2
1.1.4. : Internacionalizacin I18N
ACTIVIDADES PROPUESTAS
Los alumnos implementan una aplicacin web bsica, utilizando las principales
caractersticas del framework MVC Struts 2.
CIBERTEC
CARRERAS PROFESIONALES
Figura 1.1
CARRERAS PROFESIONALES
CIBERTEC
Notas:
1) El principal archivo de configuracin del Framework es el
archivo struts.xml. En l, se registrarn sus principales
CIBERTEC
CARRERAS PROFESIONALES
10
Notas:
1) Note el registro del filtro controlador del framework Struts 2.
Este componente atrapar todas las solicitudes (request)
generadas desde un cliente, dado que tiene como alias /*.
CARRERAS PROFESIONALES
CIBERTEC
11
CIBERTEC
CARRERAS PROFESIONALES
12
CARRERAS PROFESIONALES
CIBERTEC
13
Notas:
1) Observe que solo se puede copiar el archivo struts.xml
dentro de la carpeta src, utilizando la vista Navigator.
2) Distinga las principales libreras y archivos de configuracin
en las ubicaciones correctas: libreras en la carpeta lib y
archivo de configuracin struts.xml en la carpeta src junto a
los archivos fuente.
Notas:
1) Agregue el paquete aprendamos.java.action y, dentro de l,
genere la clase LogueoAction.
La clase LogueoAction debe contar con la siguiente lgica:
CIBERTEC
CARRERAS PROFESIONALES
14
package aprendamos.java.action;
public class LogueoAction {
private String usuario;
private String clave;
<action name="logueo"
class="aprendamos.java.action.LogueoAction" >
<result name="error"
<result name="exito"
</action>
</package>
>/logueo.jsp </result>
>/bienvenida.jsp </result>
Notas:
1) El alias de la clase action es logueo; por lo tanto, debe
modificar el archivo logueo.jsp. Ya no invocar a la clase
LogueoServlet sino a LogueoAction.
CARRERAS PROFESIONALES
CIBERTEC
15
Notas:
1) Se puede observar en el url que el alias invocado es logueo.
Recuerde que en Struts 2 todas las solicitudes son atrapadas por
el filtro controlador del framework. ste invocar al action
respectivo sobre la base del registro realizado en el archivo
struts.xml.
f) Paso 6: Bien!, ha culminado la funcionalidad de logueo
versin 1
CIBERTEC
CARRERAS PROFESIONALES
16
CARRERAS PROFESIONALES
CIBERTEC
17
@Override
public ClienteDAO getClienteDAO() {
// TODO Auto-generated method stub
return new MySqlClienteDAO();
}
static
static
static
static
static
final
final
final
final
final
int
int
int
int
int
MYSQL = 1;
ORACLE = 2;
DB2 = 3;
SQLSERVER = 4;
XML = 5;
1
// Existir un mtodo por cada DAO que pueda ser creado.
// Ejemplo:
//public abstract ArticuloDAO getArticuloDAO();
// registramos nuestros daos
public abstract ClienteDAO getClienteDAO();
//public abstract ProductoDAO getProductoDAO();
CIBERTEC
CARRERAS PROFESIONALES
18
Notas:
1) El registro de la clase MySqlClienteDAO es la creacin de un
mtodo abstracto en la clase DAOFactory que retorna a la
interface que implementa MySqlClienteDAO.
2
public class LogueoService implements LogueoService_I {
// Referenciamos a la fabrica de daos para mysql
DAOFactory fabrica = DAOFactory.getDAOFactory(DAOFactory.MYSQL);
// Referenciamos al dao de la entidad cliente
ClienteDAO objClienteDAO = fabrica.getClienteDAO();
CARRERAS PROFESIONALES
CIBERTEC
19
Notas:
1)
Agregue el paquete aprendamos.java.action y dentro de
l genere la clase LogueoAction.
2)
Un servicio es un componente, que pertenece a la capa
Model del patrn de diseo MVC.
Representa, en la
programacin, el inicio de la lgica de negocio. Por cada caso
de uso de sistema identificado en la aplicacin, se debe
implementar un servicio. ste puede invocar a uno o ms DAOs.
CIBERTEC
CARRERAS PROFESIONALES
20
2
public class PaqueteBusinessDelegate {
private PaqueteBusinessDelegate() {
// TODO Auto-generated constructor stub
}
public static LogueoService_I getLogueoService(){
return new LogueoService();
}
// agregar aqui mas llamadas a otros servicios
Notas:
1) Dentro del paquete aprendamos.java.service, genere la clase
PaqueteBusinessDelegate.
2)
CARRERAS PROFESIONALES
CIBERTEC
21
ClienteDTO usuarioCandidato=
new ClienteDTO();
usuarioCandidato.setUsuario(this.getUsuario());
ClienteDTO objUsuario=null;
try {
objUsuario = logueoservice.validaUsuario(usuarioCandidato);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(objUsuario!=null){
if(objUsuario.getClave().equals(this.getClave())){
// creamos la sesion web al estilo struts 2
Map<String,Object>
lasesion=
ActionContext.getContext().getSession();
lasesion.put("b_usuario", objUsuario);
}else{
vista="error";
this.setMensaje( "Lo sentimos, la clave es
incorrecta");
}
}else{
vista="error";
this.setMensaje("Es una pena, el usuario no existe!");
}
return vista;
}
CIBERTEC
CARRERAS PROFESIONALES
22
</tr>
<tr>
CARRERAS PROFESIONALES
CIBERTEC
23
CIBERTEC
CARRERAS PROFESIONALES
24
Se
puede
observar
que,
a
travs
de
la
key
struts.custom.i18n.resources, se define la ubicacin del archivo
de recursos.
struts.custom.i18n.resources=aprendamos.java.recursos.MisRecursos
struts.ui.theme=simple
struts.action.extension=action,,dudu
CARRERAS PROFESIONALES
CIBERTEC
25
package aprendamos.java.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import aprendamos.java.bean.ClienteDTO;
import aprendamos.java.service.LogueoService_I;
import aprendamos.java.service.PaqueteBusinessDelegate;
public class LogueoAction extends ActionSupport {
. . .
}else{
vista="error";
this.setMensaje( this.getText(
"logueo.mensaje.error.clave"));
}
}else{
vista="error";
this.setMensaje(this.getText("logueo.mensaje.error.usuario"))
;
}
. . .
CIBERTEC
CARRERAS PROFESIONALES
26
<s:form action="logueo"
method="post"
>
<table >
<tr class="etiqueta" >
<td colspan="2" >
<img alt="El loguito" src="imagenes/logo_tiny.png"
</td>
</tr>
<tr class="etiqueta" >
<td> <fmt:message key="logueo.usuario" />
</td>
<td> <s:textfield name="cliente.usuario" /> </td>
</tr>
>
</table>
</s:form>
CARRERAS PROFESIONALES
CIBERTEC
27
ClienteDTO usuarioCandidato=
new ClienteDTO();
usuarioCandidato.setUsuario(this.getCliente().getUsuario());
ClienteDTO objUsuario=null;
try {
objUsuario =
logueoservice.validaUsuario(usuarioCandidato);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Notas:
}
if(objUsuario!=null){
if(objUsuario.getClave().equals(this.getCliente().getClave())){
CIBERTEC
CARRERAS PROFESIONALES
28
f)
CARRERAS PROFESIONALES
CIBERTEC
29
CIBERTEC
CARRERAS PROFESIONALES
30
web
Notas:
1) Note que, dentro del proyecto, cuenta con el script de base
de datos FacilitoBaseDatos.sql. En l, se debe verificar que la
tabla tbcliente cuenta con un tipo de dato adecuado para
almacenar un archivo de cualquier modelo.
CARRERAS PROFESIONALES
CIBERTEC
31
Notas:
1) Observe que, en el campo foto, se almacenar la imagen
asociada al cliente que registrar en su aplicacin web.
CIBERTEC
CARRERAS PROFESIONALES
32
enctype="multipart/form-data"
>
<table>
<tr class="titulo" >
<td colspan="2" align="center" > Registro de Clientes </td>
</tr>
<tr class="control" >
<td> <s:text name="key.cliente.nombre" /> </td>
<td> <s:textfield name="cliente.nombre" /> </td>
</tr>
. . .
. . .
<tr class="control" >
<td> Fotografa: </td>
<td> <s:file
name="cliente.foto"
</tr>
<tr class="control" >
<td align="right" >
<input
type="submit"
name="boton01"
value="Registrar" >
</td>
</tr>
</table>
</s:form>
/>
</td>
Notas:
1) Debe utilizar el atributo enctype del formulario con el valor
multipart/form-data. De esta manera,se habilita el formulario
para soportar campos tipo File.
2) Agregue la etiqueta file de Struts 2., cuyo nombre es
cliente.foto, es decir, har referencia a un objeto de nombre
cliente que cuente con un atributo llamado foto.
CARRERAS PROFESIONALES
CIBERTEC
33
<action name="ingresaCliente"
class="aprendamos.java.action.ClienteAction"
method="registra" >
<result name="exito"
>/listado.jsp</result>
</action>
Notas:
1) El alias ingresaCliente fue definido en el formulario de la
pgina nuevoCliente.jsp. Note que al invocar este alias se
ejecutar dentro de la clase ClienteAction el mtodo registrar.
package aprendamos.java.action;
import java.util.List;
import aprendamos.java.bean.ClienteDTO;
import aprendamos.java.service.ClienteService_I;
import aprendamos.java.service.PaqueteBusinessDelegate;
public class ClienteAction {
// creamos un atributo de tipo Lista de Clientes
ClienteDTO cliente;
List<ClienteDTO> clientes;
...
CIBERTEC
CARRERAS PROFESIONALES
34
...
2
ClienteService_I servicioCliente =
PaqueteBusinessDelegate.getClienteService();
3
4
try {
servicioCliente.registraElCliente(cliente);
// lo retornado por el servicio lo asignamos al atributo
de tipo Lista de clientes
cliente.setNombre("");
clientes=
servicioCliente.
listaClientesPorNombre(cliente.getNombre());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return vista;
}
Notas:
1) Se ha definido la variable cliente de tipo ClienteDTO. De
manera automtica, el Framework instancia el objeto y almacena
en l los datos que llegan desde la pgina nuevoCliente.jsp.
Note que en la pgina nuevoCliente.jsp todos los campos llevan
como prefijo en el nombre la palabra cliente, la cual hace
referencia a la variable definida en ClienteAction.
2) El objeto servicioCliente es un componente de la lgica de
negocio y expone las operaciones que puede realizar la clase
ClienteAction.
3) Note que el mtodo registraCliente recibe como parmetro el
objeto cliente. Dentro de l, deben existir los campos necesarios
para poder gestionar la imagen del cliente seleccionada en la
pgina nuevoCliente.jsp
4) Una vez registrado el nuevo cliente se blanquea el atributo
nombre del objeto cliente y se invoca la funcionalidad de listado
antes de retornar a la vista respectiva.
CARRERAS PROFESIONALES
CIBERTEC
f)
35
String nombre;
Date fecnac;
String sexo;
double sueldo;
String usuario;
String clave;
. . .
Notas:
1) Dado que en la pgina nuevoCliente.jsp se ha definido un
campo tipo file con el nombre cliente.foto, es necesario
definirlo en la clase ClienteDTO, de modo que se pueda
recepcionar la imagen enviada desde el formulario.
2) Es necesario, tambin, por requerimiento del Framework,
definir los campos fotoContentType y fotoFileName.
Ambos se cargarn de manera automtica y
proporcionarn importante informacin relacionada con la
variable foto.
Adicionalmente, se define la variable isFoto de tipo
InputStream, debido a que sta ser utilizada por el
componente MySqlClienteDAO en el registro de la
imagen en la tabla tbcliente.
CIBERTEC
CARRERAS PROFESIONALES
36
if(objCliente.getFoto()!=null){
InputStream tempo =
new FileInputStream(objCliente.getFoto());
objCliente.setIsFoto(tempo);
}
return objClienteDAO.registraCliente(objCliente);
}
Notas:
CARRERAS PROFESIONALES
CIBERTEC
37
// ejecutamos la sentencia
resultado = pst.executeUpdate();
cn.close();
return resultado;
}
Notas:
1) Recuerde que para insertar una fecha en base de datos
debe convertir las fechas de tipo java.util.Date al tipo
java.sql.Date.
CIBERTEC
CARRERAS PROFESIONALES
38
pst.setBinaryStream(7, null,0);
Sin embargo, si el valor del atributo es diferente de null,
registra la imagen, tomando como base al atributo de tipo
InputStream isFoto:
pst.setBinaryStream(7,
objCliente.getIsFoto(),
objCliente.getIsFoto().available());
CARRERAS PROFESIONALES
CIBERTEC
i)
39
CIBERTEC
CARRERAS PROFESIONALES
40
CARRERAS PROFESIONALES
CIBERTEC
41
CIBERTEC
CARRERAS PROFESIONALES
42
Notas:
1) Al hacer clic sobre la lupa, visualizar en una nueva ventana
la imagen registrada en la tabla tbcliente.
j)
Paso 10:
Bien!, ha culminado la funcionalidad registra imagen
exitosamente.
CARRERAS PROFESIONALES
CIBERTEC
43
CIBERTEC
CARRERAS PROFESIONALES
44
del cdigo fuente. Despus de los cambios aplicados, ste debe de ser
recopilado. Imagine hacer eso cada vez para una nueva localizacin
soportada.
De acuerdo con Richard Gillam, miembro del Grupo de Tecnologa
Unicote (autor del diseo de muchas de las libreras Java para soporte
I18N), los usuarios esperarn que los productos que utilizan trabajen para
ellos en su lenguaje nativo. Se pueden obtener experiencias negativas si
los usuarios no estn satisfechos cuando las asunciones que se realizan
son incorrectas. Se debe iniciar planificando, en forma temprana, el
soporte para I18N en las aplicaciones.
a) Paso
1:
Importar
el
proyecto
FuncionalidadRegistraImagenI18N_Inicial.war
web
Notas:
1) Note que, dentro del proyecto, cuenta con el paquete
aprendamos.java.recursos y dentro de l cuenta con tres
archivos de recursos (archivos .properties) que soportan los
CARRERAS PROFESIONALES
CIBERTEC
45
CIBERTEC
CARRERAS PROFESIONALES
46
CARRERAS PROFESIONALES
CIBERTEC
47
Notas:
1) El archivo de recursos por defecto es aquel que no tiene
cdigo ISO asociado a un idioma en particular. Cuando se
seleccione en la aplicacin web un idioma que no haya sido
configurado
en
ningn
archivo
de
recursos,
automticamente, struts 2 recupera las keys del archivo de
recursos por defecto.
Notas:
1) Struts 2 soporta cuenta con un parmetro especial llamado
request_locale. Cuando se utiliza ste, de manera
automtica, se configura sul valor como el idioma actual de la
aplicacin web.
2) Es recomendable utilizar variables al referenciar cualquier
recurso dentro de una aplicacin web. En el ejemplo, en
CIBERTEC
CARRERAS PROFESIONALES
48
${pageContext.request.contextPath}
. . .
<package name="default" namespace="/" extends="strutsdefault">
1
<action name="a_bienvenida"
>
<result > /bienvenida.jsp </result>
</action>
<action name="a_logueo"
>
<result > /logueo.jsp
</action>
1
</result>
. . .
Notas:
1) Note que el action a_bienvenida es solo un action de atajo
que invoca automticamente a la pgina bienvenida.jsp. Se
puede crear dentro de la aplicacin mltiples actions de atajo
para invocar a travs de links a las pginas JSP.
CARRERAS PROFESIONALES
CIBERTEC
49
. . .
<tr>
<td class="control" >
<s:a action="a_bienvenida"
>
1
>
Notas:
1) Debe usar la etiqueta <s:text> para referenciar a las keys del
archivo de recursos. Es importante recordar que para utilizar
las etiquetas de struts 2 se debe referenciar la librera,
utilizando la siguiente directiva:
<%@ taglib prefix="s" uri="/struts-tags" %>
CIBERTEC
CARRERAS PROFESIONALES
50
. . .
CARRERAS PROFESIONALES
CIBERTEC
f)
51
CIBERTEC
CARRERAS PROFESIONALES
52
CARRERAS PROFESIONALES
CIBERTEC
53
g) Paso 7:
Bien!, ha culminado la funcionalidad registra
imagen con I18n exitosamente.
CIBERTEC
CARRERAS PROFESIONALES
54
a) Paso
1:
Importar
el
proyecto
FuncionalidadRegistraImagenPool_Inicial.war
CARRERAS PROFESIONALES
web
CIBERTEC
55
Notas:
1) Observe que, dentro del proyecto, cuenta en la carpeta
META-INF con el archivo context.xml. En l, se debe crear la
configuracin del pool de conexiones que utilizar para acceder
a una base de datos.
CIBERTEC
CARRERAS PROFESIONALES
56
<Context path="/jee-web"
>
1
2
</Context>
Notas:
1) jdbc/sisepuede es el nombre del pool de conexiones que
utilizar para referenciar a la base de datos.
2) El nmero mximo de conexiones activas es 100 en el
ejemplo. Este valor debe ser calculado para cada aplicacin
web sobre la base de la experiencia y el trfico que
normalmente se soporte. En algunos casos, se tendr la
necesidad de incrementar o redecir este valor por defecto.
3) El mximo tiempo de espera, 10000, est expresado en
milisegundos. En este ejemplo, se esperar, como mximo,
10 segundos para obtener una conexin disponible (de las
100 existentes). De no conseguirla, se producira un error.
CARRERAS PROFESIONALES
CIBERTEC
57
package aprendamos.java.util;
// Esta clase nos retornara una conexion a base de datos
import java.sql.*;
import javax.naming.*;
import javax.sql.*;
1
2
Notas:
3) Debe importar el paquete javax.naming.*, ya que en l se
encuentran las clases para utilizar JNDI y acceder al pool de
conexiones.
4) Debe importar el pauete javax.sql.* debido a que dentro de l
se encuentra la clase DataSource. sta representa un pool
de conexiones en java.
CIBERTEC
CARRERAS PROFESIONALES
58
. . .
public static Connection obtenerConexion(){
// 1. Para referenciar al pool creamos un contexto JNDI
// Java Naming and Directory Interface
Connection cn=null;
try {
// creamos el contexto JNDI Inicial, JDNI valida los nombres , utiliza
la infor de META INF para hacer un pool de conexiones., JNDI maneja
nombres y objetos
Context ctx = new InitialContext();
// ahora vamos a ubicar un nombre dentro
// de este contexto, para ello usamos el
// famoso metodo lookup.
//Base standar JND
String raizContexto ="java:comp/env/";
(DataSource)ctx.lookup(raizContexto+"jdbc/sisepuede");
// le pedimos al pool que nos de una conexion
cn = ds.getConnection();
System.out.println(
"Mision cumplida, hemos obtenido la conexion del
pool");
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return cn;
}
Notas:
1) El nombre del contexto JNDI por default es java:comp/env.
Todas las denominaciones de objetos JNDI (como nuestro pool),
se crean debajo de este nombre raz. Por lo tanto, para
referenciar al pool, se pasar primero por el nombre raz.
2) A travs del mtodo lookup y utilizando el nombre raz del
contexto, se referencia al pool de conexiones: jdbc/sisepuede.
CARRERAS PROFESIONALES
CIBERTEC
59
Notas:
1) Este paso es necesario debido a que es el servidor Tomcat y
no la aplicacin web, quien solicita al servidor de base de datos
las conexiones (en el ejemplo cien), que sern almacenadas en
la memoria del servidor y que juntas constituyen el pool de
conexiones.
CIBERTEC
CARRERAS PROFESIONALES
60
CARRERAS PROFESIONALES
CIBERTEC
61
CIBERTEC
CARRERAS PROFESIONALES
62
f)
CARRERAS PROFESIONALES
Paso 6:
Bien!, ha culminado la funcionalidad registra
imagen pool exitosamente.
CIBERTEC
63
CIBERTEC
CARRERAS PROFESIONALES
64
Notas:
1) Debe modificar la pgina listado.jsp para agregar un enlace
que permita visualizar los datos de un cliente en particular.
. . .
1
href="${carga}" >
M </a>
</td>
. . .
CARRERAS PROFESIONALES
CIBERTEC
65
Notas:
1) Utilizando la etiqueta <s:url > defina un enlace que permitir
invocar al alias cargaModificaCliente. Adicionalmente, determine
el parmetro usuario utilizando la etiqueta <s:param>. Su valor
es asignado usando el siguiente expression language (EL):
${elcli.usuario}
CIBERTEC
CARRERAS PROFESIONALES
66
<action name="cargaModificaCliente"
class="aprendamos.java.action.ClienteAction"
method="cargaModifica" >
Notas:
1) El alias cargaModificaCliente fue referenciado en el enlace
definido para modificar (M) de la pgina listado.jsp. Note que al
invocar este alias se ejecutar dentro de la clase ClienteAction el
mtodo cargaModifica.
package aprendamos.java.action;
import java.util.List;
import aprendamos.java.bean.ClienteDTO;
import aprendamos.java.service.ClienteService_I;
import aprendamos.java.service.PaqueteBusinessDelegate;
...
CARRERAS PROFESIONALES
CIBERTEC
67
...
public String cargaModifica(){
String vista="exito";
try {
cliente=
servicioCliente.buscaClientePorUsuario(
this.getUsuario());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return vista;
...
Notas:
1) Se ha definido la variable usuario de tipo String. Se definen
tambin
los
mtodos
setUsuario()
y
getUsuario(),
respectivamente.
De manera automtica, el Framework instancia el objeto y
almacena en ste el parmetro usuario, que llega desde la
pgina listado.jsp. .
2) Note que el mtodo buscaClientePorUsuario recibe como
parmetro la variable usuario y retorna un objeto de tipo
ClienteDTO que es asignada a la variable cliente.
3) Luego, se retorna a la vista respectiva, es decir, se invocar a
la pgina modificaCliente.jsp
CIBERTEC
CARRERAS PROFESIONALES
68
Connection cn = MySqlDBConn.obtenerConexion();
//definimos la sentencia
String sql="select
usuario,clave,nombre,sueldo,sexo,fecnac,foto " + " " +
"from tbcliente where usuario = ?";
//la preparamos
PreparedStatement pst=cn.prepareStatement(sql);
//asignamos valores a las interrogantes
pst.setString(1,usuario);
//ejecutamos
ResultSet rs=pst.executeQuery();
//si hay datos, recuperamos un regsitro
if(rs.next()){
objClienteDTO = new ClienteDTO();
objClienteDTO.setUsuario(rs.getString(1));
objClienteDTO.setClave(rs.getString(2));
objClienteDTO.setNombre(rs.getString(3));
objClienteDTO.setSueldo(rs.getDouble(4));
objClienteDTO.setSexo(rs.getString(5));
objClienteDTO.setFecnac(rs.getDate(6));
objClienteDTO.setIsFoto(rs.getBinaryStream(7));
}
cn.close();
return objClienteDTO;
}
Notas:
1) Note que se obtiene el campo de tipo longblob foto.
2) El campo foto es asignado al atributo isFoto del objeto
objClienteDTO. Este atributo es de tipo InputStream, por
ello, debe ser recuperado con el mtodo getBinaryStream
del objeto ResultSet rs: rs.getBinaryStream(7)
CARRERAS PROFESIONALES
CIBERTEC
f)
69
Notas:
1) Enlace para visualizar los datos del cliente y, opcionalmente,
modificarlos.
CIBERTEC
CARRERAS PROFESIONALES
70
g) Paso 7:
Bien!, ha culminado la primera parte de la
funcionalidad carga imagen
CARRERAS PROFESIONALES
CIBERTEC
71
. . .
<tr class="control" >
<td> Fotografa: </td>
<td> <s:file
name="cliente.foto"
/>
<td>
<img
alt="Fotografia del Cliente:) "
</td>
src="cargaImagenCliente?usuario=${cliente.usuario}" />
</td>
</tr>
. . .
Notas:
1) Note cmo en el atributo src de la etiqueta <img> se hace
referencia al alias cargaImagenCliente. Se enva adicionalmente
el parmetro usuario con el valor ${cliente.usuario}.
CIBERTEC
CARRERAS PROFESIONALES
72
i)
<action name="cargaImagenCliente"
class="aprendamos.java.action.ImagenAction"
method="recuperaImagenCliente" >
<result name="exito" type="stream" >
</result>
</action>
Notas:
1) El alias cargaImagenCliente fue referenciado en la etiqueta
<img> de la pgina modificaCliente.jsp. Note que al invocarlo se
ejecutar dentro de la clase ImagenAction el mtodo
recuperaImagenCliente.
2) Se utiliza un nuevo tipo de result: stream. A travs de l, la
etiqueta <img> de la pgina modificaCliente.jsp visualizar la
imagen a partir de un campo de tipo InputStream.
CARRERAS PROFESIONALES
CIBERTEC
j)
73
package aprendamos.java.action;
import java.io.*;
import aprendamos.java.bean.ClienteDTO;
import aprendamos.java.service.ClienteService_I;
import aprendamos.java.service.PaqueteBusinessDelegate;
public class ImagenAction {
String usuario;
InputStream imagenClienteRecuperada;
...
...
public String recuperaImagenCliente(){
String vista="exito";
try {
ClienteDTO cli=
servicioCliente.buscaClientePorUsuario(usuario);
// del objeto cli solo nos importa la foto como InputStream
// recuperamos ese atributo y lo asignamos al campo
// imagenClienteRecuperada
this.imagenClienteRecuperada = cli.getIsFoto();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return vista;
}
...
CIBERTEC
CARRERAS PROFESIONALES
74
Notas:
1) Se ha definido la variable imagenClienteRecuperada de tipo
InputStream. sta es referenciada en el archivo struts.xml, en el
registro del action ImagenAction.
2) El mtodo buscaClientePorUsuario retorna un objeto de tipo
ClienteDTO que es asignado a la variable cli.
3) Se invoca el mtodo getIsFoto() de la variable cli para obtener
la imagen recuperada de base de datos y asignarla a la
imagenClienteRecuperada.
Notas:
1) Enlace para visualizar los datos del cliente y, opcionalmente,
modificarlos.
CARRERAS PROFESIONALES
CIBERTEC
75
l)
CIBERTEC
Paso 12:
Muy Bien!, ha culminado exitosamente la
funcionalidad completa carga imagen.
CARRERAS PROFESIONALES
76
CARRERAS PROFESIONALES
CIBERTEC
77
Notas:
1) En general, las pginas JSP de la aplicacin se encontrarn
dentro de carpetas especficas. En este ejemplo, se cuenta
con dos tipos:
CIBERTEC
CARRERAS PROFESIONALES
78
...
Notas:
1) Debe agregar el listener de Tiles para struts 2.
CARRERAS PROFESIONALES
CIBERTEC
79
1
name="menu" value="/paginas/menu.jsp" />
name="pie" value="/paginas/pie.jsp" />
name="cabecera" value="/paginas/cabecera.jsp" />
name="body" value="/paginas/bienvenida.jsp" />
</definition>
<definition name="d_listado" extends="d_bienvenida">
<put-attribute name="body" value="/paginas/listado.jsp" />
</definition>
<definition name="d_nuevoCliente" extends="d_bienvenida">
<put-attribute name="body" value="/paginas/nuevoCliente.jsp" />
</definition>
...
Notas:
1) Debe crear definiciones de Tiles. sta determina qu
componentes (JSPs normalmente) se despliegan sobre
una plantilla en particular. En el ejemplo, el definition
d_bienvenida referencia a la plantilla diseno01.jsp,
2) Un definition puede ser heredado. De esta manera, solo
es necesario sobre escribir los puts que queramos
modificar. En el ejemplo, el definition d_listado hereda del
definition d_bienvenida.
3) Note que los puts dentro de los definitions estn
referenciando a pginas JSP dentro de la carpeta
pginas. sta debe existir y ah deben encontrarse las
pginas referenciadas.
CIBERTEC
CARRERAS PROFESIONALES
80
...
<struts>
<constant name="struts.enable.DynamicMethodInvocation"
value="false" />
<constant name="struts.devMode" value="false" />
<package name="default" namespace="/" extends="tiles-default">
<!-- creamos un action de atajo -->
<action name="a_nuevoCliente"
>
<result type="tiles"> d_nuevoCliente
</action>
</result>
2
<action name="a_bienvenida"
>
<result type="tiles"> d_bienvenida
</action>
</result>
3
<action name="a_logueo"
>
<result > /logueo.jsp
</action>
</result>
<action name="a_listado"
>
<result type="tiles"> d_listado
</action>
</result>
</result>
</action>
...
Notas:
1) Para trabajar con Tiles y struts 2, es obligatorio heredar
del paquete tiles-default.
2) Cada <result> de un action, ya no invoca directamente a
una pgina JSP, sino, ms bien, a un definition de tiles.
3) Para que un <result> pueda invocar a un definition de
tiles es necesario indicar en su atributo type el valor tiles.
CARRERAS PROFESIONALES
CIBERTEC
81
Notas:
1) El archivo debe ser creado tal como se referenci en el
archivo tiles.xml, es decir, dentro de una carpeta llada
plantillas.
CIBERTEC
CARRERAS PROFESIONALES
82
f)
name="cabecera"
/></td>
/></td>
name="pie" /></td>
</body>
...
Notas:
1) Para poder utilizar las etiquetas de tiles dentro de la
pgina JSP, es necesario referenciar a la librera de
etiquetas tags-tiles.
2) Note cmo se ha creado una tabla con filas y columnas,
dentro de las cuales, haciendo uso de la etiqueta
<tiles:insertAttribute>, se insertan los diferentes puts
definidos en el archivo tiles.xml.
CARRERAS PROFESIONALES
CIBERTEC
83
Notas:
1) Tal como se indic en el archivo tiles.xml, las pginas JSP
deben estar dentro de una carpeta denominada pginas.
CIBERTEC
CARRERAS PROFESIONALES
84
<table>
<tr>
<td colspan="2" align="center" >
<!-- aqui va la cabecera -->
<jsp:include page="cabecera.jsp"
/>
</td>
</tr>
<tr>
<td >
<!-- aqui va el menu -->
<jsp:include page="menu.jsp"
/>
</td>
<!-- aqui va el cuerpo -->
<td >
...
Notas:
1) Dado que ahora se trabajar con Tiles, ya no es necesario
tener directivas include dentro de los JSPs.
Importante: De dejarlas, se duplicara la implementacin del
patrn de diseo Composite View.
CARRERAS PROFESIONALES
CIBERTEC
i)
85
CIBERTEC
CARRERAS PROFESIONALES
86
j)
CARRERAS PROFESIONALES
Paso 10:
Bien!, ha culminado
Mantenimiento con Tiles exitosamente.
la
funcionalidad
CIBERTEC
87
Resumen
Las etiquetas de struts 2 se encuentran agrupadas dentro de una sola librera:
<%@ taglib prefix="s" uri="/struts-tags" %>
CIBERTEC
CARRERAS PROFESIONALES
88
CARRERAS PROFESIONALES
CIBERTEC
89
UNIDAD DE
APRENDIZAJE
TEMARIO
2.1 Tema 3 : Introduccin a IBATIS
2.1.1.
: IBATIS Introduccin
2.1.2.
2.2.2.
ACTIVIDADES PROPUESTAS
CIBERTEC
Los alumnos implementan una aplicacin web bsica, utilizando las principales
caractersticas del framework MVC Struts 2 y el framework IBATIS.
CARRERAS PROFESIONALES
90
El marco de trabajo SQL Maps es muy tolerante, tanto con las malas
implementaciones de los modelos de datos como con los modelos de
objetos.
CARRERAS PROFESIONALES
CIBERTEC
91
Notas:
1) Observe que debe contar con las libreras bsicas de
IBATIS para integrar el framework a su aplicacin web.
CIBERTEC
CARRERAS PROFESIONALES
92
Notas:
1) SqlMapConfig.xml es el archivo de configuracin por
excelencia de IBATIS. En l, se define, por ejemplo, el
pool de conexiones a utilizar y otros archivos XML
(llamados SqlMaps), que sern referenciados en la
aplicacin web.
En el ejemplo, se muestran dos archivos SqlMaps:
Cliente.xml y Producto.xml. (Por cada entidad del modelo
de datos, normalmente se tendr un SqlMap).
CARRERAS PROFESIONALES
CIBERTEC
93
<sqlMapConfig>
<!-- referenciamos a nuestro pool de conexiones, archivo
de confiracion por excelncia de IBatis -->
<transactionManager type="JDBC">
<dataSource type="JNDI">
<property name="DataSource"
value="java:comp/env/nomerindo" />
</dataSource>
</transactionManager>
Notas:
1) A travs de la etiqueta <transactionManager>, se define,
en IBATIS, el pool de conexiones, que se utilizar para
acceder a un origen de datos. En el ejemplo, el pool se
llama: nomerindo.
2) A travs de la etiqueta <sqlMap>, se referencia a los
archivos XML, que contienen las sentencias SQL para
operar sobre las entidades que referencian. En el
ejemplo, se referencian los archivos XML Cliente y
Producto.
CIBERTEC
CARRERAS PROFESIONALES
94
import java.io.Reader;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
// Esta clase retorna un objeto que representa el archivo
// SqlMapConfig.xml. Este es el principal archivo de
// cofiguracion de ibatis
CARRERAS PROFESIONALES
CIBERTEC
95
<result
<result
<result
<result
<result
<result
<result
</resultMap>
class="cli"
id="clienteRes"
>
Notas:
1) A travs de la etiqueta <typeAlias>, es posible crear
diversos alias de clases java para ser usados dentro del
archivo XML.
2) La etiqueta <resultMap> es utilizada cuando los nombres
de las columnas de una tabla no coinciden con los
atributos de la clase que recibir los datos de una
consulta. En el ejemplo, la columna foto es mapeada al
atributo laFoto.
3) A travs de la etiqueta <select>, se puede utilizar SQL
estndar para realizar consultas. Los parmetros simples
que llegan a la consulta son referenciados, utilizando la
sintaxis #value#
CIBERTEC
CARRERAS PROFESIONALES
96
objClienteDTO=(ClienteDTO)sqlMap.queryForObject("ibatis_logueo
", usuario);
2
Notas:
1) A travs de la clase UtilSqlConfig, se crea una instancia
de la clase SqlMapClient. En el ejemplo, el objeto sqlMap
es la representacin en java del archivo SqlMapConfig.
2) Se invoca al mtodo queryForObject del objeto sqlMap.
Se enva como parmetros lo siguiente:
El nombre de la operacin que se desea ejecutar
(definida en el archivo Cliente.xml)
El cdigo de usuario a travs del cual se validar
el logueo.
CARRERAS PROFESIONALES
CIBERTEC
97
CIBERTEC
CARRERAS PROFESIONALES
98
h)
Paso 8:
CARRERAS PROFESIONALES
CIBERTEC
99
Elementos Hijos
id
parameterClass
resultClass
parameterMap
<statement>
resultMap
cacheModel
xmlResultName (Java
only)
insert
update
All dynamic elements delete
All query
methods
Mtodos
<insert>
id
parameterClass
parameterMap
<update>
id
parameterClass
parameterMap
<delete>
id
parameterClass
parameterMap
<select>
id
parameterClass
resultClass
parameterMap
resultMap
cacheModel
id
parameterClass
resultClass
<procedure> parameterMap
resultMap
xmlResultName (Java
only)
insert
update
All dynamic elements delete
All query
methods
CIBERTEC
CARRERAS PROFESIONALES
100
. . .
<resultMap
<result
<result
<result
<result
<result
<result
<result
class="cli"
id="clienteRes"
>
</resultMap>
>
</parameterMap>
Notas:
1) Al utilizar la etiqueta <parameterMap>, se ha creado un
prametro especial llamado clienteMap. ste ser enviado
desde la clase DAO y estar representado por la clase
java.util.Map. Note cmo se identifica cada campo de la clase
Map con el tipo de dato al que se referir en la base de
datos.
CARRERAS PROFESIONALES
CIBERTEC
101
<select id="ibatis_clienteLista"
parameterClass="java.lang.String"
resultClass="cli">
<!-- Para poner wildcards aqui en value seria
'%$value$%'-->
select usuario,clave,nombre,sueldo,sexo,fecnac
from tbcliente where nombre like #value#
</select>
<!-- cuando utilizamos parameterMap o resultMap nuestras
sentencias pueden utilizar las interrogantes de un
prepareStatement tipico -->
<insert id="ibatis_insertaCliente" parameterMap="clienteMap"
insert into tbcliente(nombre,sueldo,sexo,fecnac,
usuario,clave,foto) values (?,?,?,?,?,?,?)
</insert>
...
Notas:
1) Observe cmo la operacin ibatis_insertaCliente recibe
como parmetro clienteMap definido en lneas previas.
Los campos son automticamente asociados a las
interrogantes de la sentencia SQL.
CIBERTEC
CARRERAS PROFESIONALES
>
1
102
map.put("foto", losbytes);
cliente.insert("ibatis_insertaCliente",map);
CARRERAS PROFESIONALES
CIBERTEC
103
return clientes;
}
...
Notas:
1) Se invoca al mtodo queryForList para ejecutar
operaciones que retornen ms de un registro como
resultado. Note que se enva la variable vnombre junto
con los caracteres % a ser utilizados en la consulta
definida en el archivo Cliente.xml (como parte del
parmetro like).
CIBERTEC
CARRERAS PROFESIONALES
104
CARRERAS PROFESIONALES
CIBERTEC
105
CIBERTEC
CARRERAS PROFESIONALES
106
CARRERAS PROFESIONALES
CIBERTEC
107
Se implementan, a
almacenados IBATIS.
continuacin,
ejercicios
con
procedimientos
Paso
1:
Importar
FuncionalidadIbatisProcedure_Inicial.war
el
archivo
CIBERTEC
CARRERAS PROFESIONALES
108
Notas:
1) Cuenta, en esta oportunidad, dentro de la carpeta bd con
archivos adicionales dentro de los cuales destaca
ps_nuevoCliente.sql. Este archivo contiene el stored
procedure que deber crear en mysql.
b) Paso 2: Ejecute el archivo sp_nuevoCliente.sql dentro de
mysql
CARRERAS PROFESIONALES
CIBERTEC
109
Notas:
1) Se recibe como parmetro un campo de tipo BLOB. ste
debe haber sido cargado previamente en la clase
MySqlClienteDAO y reconocido por el archivo Cliente.xml.
CIBERTEC
CARRERAS PROFESIONALES
110
map.put("resultado", 0);
System.out.println("resultado antes de insertar: "
+ map.get("resultado"));
cliente.insert("ibatis_spInsertaCliente", map);
Notas:
1) Se carga en el objeto map un atributo adicional: el campo
resultado. ste permitir recuperar el resultado retornado
por el stored procedure.
2) Se debe invocar a una nueva operacin definida en el
archivo Cliente.xml: ibatis_spInsertaCliente.
3) Se recupera el resultado retornado por el stored
procedure:
En el ejemplo, en caso de ser exitosa la operacin,
retornar el valor 777, de lo contrario regresar a 666.
CARRERAS PROFESIONALES
CIBERTEC
111
>
</parameterMap>
...
<procedure id="ibatis_spInsertaCliente"
parameterMap="clienteMap"
>
call sp_nuevoCliente(?,?,?,?,?,?,?,?)
</procedure>
Notas:
1) Se debe modificar cada una de las etiquetas <parameter>
para indicar, a travs del atributo mode, si el parmetro
es de entrada o entrada/salida.
2) Note cmo el arreglo de bytes cargado con el nombre
foto en el objeto java.util.map es mapeado a una columna
en la tabla de tipo BLOB:
jdbcType=BLOB
3) Note qu resultado es la nica propiedad de tipo INOUT.
A travs de ella, se retornar al MySqlClienteDAO el
resultado de la ejecucin del stored procedure.
4) Debe invocar al stored procedure creado en base de
datos a travs de la sentencia call. Note que usa la
etiqueta IBATIS <prodecure> para definir la operacin
ibatis_spInsertaCliente.
CIBERTEC
CARRERAS PROFESIONALES
112
CARRERAS PROFESIONALES
CIBERTEC
113
Paso 6:
CIBERTEC
CARRERAS PROFESIONALES
114
Notas:
1) Observe
que
debe
ejecutar
los
archivos
sp_modificaCliente.sql y sp_modificaClienteConFoto.sql
CARRERAS PROFESIONALES
CIBERTEC
115
update tbcliente
set nombre=vnombre,
sueldo=vsueldo,
sexo=vsexo,
fecnac=vfecnac,
clave=vclave
where usuario=vusuario;
else
set resultado = 666;
end if;
END $$
...
CIBERTEC
CARRERAS PROFESIONALES
116
END $$
...
CARRERAS PROFESIONALES
CIBERTEC
117
Notas:
1) La sentencia update no considera en su ejecucin la
actualizacin de la columna foto. Este procedure ser
invocado cuando el usuario del sistema no desee
actualizar la fotografa del cliente.
CIBERTEC
CARRERAS PROFESIONALES
118
if (objCliente.getFoto() != null)
CARRERAS PROFESIONALES
CIBERTEC
119
2) Se
invocar
a
una
nueva
operacin:
ibatis_spModificaClienteConFoto o ibatis_spModificaCliente.
</parameterMap>
<parameterMap class="java.util.Map" id="clienteMap" >
<parameter property="nombre" jdbcType="VARCHAR" mode="IN" />
<parameter property="sueldo" jdbcType="DOUBLE" mode="IN" />
<parameter property="sexo" jdbcType="CHAR" mode="IN" />
<parameter property="fecnac" jdbcType="DATETIME" mode="IN" />
<parameter property="usuario" jdbcType="VARCHAR" mode="IN" />
<parameter property="clave" jdbcType="VARCHAR" mode="IN" />
<parameter property="foto" jdbcType="BLOB" mode="IN" />
<parameter property="resultado" jdbcType="INT" mode="INOUT" />
</parameterMap>
...
<procedure id="ibatis_spModificaClienteConFoto"
parameterMap="clienteMap"
>
call sp_modificaClienteConFoto(?,?,?,?,?,?,?,?)
</procedure>
<procedure id="ibatis_spModificaCliente"
parameterMap="clienteMapBasico"
>
call sp_modificaCliente(?,?,?,?,?,?,?)
</procedure>
Notas:
1) Se ha creado un nuevo parameterMap: clienteMapBasico,
que ser utilizado para actualizar la informacin del cliente
sin modificar su fotografa.
CIBERTEC
CARRERAS PROFESIONALES
120
CARRERAS PROFESIONALES
CIBERTEC
121
Nota:
1) Puede seleccionar nuevamente el enlace M para
verificar los cambios realizados.
Visualizar que se logr modificar exitosamente la fotografa
de Don Ramn.
CIBERTEC
CARRERAS PROFESIONALES
122
f)
Paso
6:
Muy
Bien!,
ha
funcionalidad Actualizacin
culminado
exitosamente
la
Procedures e IBATIS.
CARRERAS PROFESIONALES
CIBERTEC
123
Resumen
Para recoger un conjunto de elementos con la clase List, puede hacer lo
siguiente:
List<Coche> coches = sqlMap.queryForList("getCoches", null)
Para recoger un conjunto de elementos con la clase Map, puede hacer lo
siguiente:
Map hashCoche = (Map) sqlMap.queryForObject("getHashCoche", 3);
<resultMap class=
<result
<result
<result
<result
/>
</ resultMap>
CIBERTEC
CARRERAS PROFESIONALES
124
CARRERAS PROFESIONALES
CIBERTEC
125
UNIDAD DE
APRENDIZAJE
TEMARIO
3.1 Tema 5
3.1.1.
3.2 Tema 6
: Struts 2 y JasperReport
3.2.1.
ACTIVIDADES PROPUESTAS
CIBERTEC
Los alumnos implementan una aplicacin web bsica utilizando las principales
caractersticas del framework MVC Struts 2 y la librera jasperReport.
CARRERAS PROFESIONALES
126
CARRERAS PROFESIONALES
CIBERTEC
127
CIBERTEC
CARRERAS PROFESIONALES
128
Notas:
1) Existe un nuevo archivo en la carpeta bd denominado
FacilitoBaseDatosv2.sql. En l, se encontrarn nuevas
tablas, a partir de las cuales se generar el reporte.
2) Existen nuevas libreras en la carpeta lib que permitirn
integrar Struts 2 y JasperReport.
CARRERAS PROFESIONALES
CIBERTEC
129
Notas:
1) Debe crear las tablas cliente y pas en MySql. Sobre la base
de estas tablas, se generar el nuevo reporte.
b) Paso 3: Modificar el archivo struts.xml
CIBERTEC
CARRERAS PROFESIONALES
130
. . .
<result-types>
<result-type name="jasper"
class="org.apache.struts2.views.jasperreports.JasperReportsR
esult"/>
</result-types>
2
. . .
<action name="reporteFacilito"
class="aprendamos.java.action.ReporteAction"
method="listaClientesPorPais" >
<result
name="exito" type="jasper">
<param
name="location">/reportes/reporte01.jasper</param>
<param
name="dataSource">listaClientes</param>
<param name="contentDisposition">
attachment;filename="contacts.pdf"
</param>
<param name="format">PDF</param>
<!--<param name="connection">cnListaClientes</param> ->
d_reporte
</result>
Notas:
1) Debe crear un nuevo result type para poder integrar
jasperReport y Struts 2.
2) Cree el action a_reporte para invocar a un nuevo
definition: d_reporte. ste invocar a una pgina JSP
para generar el reporte, usando JasperReport.
3) Cree un nuevo action: reporteFacilito. Este componente
define un <result> de tipo jasper en donde se configuran
los principales parmetros del reporte como por ejemplo:
CARRERAS PROFESIONALES
.jasper
el
listado
CIBERTEC
131
Notas:
1) Cree el definition d_reporte. Se invocar al JSP reportes.jsp
...
Notas:
1) Debe invocar al action reporteFacilito, el cual ya ha sido
registrado en el archivo struts.xm. Asimismo, debe
generar el listado con jasperreport.
f) Paso 6: Cree el action ReporteAction
CIBERTEC
CARRERAS PROFESIONALES
132
CARRERAS PROFESIONALES
CIBERTEC
133
Notas:
1) Debe crear el mtodo listaClientesReporte para que la clase
ReporteAction pueda invocarlo y generar el reporte.
CIBERTEC
CARRERAS PROFESIONALES
134
Connection cn = MySqlDBConn.obtenerConexion();
//definimos la sentencia
String sql="SELECT
usuario,password,nombres,apellidos,sexo,fecha_nacimiento,dni,
c.cod_pais,p.nom_pais" +
" FROM cliente c,pais p WHERE c.nombres like
and c.cod_pais = p.cod_pais order by c.cod_pais";
//la preparamos
PreparedStatement pst=cn.prepareStatement(sql);
//asignamos valores a las interrogantes
pst.setString(1,"%"+nombre+"%");
//ejecutamos
ResultSet rs=pst.executeQuery();
while(rs.next()){
//hay dayos, recuperamos un ergsitro
ReporteDTO
cliente = new ReporteDTO();
cliente.setUsuario(rs.getString(1));
cliente.setPassword(rs.getString(2));
cliente.setNombres(rs.getString(3));
cliente.setApellidos(rs.getString(4));
cliente.setSexo(rs.getString(5));
cliente.setFecha_nacimiento(rs.getString(6));
cliente.setDni(rs.getString(7));
cliente.setCod_pais(rs.getString(8));
cliente.setNom_pais(rs.getString(9));
clientes.add(cliente);
}
cn.close();
return clientes;
}
...
Notas:
1) Note cmo, de manera clsica, se obtiene una conexin
para hacer la consulta respectiva. Debe transformar este
cdigo a su equivalente en ibatis.
i) Paso 9: Modifique el archivo menu.jsp
CARRERAS PROFESIONALES
CIBERTEC
135
<tr>
<td class="control" >
<s:a action="a_reporte"
>
<s:text name="menu.reporte"
/>
</s:a>
</td>
</tr>
...
Notas:
1) Debe invocar al action a_reporte para cargar la pgina JSP a
partir de la cual se generar el reporte.
i)
CIBERTEC
CARRERAS PROFESIONALES
136
CARRERAS PROFESIONALES
CIBERTEC
j)
Paso 11:
137
CIBERTEC
CARRERAS PROFESIONALES
138
Resumen
Se pueden construir reportes visualmente en Java, utilizando la herramienta
iReport. sta usa como estructura base jasperReport, un lenguaje basado en
etiquetas xml y especialmente creado para generar reportes.
IReport genera archivos fuente con extensin .jrxml. Los archivos compilados
tienen extensin .jasper y pueden ser ejecutados desde una aplicacin java web.
Si desea saber ms acerca de estos temas, puede consultar la siguiente pgina.
http://jasperforge.org/website/ireportwebsite/IR%20Website/iReport_documentati
on.html?group_id=243&header=project&leftnav=yes&target=ireport
CARRERAS PROFESIONALES
CIBERTEC
139
ANEXOS
CIBERTEC
Java JDK
Entorno integrado de desarrollo o IDE
Servidor de Aplicaciones
Base de datos
Framework Struts 2
Framework MyIbatis
MyIbatis Generator
CARRERAS PROFESIONALES
140
Para entornos de programacin, se requiere el JDK, pero para los de produccin basta
con el JRE.
Por ltimo, ejecute el instalador y siga los pasos indicados en el wizard.
CARRERAS PROFESIONALES
CIBERTEC
141
Eclipse IDE:
Primero, descargue Eclipse Helios desde la pgina de la fundacin Eclipse (
http://www.eclipse.org ). Luego, busque la zona de descarga. Por ltimo, seleccione la
versin Java EE:
CIBERTEC
CARRERAS PROFESIONALES
142
CARRERAS PROFESIONALES
CIBERTEC
143
CIBERTEC
CARRERAS PROFESIONALES
144
CARRERAS PROFESIONALES
CIBERTEC
145
CIBERTEC
CARRERAS PROFESIONALES
146
De igual forma, seleccionar el .ZIP ( que sea del tipo No Install ) y extraerlo en alguna
carpeta de la PC.
CARRERAS PROFESIONALES
CIBERTEC
147
Se debe escoger una de las opciones de los archivos .ZIP. Con la alternativa de Full
Distribution, es ms que suficiente.
CIBERTEC
CARRERAS PROFESIONALES
148
CARRERAS PROFESIONALES
CIBERTEC
149
CIBERTEC
CARRERAS PROFESIONALES
150
CARRERAS PROFESIONALES
CIBERTEC
151
ANEXOS
CIBERTEC
CARRERAS PROFESIONALES
152
La Clase entidad
CARRERAS PROFESIONALES
CIBERTEC
153
CIBERTEC
CARRERAS PROFESIONALES
154
CARRERAS PROFESIONALES
CIBERTEC
CIBERTEC
155
Se configura
Se configura
Se configura
CARRERAS PROFESIONALES
156
CARRERAS PROFESIONALES
CIBERTEC
157
ANEXOS
ANEXO 3: MYIBATIS
DynamicSQL
Una de las caractersticas ms potentes de MyBatis siempre ha sido su capacidad de
SQL
dinmico.
MyBatis, sin duda, mejora la situacin en el lenguaje SQL, que se pueden utilizar
dentro de cualquier mapa instruccinSQL. Los elementos de SQL dinmico debe ser
familiar para cualquiera que haya usado JSTL o cualquier XML, similares a base
procesadores de texto. En versiones anteriores de MyBatis, haba una gran cantidad
de elementos para conocer y comprender. M
ejora en gran medida en esto y ahora hay menos de la mitad de esos elementos para
trabajar. Asimismo, emplea potentes expresiones OGNL base para eliminar la
mayora de los dems elementos.
If
choose (when, otherwise)
trim (where, set)
foreach
Ejemplo de if:
<select id=findActiveBlogWithTitleLike
parameterType=Blog resultType=Blog>
SELECT * FROM BLOG
WHERE state = ACTIVE
<if test=title != null>
AND title like #{title}
</if>
</select>
<select id=findActiveBlogLike
parameterType=Blog resultType=Blog>
SELECT * FROM BLOG WHERE state = ACTIVE
<if test=title != null>
AND title like #{title}
</if>
<if test=author != null and author.name != null>
AND title like #{author.name}
</if>
</select>
CIBERTEC
CARRERAS PROFESIONALES
158
Foreach
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
CARRERAS PROFESIONALES
CIBERTEC
159
ANEXOS
Configuracin:
Settings
Ibatis 2.0:
MyIbatis 3.0:
<settings>
<setting name="x" value="y"/>
<setting name="foo" value="bar"/>
</settings>
CIBERTEC
CARRERAS PROFESIONALES
160
<settings useStatementNamespaces="true"/>
<typeAlias>
<typeAlias> deberia ser movido fuera de <sqlMap> hacia
<configuration>
<typeAliases></typeAliases>
</configuration>
<configuration>
<settings>
...
</settings>
<typeAliases>
<typeAlias ... />
</typeAliases>
</configuration>
<transactionManager> <dataSource>
Ibatis 2.0:
MyIbatis 3.0:
<environments default="env">
<environment id="env">
<transactionManager type="JDBC">
<property name="commitRequired" value="false"/>
</transactionManager>
<dataSource type="your.package.CustomDataSourceFactory" />
</environment>
</environments>
<sqlMap>
CARRERAS PROFESIONALES
CIBERTEC
161
Ibatis 2.0:
MyIbatis 3.0:
<mappers>
<mapper resource=... />
</mappers>
Mapping
Ibatis 2.0:
MyIbatis 3.0:
CIBERTEC
CARRERAS PROFESIONALES
162
Nested resultMaps
debera especificarse mediante <association> tag.
Ibatis 2.0:
<resultMap ...>
<result property="client" resultMap="Client.clientRM"/>
...
</resultMap>
MyIbatis 3.0:
<resultMap ...>
<association property="client" resultMap="Client.clientRM"/>
...
</resultMap>
Inline parameters
Ibatis 2.0:
#value#
MyIbatis 3.0:
#{value}
jdbcType changes
Ibatis 2.0:
jdbcType="ORACLECURSOR"
MyIbatis 3.0:
jdbcType="CURSOR"
CARRERAS PROFESIONALES
CIBERTEC
163
Ibatis 2.0:
jdbcType="NUMBER"
MyIbatis 3.0:
jdbcType="NUMERIC"
Stored procedures
Ibatis 2.0:
MyIbatis 3.0:
Caching
Ibatis 2.0:
MyIbatis 3.0:
CIBERTEC
CARRERAS PROFESIONALES
164
Dynamic SQL
Ibatis 2.0:
<isNotNull.*?property=\"(.*?)\">
</isNotNull>
MyIbatis 3.0:
CARRERAS PROFESIONALES
CIBERTEC