SlideShare una empresa de Scribd logo
1 de 15
Descargar para leer sin conexión
UDA – Utilidades de desarrollo de aplicaciones by EJIE is licensed under a Creative Commons Reconocimiento-
NoComercial-CompartirIgual 3.0 Unported License.
UDA - Utilidades de desarrollo de aplicaciones
Gestión de properties
Fecha: 02/02/2012 Referencia:
EJIE S.A.
Mediterráneo, 14
Tel. 945 01 73 00*
Fax. 945 01 73 01
01010 Vitoria-Gasteiz
Posta-kutxatila / Apartado: 809
01080 Vitoria-Gasteiz
www.ejie.es
Gestión de properties ii/15
Control de documentación
Título de documento: Gestión de properties
Histórico de versiones
Código: Versión: Fecha: Resumen de cambios:
1.0.0 02/02/2012 Primera versión.
Cambios producidos desde la última versión
Control de difusión
Responsable: Ander Martínez
Aprobado por:
Firma: Fecha:
Distribución:
Referencias de archivo
Autor:
Nombre archivo:
Localización:
Gestión de properties iii/15
Contenido
Capítulo/sección Página
1 Introducción 1
2 Gestión mediante anotaciones (modo programático) 2
2.1 Declaración 2
2.2 Inyección 2
3 Gestión mediante XML (modo declarativo) 3
3.1 Declaración 3
3.2 Inyección 3
4 Propiedades de aplicación 4
5 Propiedades idiomáticas (i18n) 5
5.1 Propiedades del EAR 5
5.2 Propiedades del WAR 6
6 Uso de propiedades en clases de utilidades 8
6.1 Declaración del objeto a consumir 8
6.2 Configuración de la clase para la inyección de dependencia 9
6.3 Consumo de la clase de utilidades 9
6.4 Corolario 11
7 Conclusiones 12
Gestión de properties 1/15
1 Introducción
El presente documento pretende explicar y detallar la manera en la que se gestionan los ficheros de
propiedades (tanto de aplicación como idiomáticos) en UDA a través de Spring MVC. De este modo, los
usuarios podrán comprender su funcionamiento y acceder al contenido de dichos ficheros de manera rápida y
sencilla sin problema alguno.
El acceso a los ficheros que nos ocupan se realiza a través de ciertos objetos concretos como se verá a
continuación. Por ello se incluyen diversos apartados relacionados con la declaración y uso de dichos objetos
de manera programática y declarativa.
Gestión de properties 2/15
2 Gestión mediante anotaciones (modo programático)
2.1 Declaración
Spring y por tanto UDA, permiten el uso de anotaciones para la declaración de objetos en un “repositorio de
beans” de Spring. Cuando se desee utilizar alguno de estos objetos bastará con recuperarlo e invocar la
función correspondiente a través de la Inyección de Dependencia (ID).
Existen ciertas anotaciones que permiten que Spring incluya ciertas clases Java directamente como objetos
en el respositorio y estas son algunas de ellas:
@Controller
@Service
@Repository
@Component
El plugin de generación de código de UDA permite seleccionar el uso de anotaciones para la resolución de las
dependencias. En caso de seleccionar esta opción, en cada controlador, servicio o DAO se incluirá su
correspondiente anotación (para los DAO se utiliza la anotación @Repository).
Una vez las clases estén implementadas (con su anotación correspondiente), Spring tiene que cargarlos en
su repositorio para poder ser utilizados a través de la ID. El fichero de configuración incluirá un tag que le
indica el paquete desde el que tiene que recorrer los subpaquetes localizando las clases Java para incluir
como objetos del repositorio aquellas anotadas correctamente.
Controllers (WAR)
o xxxNombreWarWebContentWEB-INFspringmvc-config.xml
o <context:component-scan base-package="com.ejie.x21a.control" />
Servicios (EAR)
o xxxEARClassessrcspringservice-config.xml
o <context:component-scan base-package="com.ejie.x21a.service" />
DAOs (EAR)
o xxxEARClassessrcspringdao-config.xml
o <context:component-scan base-package="com.ejie.x21a.dao" />
Adicionalmente, Spring comprobará las anotaciones internas de cada clase resolviendo las dependencias que
encuentre como se explica en el siguiente apartado.
2.2 Inyección
La inyección de dependencia de los objetos de manera programática se realiza del siguiente modo:
@Autowired
private Properties appConfiguration;
Mediante esta anotación Spring buscará en su repositorio de beans algún objeto cuyo ID sea appConfiguration
y enlazará la variable declarada con dicho objeto. Se podrá utilizar directamente el objeto appConfiguration sin
tener que inicializarlo ya que Spring lo habrá realizado por nosotros.
Gestión de properties 3/15
3 Gestión mediante XML (modo declarativo)
3.1 Declaración
La declaración de objetos en Spring puede realizarse a través del fichero XML ya que hasta la versión 5 de
Java no existía soporte para anotaciones.
Por cada objeto que se quiera declarar en el repositorio de beans de Spring deberá incluir una sentencia como
la siguiente:
<bean id="NOMBRE_DEL_OBJETO" class="RUTA_DEL_OBJETO">
<property name="xxa" ref="yyy" />
<property name="xxb" value="zzz" />
…
</bean>
NOMBRE_DEL_OBJETO: Identificador con el que se va a registrar el objeto (se utilizará para
reverenciarlo o recuperarlo)
RUTA_DEL_OBJETO: Nombre completo de la clase que implementa el objeto (incluyendo paquete)
xxa: Nombre de las propiedad del objeto donde se va a inyectar el objeto yyy.
yyy: Objeto del repositorio de beans de Spring a inyectar en el objeto que se está declarando.
xxb: Nombre de la propiedad a la que se le va a asignar el valor zzz.
zzz: Valor que se asociadrá directamente a la propiedad xxx2
UDA declara los objetos empleados para la gestión de propiedades mediante XML como se verá más
adelante. A pesar de que los objetos se declaren en el XML, puede utilizarse la anotación @Autowired
para inyectarlos allí donde sean necesarios.
3.2 Inyección
La inyección de dependencia de los objetos de manera programática se realiza a través del método set de la
variable.
private Properties appConfiguration;
public void setAppConfiguration(Properties appConfiguration) {
this.appConfiguration = appConfiguration;
}
Cuando Spring esté registrando los objetos en su repositorio y detecte que un objeto define una propiedad que
es una referencia a otro objeto, intentetará invocar el metodo set de esa propiedad.
En el siguiente ejemplo, Spring al cargar el objeto “example” implementado en el fichero “com.ejie.xxx.Foo”
invocará el método setAppConfiguration para inyectarle el objeto. Se podrá utilizar directamente el objeto
appConfiguration sin tener que inicializarlo ya que Sprin lo habrá realizado por nosotros.
<bean id="example" class="com.ejie.xxx.Foo">
<property name="appConfiguration" ref="appConfiguration" />
</bean>
Gestión de properties 4/15
4 Propiedades de aplicación
Las aplicaciones desarrolladas con UDA contienen un fichero de propiedades de aplicación denominado
aaa.properties (ej. x21a.properties) alojado en /config/aaa. Dicho fichero contiene valores que dependen del
entorno en el que se trabaja pero no de la versión idomática. Un claro ejemplo puede ser la ruta en la que se
alojan el contenido estático de la aplicación:
foo=bar
El acceso a este tipo de propiedades se realizará a través de la variable appConfiguration declarada en el
fichero xxxEARClassessrcspringservice-config.xml:
<bean id="appConfiguration"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location" value="classpath:x21a/x21a.properties" />
<property name="fileEncoding" value="UTF-8" />
</bean>
Acceso desde clase Java
o Declarar la propiedad (consultar apartados 2.1 y 3.1)
private Properties appConfiguration;
o Acceso directo a la propiedad a recuperar
appConfiguration.get("foo")
Acceso desde JSP
o Guardar propiedad en el Model (en el controller)
model.addAttribute("foo", "bar");
o Acceso medienta EL (Expression Language)
${foo}
Gestión de properties 5/15
5 Propiedades idiomáticas (i18n)
La gestión idiomática (i18n) se realiza a tarvés de diferentes ficheros de propiedades (uno por cada idioma de
la aplicación). Un claro ejemplo puede ser el literal de la pantalla de inicio:
welcome.title=Hello EJIE!
Estos ficheros existen a varios niveles (EAR y WAR) y por tanto en diferentes localizaciones como veremos a
continuación.
5.1 Propiedades del EAR
Los ficheros de propiedades del EAR se encuentran en la siguiente ruta:
xxxEARClassesresources
o xxx.i18n_en.properties
o xxx.i18n_es.properties
o xxx.i18n_eu.properties
o …
El acceso a las propiedades del EAR se realizará a través de la variable appMessageSource declarada en el
fichero xxxEARClassessrcspringservice-config.xml:
<bean id="appMessageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSo
urce">
<property name="basename" value="x21a.i18n" />
<property name="defaultEncoding" value="UTF-8" />
<property name="useCodeAsDefaultMessage" value="true" />
<property name="fallbackToSystemLocale" value="false" />
</bean>
Acceso desde clase Java
o Declarar la propiedad (consultar apartados 2.1 y 3.1)
private ReloadableResourceBundleMessageSource appMessageSource;
o Acceso directo a la propiedad a recuperar
appMessageSource.getMessage("welcome.title", args, locale)
args: Array de argumentos de la propiedad (ej. {0}, {1}, … {n}). En caso de no tener se
pasará null
La locale se puede obtener como variable directamente o como parámetro de un
método:
o Locale locale = LocaleContextHolder.getLocale();
o public void xxx (Locale locale) { ... }
Acceso desde JSP
o Incluir el fichero TLD de Spring (se incluye en el fichero ‘includeTemplate.inc’)
<%@ taglib prefix="spring" uri="/WEB-INF/tld/spring.tld" %>
Gestión de properties 6/15
o Acceso a la propiedad mediante el tag de Spring
<spring:message code="welcome.title" />
UDA incluye automáticamente la TLD de Spring en el fichero ‘includeTemplate.inc’ en la ruta
xxxNombreWarWebContentWEB-INF por lo que bastará con incluir dicho fichero:
<%@include file="/WEB-INF/includeTemplate.inc"%>
5.2 Propiedades del WAR
Los ficheros de propiedades del WAR se encuentran en la siguiente ruta:
xxxNombreWarWebContentWEB-INFresources
o xxxNombreWar.i18n_en.properties
o xxxNombreWar.i18n_es.properties
o xxxNombreWar.i18n_eu.properties
o …
Las propiedades definidas a nivel de WAR solo pueden ser accedidas desde el propio WAR, en cambio las
propiedades definidas a nivel de EAR pueden ser accedidas desde cualquier capa (Presentación, Servicios,
Acceso a datos, …).
La resolución de una propiedad desde el WAR sigue el siguiente orden. Primero se comprueba que la
propiedad exista en sus ficheros de recursos y en caso afirmativo se recuperará. Si por el contrario no existe
se buscará en los ficheros de recursos del EAR. De esta manera en caso de necesitar identicos literales a
nivel de EAR y de los diferentes WAR bastará con definirlos únicamente en el fichero de recursos del EAR.
El acceso a las propiedades del WAR se realizará a través de la variable messageSource declarada en el
fichero xxxNombreWarWebContentWEB-INFspringmvc-config.xml:
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSo
urce">
<property name="parentMessageSource" ref="appMessageSource" />
<property name="basename" value="/WEB-
INF/resources/x21aPilotoPatrones.i18n" />
<property name="defaultEncoding" value="UTF-8" />
<property name="useCodeAsDefaultMessage" value="true" />
<property name="fallbackToSystemLocale" value="false" />
</bean>
Acceso desde clase Java
o Declarar la propiedad (consultar apartados 2.1 y 3.1)
private ReloadableResourceBundleMessageSource messageSource;
o Acceso directo a la propiedad a recuperar
messageSource.getMessage("welcome.title", args, locale)
args: Array de argumentos de la propiedad (ej. {0}, {1}, … {n}). En caso de no tener se
pasará null
La locale se puede obtener como variable directamente o como parámetro de un
método:
Gestión de properties 7/15
o Locale locale = LocaleContextHolder.getLocale();
o public void xxx (Locale locale) { ... }
Acceso desde JSP
o Incluir el fichero TLD de Spring (se incluye en el fichero ‘includeTemplate.inc’)
<%@ taglib prefix="spring" uri="/WEB-INF/tld/spring.tld" %>
o Acceso a la propiedad mediante el tag de Spring
<spring:message code="welcome.title" />
UDA incluye automáticamente la TLD de Spring en el fichero ‘includeTemplate.inc’ en la ruta
xxxNombreWarWebContentWEB-INF por lo que bastará con incluir dicho fichero:
<%@include file="/WEB-INF/includeTemplate.inc"%>
Gestión de properties 8/15
6 Uso de propiedades en clases de utilidades
El acceso y explotación de propiedades desde las clases de las capas de presentación (controllers), servicio
(services) o acceso a datos (daos) es directo ya que UDA deja todo configurado directamente. Y dependiendo
de cómo se generara el código a través del plugin de UDA se deberá realizar lo siguiente:
Anotaciones
o Incluir la anotación @Autowired delante del objeto
o Asegurarse de que el paquete en el que se encuentra la clase está en el scan (por defecto sí)
XML
o Incluir el método set de la aplicación
o Configurar la propiedad del objeto en el fichero XML correspondiente (tag property)
El problema puede existir cuando se utilizan clases propias de ayuda (paquetes de utilidades) que al no
configurarse correctamente pueden inducir a error y generar problemas.
A continuación se muestra un ejemplo detallando esta casuística. Se creará una clase de utilidades cuya
función recupere un valor de una propiedad de aplicación (para i18n sería idéntico) y lo escriba en el log:
package com.ejie.xxx;
//imports
public class Foo {
private static final Logger logger = ...;
//Declaración de appConfiguration (ver apartado 6.1)
public void do(){
logger.info(appConfiguration.get("bar"));
}
}
6.1 Declaración del objeto a consumir
A continuación se detalla como debería declararse la variable appConfiguration dependiendo del tipo de
variable (de instancia o de clase que dependerá del tipo de método a implementar) y de si se usan
anotaciones o XML:
Anotaciones
o Variable de instancia
@Autowired
private Properties appConfiguration;
o Variable de clase
private static Properties appConfiguration;
@Autowired
public void setAppConfiguration(Properties appConfiguration){
Foo.appConfiguration = appConfiguration;
Gestión de properties 9/15
}
XML
o Variable de instancia
private Properties appConfiguration;
public void setAppConfiguration(Properties appConfiguration) {
this.appConfiguration = appConfiguration;
}
o Variable de clase
private static Properties appConfiguration;
public void setAppConfiguration(Properties appConfiguration){
Foo.appConfiguration = appConfiguration;
}
NOTA: En caso de que la variable se declare de clase, habrá que modificar el método para añadirle el
modificador static.
6.2 Configuración de la clase para la inyección de dependencia
En el caso de que utilicen anotaciones como la clase se encuentra fuera de los paquetes generados y
escaneados por UDA (control, service y dao) se deberán realizar dos modificaciones:
1. Se deberá anotar la clase con el modificador @Component
@Component
public class Foo ...
2. Se deberá incluir el escaneo del paquete en el fichero xml correspondiente (dependiendo de su
localización en el mvc-config [WAR], service-config [EAR] o dao-config [EAR]). Por ejemplo si lo
incluyeramos en el mvc-config (ya que la clase la desplegaremos en el WAR):
<context:component-scan base-package="
com.ejie.x21a.control,
com.ejie.xxx"
/>
Si por el contrario se utiliza XML para la configuración de objetos, se deberá incluir la definición del bean en el
xml para que Spring inyecte la dependencia a través del setter:
<bean id="foo" class="com.ejie.xxx.Foo">
<property name="appConfiguration" ref="appConfiguration" />
</bean>
6.3 Consumo de la clase de utilidades
Una vez declarada la clase de utilidades con su objeto de acceso a las propiedades, será turno de realizar la
invocación, por ejemplo desde un controlador.
En el caso de que el método de utilidades sea estático bastará con invocarlo de la siguiente manera:
Gestión de properties 10/15
@RequestMapping(method = RequestMethod.GET)
public String getXXX(Model model) {
Foo.do();
}
NOTA: Podría inyectarse el objeto como variable del controller e invocar el método sobre esa instancia del
objeto pero daría un warning por la manera de invocar el método por lo que se descarta.
En el caso de que el método de utilidades sea dinámico, podría invocarse de alguna de las siguientes
maneras:
1. Inyectando el objeto (mediante anotación o xml) e invocando el método directamente
XML
private Foo foo;
public void setFoo (Foo foo) {
this.foo = foo;
}
@RequestMapping(method = RequestMethod.GET)
public String getXXX(Model model) {
foo.do();
}
Habría que declarar la inyección de la variable en el fichero XML
<bean id="fooController"
class="com.ejie.xxx.control.FooController">
<property name="foo" ref="foo" />
</bean>
Anotación
@Autowired
private Foo foo;
@RequestMapping(method = RequestMethod.GET)
public String getXXX(Model model) {
foo.do();
}
2. Creando una instancia de la clase de utilidades e invocando el método
@RequestMapping(method = RequestMethod.GET)
public String getXXX(Model model) {
Foo foo = new Foo();
foo.do();
}
Gestión de properties 11/15
En este segundo caso (al invocar el constructor directamente) el objeto foo inicializará su variable interna
appConfig a null por lo que en la invocación del método se lanzará una excepción (NullPointerException).
Para evitar esto bastará con modificar la clase de utilidades para que extienda de
“SpringBeanAutowiringSupport” del siguiente modo:
public class Foo extends SpringBeanAutowiringSupport {
...
}
6.4 Corolario
Para evitar inconsistencias y problemas de esta índole, se recomienda el uso de anotaciones para la
inyección de dependencia y evitar el uso de bloques estáticos (static) en la medida de lo posible. Esto se
justifica porque Spring instancia sus beans siguiendo el patrón singleton por lo que internamente se crean una
única vez.
SpringSource.org también es partidario de seguir estas pautas en el desarrollo de aplicaciones porque este
tipo de bloques pueden generar problemas al integrarse con Spring.
Gestión de properties 12/15
7 Conclusiones
La explotación de los ficheros de properties en UDA se realiza a través de objetos es idéntica a la explotación
de cualquier objeto en Spring.
Una vez que se configuran los objetos encargados de su gestión (appConfiguration, appMessageSource y
messageSource), su explotación como se ha visto en este documento es fácil y sencilla. Independientemente
del modo en el que se trabaje (anotaciones o a través de xml) el acceso a las propiedades es idéntica y no
presenta grandes problemas.
El único problema o complejidad puede presentarse cuando se utilizan clases de utilidades (clases que no
entran en las capas de presentación, servicios y acceso a datos) que habrá que configurar manualmente (al
igual que habría que hacer con el resto de clases si no utilizamos el plugin de UDA).

Más contenido relacionado

La actualidad más candente

Creación de varios_ proyectos_ en_una_solución_visual _studio_2010
Creación de varios_ proyectos_ en_una_solución_visual _studio_2010Creación de varios_ proyectos_ en_una_solución_visual _studio_2010
Creación de varios_ proyectos_ en_una_solución_visual _studio_2010Adriana Cabella
 
ORACLE FUNDAMENTALS I
ORACLE FUNDAMENTALS IORACLE FUNDAMENTALS I
ORACLE FUNDAMENTALS IRaquel Solano
 
Elementos de eclipse
Elementos de eclipseElementos de eclipse
Elementos de eclipsePVarely24
 
Un lenguaje de_cuarta_generacion_oracle
Un lenguaje de_cuarta_generacion_oracleUn lenguaje de_cuarta_generacion_oracle
Un lenguaje de_cuarta_generacion_oracleOscar Allen
 
ESPACIO DE NOMBRES SYSTEM.DATA.SQLCLIENT
ESPACIO DE NOMBRES SYSTEM.DATA.SQLCLIENTESPACIO DE NOMBRES SYSTEM.DATA.SQLCLIENT
ESPACIO DE NOMBRES SYSTEM.DATA.SQLCLIENTLisbeth Ocaña Bueno
 
Manual hibernate v2
Manual hibernate v2Manual hibernate v2
Manual hibernate v2zaka3000
 
Acceso a datos con JAVA
Acceso a datos con JAVAAcceso a datos con JAVA
Acceso a datos con JAVADada3311
 
2. Java Servlets (J2EE) - Curso 2005-2006
2. Java Servlets (J2EE) - Curso 2005-20062. Java Servlets (J2EE) - Curso 2005-2006
2. Java Servlets (J2EE) - Curso 2005-2006Samuel Marrero
 
ENTERPRISE MANAGER DE LA BASE DE DATOS ORACLE VERSIÓN 11G
ENTERPRISE MANAGER DE LA BASE DE DATOS ORACLE VERSIÓN 11GENTERPRISE MANAGER DE LA BASE DE DATOS ORACLE VERSIÓN 11G
ENTERPRISE MANAGER DE LA BASE DE DATOS ORACLE VERSIÓN 11G1712223955
 
Tema 9 aplicaciones de dos capas por gio
Tema 9   aplicaciones de dos capas por gioTema 9   aplicaciones de dos capas por gio
Tema 9 aplicaciones de dos capas por gioRobert Wolf
 
Hibernate 3.2 short manual
Hibernate 3.2 short manualHibernate 3.2 short manual
Hibernate 3.2 short manualEmmerson Miranda
 
WPF 10. mejorando la funcionalidad y usabilidad de las aplicaciones
WPF 10. mejorando la funcionalidad y usabilidad de las aplicacionesWPF 10. mejorando la funcionalidad y usabilidad de las aplicaciones
WPF 10. mejorando la funcionalidad y usabilidad de las aplicacionesDanae Aguilar Guzmán
 
Tema 16 acceso a base de datos usando jpa por gio
Tema 16   acceso a base de datos usando jpa por gioTema 16   acceso a base de datos usando jpa por gio
Tema 16 acceso a base de datos usando jpa por gioRobert Wolf
 
Servlets exposicion
Servlets exposicionServlets exposicion
Servlets exposicionFlashnet S.A
 

La actualidad más candente (20)

Spring framework
Spring frameworkSpring framework
Spring framework
 
Creación de varios_ proyectos_ en_una_solución_visual _studio_2010
Creación de varios_ proyectos_ en_una_solución_visual _studio_2010Creación de varios_ proyectos_ en_una_solución_visual _studio_2010
Creación de varios_ proyectos_ en_una_solución_visual _studio_2010
 
ORACLE FUNDAMENTALS I
ORACLE FUNDAMENTALS IORACLE FUNDAMENTALS I
ORACLE FUNDAMENTALS I
 
Elementos de eclipse
Elementos de eclipseElementos de eclipse
Elementos de eclipse
 
Spring Mvc Final
Spring Mvc FinalSpring Mvc Final
Spring Mvc Final
 
Un lenguaje de_cuarta_generacion_oracle
Un lenguaje de_cuarta_generacion_oracleUn lenguaje de_cuarta_generacion_oracle
Un lenguaje de_cuarta_generacion_oracle
 
System.data.sqlclient
System.data.sqlclientSystem.data.sqlclient
System.data.sqlclient
 
ESPACIO DE NOMBRES SYSTEM.DATA.SQLCLIENT
ESPACIO DE NOMBRES SYSTEM.DATA.SQLCLIENTESPACIO DE NOMBRES SYSTEM.DATA.SQLCLIENT
ESPACIO DE NOMBRES SYSTEM.DATA.SQLCLIENT
 
Manual hibernate v2
Manual hibernate v2Manual hibernate v2
Manual hibernate v2
 
Persistence
PersistencePersistence
Persistence
 
Base datosvisualc#express2008
Base datosvisualc#express2008Base datosvisualc#express2008
Base datosvisualc#express2008
 
08 i18 n
08 i18 n08 i18 n
08 i18 n
 
Acceso a datos con JAVA
Acceso a datos con JAVAAcceso a datos con JAVA
Acceso a datos con JAVA
 
2. Java Servlets (J2EE) - Curso 2005-2006
2. Java Servlets (J2EE) - Curso 2005-20062. Java Servlets (J2EE) - Curso 2005-2006
2. Java Servlets (J2EE) - Curso 2005-2006
 
ENTERPRISE MANAGER DE LA BASE DE DATOS ORACLE VERSIÓN 11G
ENTERPRISE MANAGER DE LA BASE DE DATOS ORACLE VERSIÓN 11GENTERPRISE MANAGER DE LA BASE DE DATOS ORACLE VERSIÓN 11G
ENTERPRISE MANAGER DE LA BASE DE DATOS ORACLE VERSIÓN 11G
 
Tema 9 aplicaciones de dos capas por gio
Tema 9   aplicaciones de dos capas por gioTema 9   aplicaciones de dos capas por gio
Tema 9 aplicaciones de dos capas por gio
 
Hibernate 3.2 short manual
Hibernate 3.2 short manualHibernate 3.2 short manual
Hibernate 3.2 short manual
 
WPF 10. mejorando la funcionalidad y usabilidad de las aplicaciones
WPF 10. mejorando la funcionalidad y usabilidad de las aplicacionesWPF 10. mejorando la funcionalidad y usabilidad de las aplicaciones
WPF 10. mejorando la funcionalidad y usabilidad de las aplicaciones
 
Tema 16 acceso a base de datos usando jpa por gio
Tema 16   acceso a base de datos usando jpa por gioTema 16   acceso a base de datos usando jpa por gio
Tema 16 acceso a base de datos usando jpa por gio
 
Servlets exposicion
Servlets exposicionServlets exposicion
Servlets exposicion
 

Destacado

UDA-Componentes RUP. Feedback
UDA-Componentes RUP. FeedbackUDA-Componentes RUP. Feedback
UDA-Componentes RUP. FeedbackAnder Martinez
 
UDA-Componentes RUP. Botonera
UDA-Componentes RUP. BotoneraUDA-Componentes RUP. Botonera
UDA-Componentes RUP. BotoneraAnder Martinez
 
UDA-Anexo gestión de validaciones
UDA-Anexo gestión de validacionesUDA-Anexo gestión de validaciones
UDA-Anexo gestión de validacionesAnder Martinez
 
UDA-Anexo gestión idiomática
UDA-Anexo gestión idiomáticaUDA-Anexo gestión idiomática
UDA-Anexo gestión idiomáticaAnder Martinez
 
UDA-Componentes RUP. Menú contextual
UDA-Componentes RUP. Menú contextualUDA-Componentes RUP. Menú contextual
UDA-Componentes RUP. Menú contextualAnder Martinez
 
UDA-Componentes RUP. Tabla (v2.1.1 deprecado)
UDA-Componentes RUP. Tabla (v2.1.1 deprecado)UDA-Componentes RUP. Tabla (v2.1.1 deprecado)
UDA-Componentes RUP. Tabla (v2.1.1 deprecado)Ander Martinez
 
UDA-Componentes RUP. Tabla Avanzada
UDA-Componentes RUP. Tabla AvanzadaUDA-Componentes RUP. Tabla Avanzada
UDA-Componentes RUP. Tabla AvanzadaAnder Martinez
 

Destacado (7)

UDA-Componentes RUP. Feedback
UDA-Componentes RUP. FeedbackUDA-Componentes RUP. Feedback
UDA-Componentes RUP. Feedback
 
UDA-Componentes RUP. Botonera
UDA-Componentes RUP. BotoneraUDA-Componentes RUP. Botonera
UDA-Componentes RUP. Botonera
 
UDA-Anexo gestión de validaciones
UDA-Anexo gestión de validacionesUDA-Anexo gestión de validaciones
UDA-Anexo gestión de validaciones
 
UDA-Anexo gestión idiomática
UDA-Anexo gestión idiomáticaUDA-Anexo gestión idiomática
UDA-Anexo gestión idiomática
 
UDA-Componentes RUP. Menú contextual
UDA-Componentes RUP. Menú contextualUDA-Componentes RUP. Menú contextual
UDA-Componentes RUP. Menú contextual
 
UDA-Componentes RUP. Tabla (v2.1.1 deprecado)
UDA-Componentes RUP. Tabla (v2.1.1 deprecado)UDA-Componentes RUP. Tabla (v2.1.1 deprecado)
UDA-Componentes RUP. Tabla (v2.1.1 deprecado)
 
UDA-Componentes RUP. Tabla Avanzada
UDA-Componentes RUP. Tabla AvanzadaUDA-Componentes RUP. Tabla Avanzada
UDA-Componentes RUP. Tabla Avanzada
 

Similar a Gestión de propiedades UDA

Hands-on Spring 3: The next generation
Hands-on Spring 3: The next generationHands-on Spring 3: The next generation
Hands-on Spring 3: The next generationSergi Almar i Graupera
 
UDA-Componentes RUP. Árbol
UDA-Componentes RUP. ÁrbolUDA-Componentes RUP. Árbol
UDA-Componentes RUP. ÁrbolAnder Martinez
 
Introducción a Java Persistence API
Introducción a Java Persistence APIIntroducción a Java Persistence API
Introducción a Java Persistence APIJose Martinez
 
Utilizacion de beans en jsp
Utilizacion de beans en jspUtilizacion de beans en jsp
Utilizacion de beans en jspBoris Salleg
 
UDA-Componentes RUP. Pestañas
UDA-Componentes RUP. PestañasUDA-Componentes RUP. Pestañas
UDA-Componentes RUP. PestañasAnder Martinez
 
Capitulo3 jsf
Capitulo3 jsfCapitulo3 jsf
Capitulo3 jsfjoserazo7
 
Curso de Desarrollo Web 2
Curso de Desarrollo Web 2Curso de Desarrollo Web 2
Curso de Desarrollo Web 2juliocombativo
 
UDA-Componentes RUP. Migas
UDA-Componentes RUP. MigasUDA-Componentes RUP. Migas
UDA-Componentes RUP. MigasAnder Martinez
 
UDA-Componentes RUP dialogo.v2.4.0
UDA-Componentes RUP dialogo.v2.4.0UDA-Componentes RUP dialogo.v2.4.0
UDA-Componentes RUP dialogo.v2.4.0Ander Martinez
 
UDA-Componentes RUP. Diálogo (v2.1.0 deprecado)
UDA-Componentes RUP. Diálogo  (v2.1.0 deprecado)UDA-Componentes RUP. Diálogo  (v2.1.0 deprecado)
UDA-Componentes RUP. Diálogo (v2.1.0 deprecado)Ander Martinez
 
Computación avanzada en java cert
Computación avanzada en java certComputación avanzada en java cert
Computación avanzada en java certMaestros Online
 
Desarrollo android almacenamiento de datos
Desarrollo android    almacenamiento de datosDesarrollo android    almacenamiento de datos
Desarrollo android almacenamiento de datosFernando Cejas
 
Seguridad en access
Seguridad en accessSeguridad en access
Seguridad en accessssuser3a82fb
 

Similar a Gestión de propiedades UDA (20)

T3 - JPA
T3 - JPAT3 - JPA
T3 - JPA
 
Introduccion a Doctrine 2 ORM
Introduccion a Doctrine 2 ORMIntroduccion a Doctrine 2 ORM
Introduccion a Doctrine 2 ORM
 
Hands-on Spring 3: The next generation
Hands-on Spring 3: The next generationHands-on Spring 3: The next generation
Hands-on Spring 3: The next generation
 
UDA-Componentes RUP. Árbol
UDA-Componentes RUP. ÁrbolUDA-Componentes RUP. Árbol
UDA-Componentes RUP. Árbol
 
Introducción a Java Persistence API
Introducción a Java Persistence APIIntroducción a Java Persistence API
Introducción a Java Persistence API
 
Utilizacion de beans en jsp
Utilizacion de beans en jspUtilizacion de beans en jsp
Utilizacion de beans en jsp
 
feedback
feedbackfeedback
feedback
 
UDA-Componentes RUP. Pestañas
UDA-Componentes RUP. PestañasUDA-Componentes RUP. Pestañas
UDA-Componentes RUP. Pestañas
 
Manual Basico De Struts
Manual Basico De StrutsManual Basico De Struts
Manual Basico De Struts
 
Capitulo3 jsf
Capitulo3 jsfCapitulo3 jsf
Capitulo3 jsf
 
Curso de Desarrollo Web 2
Curso de Desarrollo Web 2Curso de Desarrollo Web 2
Curso de Desarrollo Web 2
 
spring framework
spring frameworkspring framework
spring framework
 
jsf
jsfjsf
jsf
 
Data storage
Data storageData storage
Data storage
 
UDA-Componentes RUP. Migas
UDA-Componentes RUP. MigasUDA-Componentes RUP. Migas
UDA-Componentes RUP. Migas
 
UDA-Componentes RUP dialogo.v2.4.0
UDA-Componentes RUP dialogo.v2.4.0UDA-Componentes RUP dialogo.v2.4.0
UDA-Componentes RUP dialogo.v2.4.0
 
UDA-Componentes RUP. Diálogo (v2.1.0 deprecado)
UDA-Componentes RUP. Diálogo  (v2.1.0 deprecado)UDA-Componentes RUP. Diálogo  (v2.1.0 deprecado)
UDA-Componentes RUP. Diálogo (v2.1.0 deprecado)
 
Computación avanzada en java cert
Computación avanzada en java certComputación avanzada en java cert
Computación avanzada en java cert
 
Desarrollo android almacenamiento de datos
Desarrollo android    almacenamiento de datosDesarrollo android    almacenamiento de datos
Desarrollo android almacenamiento de datos
 
Seguridad en access
Seguridad en accessSeguridad en access
Seguridad en access
 

Más de Ander Martinez

UDA-Componentes RUP. Tabla.v2.4.6
UDA-Componentes RUP. Tabla.v2.4.6UDA-Componentes RUP. Tabla.v2.4.6
UDA-Componentes RUP. Tabla.v2.4.6Ander Martinez
 
Arinbide Adaptativo. Visión del producto.v1.0
Arinbide Adaptativo. Visión del producto.v1.0Arinbide Adaptativo. Visión del producto.v1.0
Arinbide Adaptativo. Visión del producto.v1.0Ander Martinez
 
Arinbide Adaptativo. Retrospectiva.v1.0
Arinbide Adaptativo. Retrospectiva.v1.0Arinbide Adaptativo. Retrospectiva.v1.0
Arinbide Adaptativo. Retrospectiva.v1.0Ander Martinez
 
Arinbide Adaptativo. Plan de entregas.v1.0
Arinbide Adaptativo. Plan de entregas.v1.0Arinbide Adaptativo. Plan de entregas.v1.0
Arinbide Adaptativo. Plan de entregas.v1.0Ander Martinez
 
Arinbide Adaptativo. Pila de sprint.v1.0
Arinbide Adaptativo. Pila de sprint.v1.0Arinbide Adaptativo. Pila de sprint.v1.0
Arinbide Adaptativo. Pila de sprint.v1.0Ander Martinez
 
Arinbide Adaptativo. Pila de producto.v1.0
Arinbide Adaptativo. Pila de producto.v1.0Arinbide Adaptativo. Pila de producto.v1.0
Arinbide Adaptativo. Pila de producto.v1.0Ander Martinez
 
Arinbide Adaptativo. Pila de impedimentos.v1.1
Arinbide Adaptativo. Pila de impedimentos.v1.1Arinbide Adaptativo. Pila de impedimentos.v1.1
Arinbide Adaptativo. Pila de impedimentos.v1.1Ander Martinez
 
Arinbide Adaptativo. Normas, participantes y procedimientos.v1.0
Arinbide Adaptativo. Normas, participantes y procedimientos.v1.0Arinbide Adaptativo. Normas, participantes y procedimientos.v1.0
Arinbide Adaptativo. Normas, participantes y procedimientos.v1.0Ander Martinez
 
Arinbide Adaptativo. Monitorización.v1.0
Arinbide Adaptativo. Monitorización.v1.0Arinbide Adaptativo. Monitorización.v1.0
Arinbide Adaptativo. Monitorización.v1.0Ander Martinez
 
Arinbide Adaptativo. Manual de usuario.v1.0
Arinbide Adaptativo. Manual de usuario.v1.0Arinbide Adaptativo. Manual de usuario.v1.0
Arinbide Adaptativo. Manual de usuario.v1.0Ander Martinez
 
Arinbide Adaptativo. Diseño técnico.v1.0
Arinbide Adaptativo. Diseño técnico.v1.0Arinbide Adaptativo. Diseño técnico.v1.0
Arinbide Adaptativo. Diseño técnico.v1.0Ander Martinez
 
Arinbide Adaptativo. Defectos y errores .v1.0
Arinbide Adaptativo. Defectos y errores .v1.0Arinbide Adaptativo. Defectos y errores .v1.0
Arinbide Adaptativo. Defectos y errores .v1.0Ander Martinez
 
Arinbide Adaptativo. Acta de reunión.v1.1
Arinbide Adaptativo. Acta de reunión.v1.1Arinbide Adaptativo. Acta de reunión.v1.1
Arinbide Adaptativo. Acta de reunión.v1.1Ander Martinez
 
Arinbide adaptativo. Anexo. Conceptos básicos. v1.0
Arinbide adaptativo. Anexo. Conceptos básicos. v1.0Arinbide adaptativo. Anexo. Conceptos básicos. v1.0
Arinbide adaptativo. Anexo. Conceptos básicos. v1.0Ander Martinez
 
Arinbide adaptativo.v1.0
Arinbide adaptativo.v1.0Arinbide adaptativo.v1.0
Arinbide adaptativo.v1.0Ander Martinez
 
UDA-Componentes RUP. Upload
UDA-Componentes RUP. UploadUDA-Componentes RUP. Upload
UDA-Componentes RUP. UploadAnder Martinez
 
UDA-Componentes RUP. Reporting
UDA-Componentes RUP. ReportingUDA-Componentes RUP. Reporting
UDA-Componentes RUP. ReportingAnder Martinez
 
UDA-Componentes RUP. Autocomplete
UDA-Componentes RUP. AutocompleteUDA-Componentes RUP. Autocomplete
UDA-Componentes RUP. AutocompleteAnder Martinez
 
UDA-Componentes RUP. Accordion
UDA-Componentes RUP. AccordionUDA-Componentes RUP. Accordion
UDA-Componentes RUP. AccordionAnder Martinez
 

Más de Ander Martinez (20)

UDA-Componentes RUP. Tabla.v2.4.6
UDA-Componentes RUP. Tabla.v2.4.6UDA-Componentes RUP. Tabla.v2.4.6
UDA-Componentes RUP. Tabla.v2.4.6
 
Arinbide Adaptativo. Visión del producto.v1.0
Arinbide Adaptativo. Visión del producto.v1.0Arinbide Adaptativo. Visión del producto.v1.0
Arinbide Adaptativo. Visión del producto.v1.0
 
Arinbide Adaptativo. Retrospectiva.v1.0
Arinbide Adaptativo. Retrospectiva.v1.0Arinbide Adaptativo. Retrospectiva.v1.0
Arinbide Adaptativo. Retrospectiva.v1.0
 
Arinbide Adaptativo. Plan de entregas.v1.0
Arinbide Adaptativo. Plan de entregas.v1.0Arinbide Adaptativo. Plan de entregas.v1.0
Arinbide Adaptativo. Plan de entregas.v1.0
 
Arinbide Adaptativo. Pila de sprint.v1.0
Arinbide Adaptativo. Pila de sprint.v1.0Arinbide Adaptativo. Pila de sprint.v1.0
Arinbide Adaptativo. Pila de sprint.v1.0
 
Arinbide Adaptativo. Pila de producto.v1.0
Arinbide Adaptativo. Pila de producto.v1.0Arinbide Adaptativo. Pila de producto.v1.0
Arinbide Adaptativo. Pila de producto.v1.0
 
Arinbide Adaptativo. Pila de impedimentos.v1.1
Arinbide Adaptativo. Pila de impedimentos.v1.1Arinbide Adaptativo. Pila de impedimentos.v1.1
Arinbide Adaptativo. Pila de impedimentos.v1.1
 
Arinbide Adaptativo. Normas, participantes y procedimientos.v1.0
Arinbide Adaptativo. Normas, participantes y procedimientos.v1.0Arinbide Adaptativo. Normas, participantes y procedimientos.v1.0
Arinbide Adaptativo. Normas, participantes y procedimientos.v1.0
 
Arinbide Adaptativo. Monitorización.v1.0
Arinbide Adaptativo. Monitorización.v1.0Arinbide Adaptativo. Monitorización.v1.0
Arinbide Adaptativo. Monitorización.v1.0
 
Arinbide Adaptativo. Manual de usuario.v1.0
Arinbide Adaptativo. Manual de usuario.v1.0Arinbide Adaptativo. Manual de usuario.v1.0
Arinbide Adaptativo. Manual de usuario.v1.0
 
Arinbide Adaptativo. Diseño técnico.v1.0
Arinbide Adaptativo. Diseño técnico.v1.0Arinbide Adaptativo. Diseño técnico.v1.0
Arinbide Adaptativo. Diseño técnico.v1.0
 
Arinbide Adaptativo. Defectos y errores .v1.0
Arinbide Adaptativo. Defectos y errores .v1.0Arinbide Adaptativo. Defectos y errores .v1.0
Arinbide Adaptativo. Defectos y errores .v1.0
 
Arinbide Adaptativo. Acta de reunión.v1.1
Arinbide Adaptativo. Acta de reunión.v1.1Arinbide Adaptativo. Acta de reunión.v1.1
Arinbide Adaptativo. Acta de reunión.v1.1
 
Arinbide adaptativo. Anexo. Conceptos básicos. v1.0
Arinbide adaptativo. Anexo. Conceptos básicos. v1.0Arinbide adaptativo. Anexo. Conceptos básicos. v1.0
Arinbide adaptativo. Anexo. Conceptos básicos. v1.0
 
Arinbide adaptativo.v1.0
Arinbide adaptativo.v1.0Arinbide adaptativo.v1.0
Arinbide adaptativo.v1.0
 
Arinbide.v3.0
Arinbide.v3.0Arinbide.v3.0
Arinbide.v3.0
 
UDA-Componentes RUP. Upload
UDA-Componentes RUP. UploadUDA-Componentes RUP. Upload
UDA-Componentes RUP. Upload
 
UDA-Componentes RUP. Reporting
UDA-Componentes RUP. ReportingUDA-Componentes RUP. Reporting
UDA-Componentes RUP. Reporting
 
UDA-Componentes RUP. Autocomplete
UDA-Componentes RUP. AutocompleteUDA-Componentes RUP. Autocomplete
UDA-Componentes RUP. Autocomplete
 
UDA-Componentes RUP. Accordion
UDA-Componentes RUP. AccordionUDA-Componentes RUP. Accordion
UDA-Componentes RUP. Accordion
 

Último

Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxRogerPrieto3
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 

Último (15)

Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptx
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 

Gestión de propiedades UDA

  • 1. UDA – Utilidades de desarrollo de aplicaciones by EJIE is licensed under a Creative Commons Reconocimiento- NoComercial-CompartirIgual 3.0 Unported License. UDA - Utilidades de desarrollo de aplicaciones Gestión de properties Fecha: 02/02/2012 Referencia: EJIE S.A. Mediterráneo, 14 Tel. 945 01 73 00* Fax. 945 01 73 01 01010 Vitoria-Gasteiz Posta-kutxatila / Apartado: 809 01080 Vitoria-Gasteiz www.ejie.es
  • 2. Gestión de properties ii/15 Control de documentación Título de documento: Gestión de properties Histórico de versiones Código: Versión: Fecha: Resumen de cambios: 1.0.0 02/02/2012 Primera versión. Cambios producidos desde la última versión Control de difusión Responsable: Ander Martínez Aprobado por: Firma: Fecha: Distribución: Referencias de archivo Autor: Nombre archivo: Localización:
  • 3. Gestión de properties iii/15 Contenido Capítulo/sección Página 1 Introducción 1 2 Gestión mediante anotaciones (modo programático) 2 2.1 Declaración 2 2.2 Inyección 2 3 Gestión mediante XML (modo declarativo) 3 3.1 Declaración 3 3.2 Inyección 3 4 Propiedades de aplicación 4 5 Propiedades idiomáticas (i18n) 5 5.1 Propiedades del EAR 5 5.2 Propiedades del WAR 6 6 Uso de propiedades en clases de utilidades 8 6.1 Declaración del objeto a consumir 8 6.2 Configuración de la clase para la inyección de dependencia 9 6.3 Consumo de la clase de utilidades 9 6.4 Corolario 11 7 Conclusiones 12
  • 4. Gestión de properties 1/15 1 Introducción El presente documento pretende explicar y detallar la manera en la que se gestionan los ficheros de propiedades (tanto de aplicación como idiomáticos) en UDA a través de Spring MVC. De este modo, los usuarios podrán comprender su funcionamiento y acceder al contenido de dichos ficheros de manera rápida y sencilla sin problema alguno. El acceso a los ficheros que nos ocupan se realiza a través de ciertos objetos concretos como se verá a continuación. Por ello se incluyen diversos apartados relacionados con la declaración y uso de dichos objetos de manera programática y declarativa.
  • 5. Gestión de properties 2/15 2 Gestión mediante anotaciones (modo programático) 2.1 Declaración Spring y por tanto UDA, permiten el uso de anotaciones para la declaración de objetos en un “repositorio de beans” de Spring. Cuando se desee utilizar alguno de estos objetos bastará con recuperarlo e invocar la función correspondiente a través de la Inyección de Dependencia (ID). Existen ciertas anotaciones que permiten que Spring incluya ciertas clases Java directamente como objetos en el respositorio y estas son algunas de ellas: @Controller @Service @Repository @Component El plugin de generación de código de UDA permite seleccionar el uso de anotaciones para la resolución de las dependencias. En caso de seleccionar esta opción, en cada controlador, servicio o DAO se incluirá su correspondiente anotación (para los DAO se utiliza la anotación @Repository). Una vez las clases estén implementadas (con su anotación correspondiente), Spring tiene que cargarlos en su repositorio para poder ser utilizados a través de la ID. El fichero de configuración incluirá un tag que le indica el paquete desde el que tiene que recorrer los subpaquetes localizando las clases Java para incluir como objetos del repositorio aquellas anotadas correctamente. Controllers (WAR) o xxxNombreWarWebContentWEB-INFspringmvc-config.xml o <context:component-scan base-package="com.ejie.x21a.control" /> Servicios (EAR) o xxxEARClassessrcspringservice-config.xml o <context:component-scan base-package="com.ejie.x21a.service" /> DAOs (EAR) o xxxEARClassessrcspringdao-config.xml o <context:component-scan base-package="com.ejie.x21a.dao" /> Adicionalmente, Spring comprobará las anotaciones internas de cada clase resolviendo las dependencias que encuentre como se explica en el siguiente apartado. 2.2 Inyección La inyección de dependencia de los objetos de manera programática se realiza del siguiente modo: @Autowired private Properties appConfiguration; Mediante esta anotación Spring buscará en su repositorio de beans algún objeto cuyo ID sea appConfiguration y enlazará la variable declarada con dicho objeto. Se podrá utilizar directamente el objeto appConfiguration sin tener que inicializarlo ya que Spring lo habrá realizado por nosotros.
  • 6. Gestión de properties 3/15 3 Gestión mediante XML (modo declarativo) 3.1 Declaración La declaración de objetos en Spring puede realizarse a través del fichero XML ya que hasta la versión 5 de Java no existía soporte para anotaciones. Por cada objeto que se quiera declarar en el repositorio de beans de Spring deberá incluir una sentencia como la siguiente: <bean id="NOMBRE_DEL_OBJETO" class="RUTA_DEL_OBJETO"> <property name="xxa" ref="yyy" /> <property name="xxb" value="zzz" /> … </bean> NOMBRE_DEL_OBJETO: Identificador con el que se va a registrar el objeto (se utilizará para reverenciarlo o recuperarlo) RUTA_DEL_OBJETO: Nombre completo de la clase que implementa el objeto (incluyendo paquete) xxa: Nombre de las propiedad del objeto donde se va a inyectar el objeto yyy. yyy: Objeto del repositorio de beans de Spring a inyectar en el objeto que se está declarando. xxb: Nombre de la propiedad a la que se le va a asignar el valor zzz. zzz: Valor que se asociadrá directamente a la propiedad xxx2 UDA declara los objetos empleados para la gestión de propiedades mediante XML como se verá más adelante. A pesar de que los objetos se declaren en el XML, puede utilizarse la anotación @Autowired para inyectarlos allí donde sean necesarios. 3.2 Inyección La inyección de dependencia de los objetos de manera programática se realiza a través del método set de la variable. private Properties appConfiguration; public void setAppConfiguration(Properties appConfiguration) { this.appConfiguration = appConfiguration; } Cuando Spring esté registrando los objetos en su repositorio y detecte que un objeto define una propiedad que es una referencia a otro objeto, intentetará invocar el metodo set de esa propiedad. En el siguiente ejemplo, Spring al cargar el objeto “example” implementado en el fichero “com.ejie.xxx.Foo” invocará el método setAppConfiguration para inyectarle el objeto. Se podrá utilizar directamente el objeto appConfiguration sin tener que inicializarlo ya que Sprin lo habrá realizado por nosotros. <bean id="example" class="com.ejie.xxx.Foo"> <property name="appConfiguration" ref="appConfiguration" /> </bean>
  • 7. Gestión de properties 4/15 4 Propiedades de aplicación Las aplicaciones desarrolladas con UDA contienen un fichero de propiedades de aplicación denominado aaa.properties (ej. x21a.properties) alojado en /config/aaa. Dicho fichero contiene valores que dependen del entorno en el que se trabaja pero no de la versión idomática. Un claro ejemplo puede ser la ruta en la que se alojan el contenido estático de la aplicación: foo=bar El acceso a este tipo de propiedades se realizará a través de la variable appConfiguration declarada en el fichero xxxEARClassessrcspringservice-config.xml: <bean id="appConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="location" value="classpath:x21a/x21a.properties" /> <property name="fileEncoding" value="UTF-8" /> </bean> Acceso desde clase Java o Declarar la propiedad (consultar apartados 2.1 y 3.1) private Properties appConfiguration; o Acceso directo a la propiedad a recuperar appConfiguration.get("foo") Acceso desde JSP o Guardar propiedad en el Model (en el controller) model.addAttribute("foo", "bar"); o Acceso medienta EL (Expression Language) ${foo}
  • 8. Gestión de properties 5/15 5 Propiedades idiomáticas (i18n) La gestión idiomática (i18n) se realiza a tarvés de diferentes ficheros de propiedades (uno por cada idioma de la aplicación). Un claro ejemplo puede ser el literal de la pantalla de inicio: welcome.title=Hello EJIE! Estos ficheros existen a varios niveles (EAR y WAR) y por tanto en diferentes localizaciones como veremos a continuación. 5.1 Propiedades del EAR Los ficheros de propiedades del EAR se encuentran en la siguiente ruta: xxxEARClassesresources o xxx.i18n_en.properties o xxx.i18n_es.properties o xxx.i18n_eu.properties o … El acceso a las propiedades del EAR se realizará a través de la variable appMessageSource declarada en el fichero xxxEARClassessrcspringservice-config.xml: <bean id="appMessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSo urce"> <property name="basename" value="x21a.i18n" /> <property name="defaultEncoding" value="UTF-8" /> <property name="useCodeAsDefaultMessage" value="true" /> <property name="fallbackToSystemLocale" value="false" /> </bean> Acceso desde clase Java o Declarar la propiedad (consultar apartados 2.1 y 3.1) private ReloadableResourceBundleMessageSource appMessageSource; o Acceso directo a la propiedad a recuperar appMessageSource.getMessage("welcome.title", args, locale) args: Array de argumentos de la propiedad (ej. {0}, {1}, … {n}). En caso de no tener se pasará null La locale se puede obtener como variable directamente o como parámetro de un método: o Locale locale = LocaleContextHolder.getLocale(); o public void xxx (Locale locale) { ... } Acceso desde JSP o Incluir el fichero TLD de Spring (se incluye en el fichero ‘includeTemplate.inc’) <%@ taglib prefix="spring" uri="/WEB-INF/tld/spring.tld" %>
  • 9. Gestión de properties 6/15 o Acceso a la propiedad mediante el tag de Spring <spring:message code="welcome.title" /> UDA incluye automáticamente la TLD de Spring en el fichero ‘includeTemplate.inc’ en la ruta xxxNombreWarWebContentWEB-INF por lo que bastará con incluir dicho fichero: <%@include file="/WEB-INF/includeTemplate.inc"%> 5.2 Propiedades del WAR Los ficheros de propiedades del WAR se encuentran en la siguiente ruta: xxxNombreWarWebContentWEB-INFresources o xxxNombreWar.i18n_en.properties o xxxNombreWar.i18n_es.properties o xxxNombreWar.i18n_eu.properties o … Las propiedades definidas a nivel de WAR solo pueden ser accedidas desde el propio WAR, en cambio las propiedades definidas a nivel de EAR pueden ser accedidas desde cualquier capa (Presentación, Servicios, Acceso a datos, …). La resolución de una propiedad desde el WAR sigue el siguiente orden. Primero se comprueba que la propiedad exista en sus ficheros de recursos y en caso afirmativo se recuperará. Si por el contrario no existe se buscará en los ficheros de recursos del EAR. De esta manera en caso de necesitar identicos literales a nivel de EAR y de los diferentes WAR bastará con definirlos únicamente en el fichero de recursos del EAR. El acceso a las propiedades del WAR se realizará a través de la variable messageSource declarada en el fichero xxxNombreWarWebContentWEB-INFspringmvc-config.xml: <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSo urce"> <property name="parentMessageSource" ref="appMessageSource" /> <property name="basename" value="/WEB- INF/resources/x21aPilotoPatrones.i18n" /> <property name="defaultEncoding" value="UTF-8" /> <property name="useCodeAsDefaultMessage" value="true" /> <property name="fallbackToSystemLocale" value="false" /> </bean> Acceso desde clase Java o Declarar la propiedad (consultar apartados 2.1 y 3.1) private ReloadableResourceBundleMessageSource messageSource; o Acceso directo a la propiedad a recuperar messageSource.getMessage("welcome.title", args, locale) args: Array de argumentos de la propiedad (ej. {0}, {1}, … {n}). En caso de no tener se pasará null La locale se puede obtener como variable directamente o como parámetro de un método:
  • 10. Gestión de properties 7/15 o Locale locale = LocaleContextHolder.getLocale(); o public void xxx (Locale locale) { ... } Acceso desde JSP o Incluir el fichero TLD de Spring (se incluye en el fichero ‘includeTemplate.inc’) <%@ taglib prefix="spring" uri="/WEB-INF/tld/spring.tld" %> o Acceso a la propiedad mediante el tag de Spring <spring:message code="welcome.title" /> UDA incluye automáticamente la TLD de Spring en el fichero ‘includeTemplate.inc’ en la ruta xxxNombreWarWebContentWEB-INF por lo que bastará con incluir dicho fichero: <%@include file="/WEB-INF/includeTemplate.inc"%>
  • 11. Gestión de properties 8/15 6 Uso de propiedades en clases de utilidades El acceso y explotación de propiedades desde las clases de las capas de presentación (controllers), servicio (services) o acceso a datos (daos) es directo ya que UDA deja todo configurado directamente. Y dependiendo de cómo se generara el código a través del plugin de UDA se deberá realizar lo siguiente: Anotaciones o Incluir la anotación @Autowired delante del objeto o Asegurarse de que el paquete en el que se encuentra la clase está en el scan (por defecto sí) XML o Incluir el método set de la aplicación o Configurar la propiedad del objeto en el fichero XML correspondiente (tag property) El problema puede existir cuando se utilizan clases propias de ayuda (paquetes de utilidades) que al no configurarse correctamente pueden inducir a error y generar problemas. A continuación se muestra un ejemplo detallando esta casuística. Se creará una clase de utilidades cuya función recupere un valor de una propiedad de aplicación (para i18n sería idéntico) y lo escriba en el log: package com.ejie.xxx; //imports public class Foo { private static final Logger logger = ...; //Declaración de appConfiguration (ver apartado 6.1) public void do(){ logger.info(appConfiguration.get("bar")); } } 6.1 Declaración del objeto a consumir A continuación se detalla como debería declararse la variable appConfiguration dependiendo del tipo de variable (de instancia o de clase que dependerá del tipo de método a implementar) y de si se usan anotaciones o XML: Anotaciones o Variable de instancia @Autowired private Properties appConfiguration; o Variable de clase private static Properties appConfiguration; @Autowired public void setAppConfiguration(Properties appConfiguration){ Foo.appConfiguration = appConfiguration;
  • 12. Gestión de properties 9/15 } XML o Variable de instancia private Properties appConfiguration; public void setAppConfiguration(Properties appConfiguration) { this.appConfiguration = appConfiguration; } o Variable de clase private static Properties appConfiguration; public void setAppConfiguration(Properties appConfiguration){ Foo.appConfiguration = appConfiguration; } NOTA: En caso de que la variable se declare de clase, habrá que modificar el método para añadirle el modificador static. 6.2 Configuración de la clase para la inyección de dependencia En el caso de que utilicen anotaciones como la clase se encuentra fuera de los paquetes generados y escaneados por UDA (control, service y dao) se deberán realizar dos modificaciones: 1. Se deberá anotar la clase con el modificador @Component @Component public class Foo ... 2. Se deberá incluir el escaneo del paquete en el fichero xml correspondiente (dependiendo de su localización en el mvc-config [WAR], service-config [EAR] o dao-config [EAR]). Por ejemplo si lo incluyeramos en el mvc-config (ya que la clase la desplegaremos en el WAR): <context:component-scan base-package=" com.ejie.x21a.control, com.ejie.xxx" /> Si por el contrario se utiliza XML para la configuración de objetos, se deberá incluir la definición del bean en el xml para que Spring inyecte la dependencia a través del setter: <bean id="foo" class="com.ejie.xxx.Foo"> <property name="appConfiguration" ref="appConfiguration" /> </bean> 6.3 Consumo de la clase de utilidades Una vez declarada la clase de utilidades con su objeto de acceso a las propiedades, será turno de realizar la invocación, por ejemplo desde un controlador. En el caso de que el método de utilidades sea estático bastará con invocarlo de la siguiente manera:
  • 13. Gestión de properties 10/15 @RequestMapping(method = RequestMethod.GET) public String getXXX(Model model) { Foo.do(); } NOTA: Podría inyectarse el objeto como variable del controller e invocar el método sobre esa instancia del objeto pero daría un warning por la manera de invocar el método por lo que se descarta. En el caso de que el método de utilidades sea dinámico, podría invocarse de alguna de las siguientes maneras: 1. Inyectando el objeto (mediante anotación o xml) e invocando el método directamente XML private Foo foo; public void setFoo (Foo foo) { this.foo = foo; } @RequestMapping(method = RequestMethod.GET) public String getXXX(Model model) { foo.do(); } Habría que declarar la inyección de la variable en el fichero XML <bean id="fooController" class="com.ejie.xxx.control.FooController"> <property name="foo" ref="foo" /> </bean> Anotación @Autowired private Foo foo; @RequestMapping(method = RequestMethod.GET) public String getXXX(Model model) { foo.do(); } 2. Creando una instancia de la clase de utilidades e invocando el método @RequestMapping(method = RequestMethod.GET) public String getXXX(Model model) { Foo foo = new Foo(); foo.do(); }
  • 14. Gestión de properties 11/15 En este segundo caso (al invocar el constructor directamente) el objeto foo inicializará su variable interna appConfig a null por lo que en la invocación del método se lanzará una excepción (NullPointerException). Para evitar esto bastará con modificar la clase de utilidades para que extienda de “SpringBeanAutowiringSupport” del siguiente modo: public class Foo extends SpringBeanAutowiringSupport { ... } 6.4 Corolario Para evitar inconsistencias y problemas de esta índole, se recomienda el uso de anotaciones para la inyección de dependencia y evitar el uso de bloques estáticos (static) en la medida de lo posible. Esto se justifica porque Spring instancia sus beans siguiendo el patrón singleton por lo que internamente se crean una única vez. SpringSource.org también es partidario de seguir estas pautas en el desarrollo de aplicaciones porque este tipo de bloques pueden generar problemas al integrarse con Spring.
  • 15. Gestión de properties 12/15 7 Conclusiones La explotación de los ficheros de properties en UDA se realiza a través de objetos es idéntica a la explotación de cualquier objeto en Spring. Una vez que se configuran los objetos encargados de su gestión (appConfiguration, appMessageSource y messageSource), su explotación como se ha visto en este documento es fácil y sencilla. Independientemente del modo en el que se trabaje (anotaciones o a través de xml) el acceso a las propiedades es idéntica y no presenta grandes problemas. El único problema o complejidad puede presentarse cuando se utilizan clases de utilidades (clases que no entran en las capas de presentación, servicios y acceso a datos) que habrá que configurar manualmente (al igual que habría que hacer con el resto de clases si no utilizamos el plugin de UDA).