Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Sofware basado en
Frameworks
2
NDICE Pgina
Presentacin 5
Red de contenidos 6
Unidad de aprendizaje 1: Modelo Vista Controlador Patrn MVC
1.1 Tema 1 : Fundamentos de Struts 2 9
1.1.1. : Arquitectura y Configuracin de aplicaciones 9
1.1.2. : La clase Action 13
1.1.3. : Libreras de etiquetas de Struts 2 29
1.1.4. : Internacionalizacin I18N 51
1.2 Tema 2 : Acceso optimizado a base de datos y otras 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
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
4
Anexo 1 157
Anexo 2 167
Anexo 3 172
PRESENTACIN
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
6
RED DE CONTENIDOS
UNIDAD DE
APRENDIZAJE
TEMARIO
ACTIVIDADES PROPUESTAS
La capa Model en Struts 2 inicia con los componentes Action. Debajo de stos, se
tendrn diversos componentes:
Figura 1.1
Notas:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
10
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 1
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
Notas:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
12
Notas:
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Notas:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
14
package aprendamos.java.action;
<action name="logueo"
class="aprendamos.java.action.LogueoAction" >
Notas:
Notas:
versin 1
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
16
//ejecutamos
ResultSet rs=pst.executeQuery();
@Override
public ClienteDAO getClienteDAO() {
// TODO Auto-generated method stub
return new MySqlClienteDAO();
}
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
18
Notas:
return objClienteDAO.buscaPorUsuario(cliente.getUsuario());
Notas:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
20
private PaqueteBusinessDelegate() {
// TODO Auto-generated constructor stub
}
public static LogueoService_I getLogueoService(){
return new LogueoService();
}
Notas:
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())){
}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;
}
</tr>
</tr>
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
24
struts.custom.i18n.resources=aprendamos.java.recursos.MisRecursos
struts.ui.theme=simple
struts.action.extension=action,,dudu
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"))
;
. . .
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
26
<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>
<tr>
<td class="error general">
${requestScope.mensaje}
</td>
</tr>
<tr>
<td >
<fmt:message key="logueo.imagen" />
</td>
</tr>
</table>
</s:form>
ClienteDTO usuarioCandidato=
new ClienteDTO();
usuarioCandidato.setUsuario(this.getCliente().getUsuario());
ClienteDTO objUsuario=null;
try { 2
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())){
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
30
Notas:
Notas:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
32
s:form
< action="ingresaCliente" 1
method="post" 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>
. . .
. . .
Notas:
<action name="ingresaCliente" 1
class="aprendamos.java.action.ClienteAction" method="registra" >
</action>
Notas:
package aprendamos.java.action;
import java.util.List;
import aprendamos.java.bean.ClienteDTO;
...
...
ClienteService_I servicioCliente = 2
PaqueteBusinessDelegate.getClienteService();
servicioCliente.registraElCliente(cliente);
clientes=
servicioCliente.
listaClientesPorNombre(cliente.getNombre());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return vista;
}
Notas:
Notas:
if(objCliente.getFoto()!=null){ 1
InputStream tempo =
new FileInputStream(objCliente.getFoto());
objCliente.setIsFoto(tempo);
}
return objClienteDAO.registraCliente(objCliente);
}
Notas:
Connection cn = MySqlDBConn.obtenerConexion();
String sql =
"insert into tbcliente(nombre,sueldo,sexo,fecnac," +
"usuario,clave,foto) values (?,?,?,?,?,?,?)";
PreparedStatement pst = cn.prepareStatement(sql); 1
if(objCliente.getFoto()!=null){
pst.setBinaryStream(7,
objCliente.getIsFoto(),
objCliente.getIsFoto().available())
;
}
// ejecutamos la sentencia
resultado = pst.executeUpdate();
cn.close();
return resultado;
Notas:
pst.setBinaryStream(7, null,0);
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
40
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
42
Notas:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
44
del cdigo fuente. Despus de los cambios aplicados, ste debe de ser
recopilado. Imagine hacer eso cada vez para una nueva localizacin
soportada.
Notas:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
46
Notas:
Notas:
FuncionalidadRegistraImagenI18N_Inicial
. . .
Notas:
. . .
<tr>
<td class="control" >
<s:a action="a_bienvenida" >
1
<s:text name="menu.bienvenida" />
</s:a>
</td>
</tr>
<tr>
1 <s:a
<td class ="control" >
action="a_logueo" >
</s:a>
</td>
</tr>
<tr>
<td class="control" >
<s:a action="a_listado" >
<s:text name="menu.listado" />
</s:a>
</td>
</tr>
. . .
Notas:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
50
. . .
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
52
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
54
Notas:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
56
name="jdbc/sisepuede" 2 auth="Container"
type="javax.sql.DataSource"
maxActive="100" 3
maxIdle="30"
maxWait="10000"
username="root"
password=""
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/facilito"/>
</Context>
Notas:
package aprendamos.java.util;
import java.sql.*; 1
import javax.naming.*;
import javax.sql.*; 2
public class MySqlDBConn {
// Utilizaremos mas bien un pool de conexiones
Notas:
. . .
public static Connection obtenerConexion(){
try {
(DataSource)ctx.lookup(raizContexto+"jdbc/sisepuede"); 2
} catch (NamingException e) {
// TODO Auto-generated catch
block e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return cn;
Notas:
Notas:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
62
<s:url>
<s:action>
<s:form>
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
64
Notas:
1) Debe modificar la pgina listado.jsp para agregar un enlace
que permita visualizar los datos de un cliente en particular.
. . .
<td align="center" > 1
<s:url id="carga" action="cargaModificaCliente" >
<s:param name="usuario" > ${elcli.usuario} </s:param>
</s:url>
. . .
Notas:
<action name="cargaModificaCliente" 1
class="aprendamos.java.action.ClienteAction"
method="cargaModifica" >
Notas:
package aprendamos.java.action;
import java.util.List;
import aprendamos.java.bean.ClienteDTO;
import aprendamos.java.service.ClienteService_I;
import aprendamos.java.service.PaqueteBusinessDelegate; 1
public class ClienteAction {
// creamos un atributo de tipo Lista de
Clientes ClienteDTO cliente;
List<ClienteDTO>
clientes; String usuario;
...
...
public String cargaModifica(){
String vista="exito";
try {
2
cliente=
servicioCliente.buscaClientePorUsuario(
this.getUsuario());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return vista;
} 3
...
Notas:
ClienteDTO objClienteDTO=null;
1
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 2
pst.setString(1,usuario);
//ejecutamos
ResultSet rs=pst.executeQuery();
cn.close();
return objClienteDTO;
}
Notas:
Notas:
. . .
< tr class="control" >
<td> Fotografa: </td>
<td> <s:file name="cliente.foto" /> </td>
<td>
<img alt="Fotografia del Cliente:) " 1
src="cargaImagenCliente?usuario=${cliente.usuario}" />
</td>
</tr>
. . .
Notas:
<action name="cargaImagenCliente"
1
class="aprendamos.java.action.ImagenAction" method="recuperaImagenCliente"
>
<result name="exito" type="stream" > 2
<!-- en inputName colocamos el nombre del atributo del action
que permitira generar el flujo (stream) -->
<param name="inputName">imagenClienteRecuperada</param> 3
</result>
</action>
Notas:
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; 1
InputStream imagenClienteRecuperada;
...
...
public String recuperaImagenCliente(){
String vista="exito";
try {
ClienteDTO cli=
servicioCliente.buscaClientePorUsuario(usuario); 2
Notas:
Notas:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
76
Notas:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
78
</listener>
...
Notas:
</definition>
<definition name="d_nuevoCliente" extends="d_bienvenida">
</definition>
... 3
Notas:
...
<struts>
<constant name="struts.enable.DynamicMethodInvocation"
value="false" />
<constant name="struts.devMode" value="false" />
1
<package name="default" namespace="/" extends="tiles-default">
<!-- creamos un action de atajo -->
<action name="a_nuevoCliente" >
<result type="tiles"> d_nuevoCliente </result>
</action>
2
Notas:
Notas:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
82
<body>
<!-- en esta plantilla definimos el orden de distribucion de los
puts del definition -->
<table>
<tr>
<td colspan="2"><tiles:insertAttribute name="cabecera"
/></td>
</tr>
<tr> 2
<td><tiles:insertAttribute name="menu" /></td>
<td><tiles:insertAttribute name="body" /></td>
</tr>
<tr>
<td colspan="2"><tiles:insertAttribute name="pie" /></td>
</tr>
</table>
</body>
...
Notas:
Notas:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
84
<table>
<tr>
<td colspan="2" align="center" >
<!-- aqui va la cabecera -->
1
<jsp:include page="cabecera.jsp" />
</td>
</tr>
<tr>
<td >
<!-- aqui va el menu -->
</td>
Notas:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
86
Resumen
http://struts.apache.org/2.x/index.html
Aqu encontrar importante documentacin oficial y ejemplos de uso del framework
Struts 2
http://struts.apache.org/1.x/struts-tiles/
Aqu encontrar documentacin oficial sobre el uso de plantillas Tiles dentro de
una aplicacin implementada con el framework Struts. Tambin, encontrar
referencias para utilizar Tiles independientemente de Struts: Tiles 2.
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
88
UNIDAD DE
APRENDIZAJE
TEMARIO
ACTIVIDADES PROPUESTAS
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
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.
Notas:
1) Observe que debe contar con las libreras bsicas de
IBATIS para integrar el framework a su aplicacin web.
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
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.
<sqlMapConfig>
...
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.
import java.io.Reader;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder; 1
// Esta clase retorna un objeto que representa el archivo
// SqlMapConfig.xml. Este es el principal archivo de
// cofiguracion de ibatis
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#
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.
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
98
only)
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
100
. . .
<resultMap class="cli"
id="clienteRes" >
</resultMap>
1
<parameterMap class="java.util.Map" id="clienteMap" >
<parameter property="nombre" jdbcType="VARCHAR" />
<parameter property="sueldo" jdbcType="DOUBLE" />
<parameter property="sexo" jdbcType="CHAR" />
<parameter property="fecnac" jdbcType="DATETIME" />
<parameter property="usuario" jdbcType="VARCHAR" />
<parameter property="clave" jdbcType="VARCHAR" />
<parameter property="foto" jdbcType="BLOB" />
</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.
<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>
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.
map.put("nombre", objCliente.getNombre());
map.put("sueldo" , objCliente.getSueldo());
map.put("sexo", objCliente.getSexo());
map.put("fecnac", objCliente.getFecnac());
map.put("usuario" , objCliente.getUsuario());
map.put("clave", objCliente.getClave());
// intento 01: asumimos que ibatis soporta como parametro
// un arreglo de bytes
// Asumimos que esta llegando la foto
InputStream is = objCliente.getIsFoto();
byte[] losbytes = new byte[is.available()];
// a partir del inputStream cargamos el arreglo los bytes
is.read(losbytes);
1
map.put("foto", losbytes);
cliente.insert("ibatis_insertaCliente",map); 2
Notas:
1) A partir del campo isFoto (de tipo InputStream), se
prepara un arreglo de bytes, el cual se carga en el objeto
map con el nombre foto.
2) Se invoca a la sentencia insert de IBATIS, pasndole
como parmetros el nombre de la operacin a ejecutar y
el objeto map.
return clientes; 1
}
...
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).
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
106
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
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.
insert into
tbcliente(nombre,sueldo,sexo,fecnac,usuario,clave,foto)
values(
vnombre,
vsueldo,
vsexo,
vfecnac,
vusuario,
vclave,
vfoto);
else
set resultado = 666;
end if;
END $$
...
Notas:
map.put("resultado", 0); 1
cliente.insert("ibatis_spInsertaCliente", map); 2
return resultado;
...
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.
</parameterMap> 3
...
<procedure id="ibatis_spInsertaCliente"
parameterMap="clienteMap" > 4
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.
jdbcType=BLOB
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
114
Notas:
1) Observe que debe ejecutar los archivos
sp_modificaCliente.sql y sp_modificaClienteConFoto.sql
if variable != 0 then
else
update tbcliente
set nombre=vnombre,
sueldo=vsueldo,
sexo=vsexo,
fecnac=vfecnac,
clave=vclave,
foto=vfoto
where usuario=vusuario;
else
set resultado = 666;
end if;
END $$
...
Notas:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
118
map.put("nombre", objCliente.getNombre());
map.put("sueldo", objCliente.getSueldo());
map.put("sexo", objCliente.getSexo());
map.put("fecnac", objCliente.getFecnac());
map.put("usuario", objCliente.getUsuario());
map.put("clave", objCliente.getClave());
if (objCliente.getFoto() != null) {
InputStream is = objCliente.getIsFoto();
}
...
Notas:
</parameterMap>
Notas:
Nota:
Resumen
http://www.nabble.com/iBATIS-f360.html
Aqu encontrar un foro donde se ventilan varios puntos del manejo
de Ibatis
http://www.javaworld.com/javaworld/jw-07-2008/jw-07-orm-comparison.html
Aqu hallar comparaciones entre los frameworks de persistencia ms
utilizados.
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
124
UNIDAD DE
APRENDIZAJE
TEMARIO
ACTIVIDADES PROPUESTAS
Los alumnos implementan una aplicacin web bsica utilizando las principales
caractersticas del framework MVC Struts 2 y la librera jasperReport.
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
126
struts2-jasperreports-plugin-2.1.8.1.jar
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
128
Notas:
Notas:
. . .
<result-types > 1 <result-type name="jasper"
class="org.apache.struts2.views.jasperreports.JasperReports
R esult"/>
</result-types>
2
<!-- creamos los actions del menu -->
<action name="a_reporte" >
<result type="tiles" >d_reporte</result>
3
</action>
. . .
<action name="reporteFacilito"
class="aprendamos.java.action.ReporteAction"
method="listaClientesPorPais" >
Notas:
1) Debe crear un nuevo result type para poder integrar
jasperReport y Struts 2.
Notas:
</s:form>su ID -->
...
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.
Notas:
1) El atributo listaClientes es referenciado en el archivo
struts.xml como origen de datos para el Reporte. Note que es
una lista de objetos de tipo ReporteDTO. Esta clase tiene
como atributos los campos que sern mostrados en el
reporte.
2) Se define la lista de clientes a obtener, considerando la
seleccin del usuario (el atributo nombre).
...
Notas:
//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.
<tr>
<td class ="control" >
1
<s:a action="a_reporte" >
</td>
</tr>
...
Notas:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
136
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
138
Resumen
IReport genera archivos fuente con extensin .jrxml. Los archivos compilados
tienen extensin .jasper y pueden ser ejecutados desde una aplicacin java web.
http://jasperforge.org/website/ireportwebsite/IR%20Website/iReport_documentati
on.html?group_id=243&header=project&leftnav=yes&target=ireport
ANEXOS
Java JDK
Entorno integrado de desarrollo o IDE
Servidor de Aplicaciones
Base de datos
Framework Struts 2
Framework MyIbatis
MyIbatis Generator
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
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.
Eclipse IDE:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
142
Apache Tomcat
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
144
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
146
De igual forma, seleccionar el .ZIP ( que sea del tipo No Install ) y extraerlo en alguna
carpeta de la PC.
Se debe escoger una de las opciones de los archivos .ZIP. Con la alternativa de Full
Distribution, es ms que suficiente.
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
148
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
150
ANEXOS
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
152
La Clase entidad
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
154
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
156
ANEXOS
ANEXO 3: MYIBATIS
DynamicSQL
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
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>
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
158
<select id=findActiveBlogLike
parameterType=Blog resultType=Blog>
SELECT * FROM BLOG
WHERE
<if test=state != null>
state = #{state}
</if>
<if test=title != null>
AND title like #{title}
</if>
<if test=author != null and author.name != null>
AND title like #{author.name} </if>
</select>
<select id=findActiveBlogLike
parameterType=Blog resultType=Blog>
SELECT * FROM BLOG
<where>
<if test=state != null>
state = #{state}
</if>
<if test=title != null>
AND title like #{title}
</if>
<if test=author != null and author.name != null>
AND title like #{author.name} </if>
</where>
</select>
Foreach
ANEXOS
En el sqlMapConfig.xml DTD:
Configuracin:
Settings
Ibatis 2.0:
MyIbatis 3.0:
<settings>
<setting name="x" value="y"/>
<setting name="foo" value="bar"/>
</settings>
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
160
<settings useStatementNamespaces="true"/>
<typeAlias>
<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>
Ibatis 2.0:
MyIbatis 3.0:
<mappers>
<mapper resource=... />
</mappers>
Mapping
Ibatis 2.0:
MyIbatis 3.0:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
162
Nested resultMaps
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"
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:
DESARROLLO DE SOFWARE
BASADO EN FRAMEWORKS
164
Dynamic SQL
Ibatis 2.0:
<isNotNull.*?property=\"(.*?)\">
</isNotNull>
MyIbatis 3.0: