<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>https://dosideas.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin</id>
		<title>Dos Ideas. - Contribuciones del usuario [es]</title>
		<link rel="self" type="application/atom+xml" href="https://dosideas.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin"/>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/Especial:Contribuciones/Admin"/>
		<updated>2026-05-06T15:17:12Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=P%C3%A1gina_Principal&amp;diff=6943</id>
		<title>Página Principal</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=P%C3%A1gina_Principal&amp;diff=6943"/>
				<updated>2017-05-03T23:31:58Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Bienvenido a la Wiki de Dos Ideas, un lugar para compartir experiencias concretas del mundo profesional de Sistemas. Aquí podremos volcar conocimientos y ejemplos de diversas tecnologías, aplicadas a  cuestiones prácticas.&lt;br /&gt;
&lt;br /&gt;
La wiki de Dos Ideas contiene información sobre el proceso completo del desarrollo de sistemas. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;85%&amp;quot; align=&amp;quot;center&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:Desarrollo-de-software-azul.png|center|Desarrollo de software&lt;br /&gt;
default  [[Desarrollo De Software]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt; &lt;br /&gt;
&amp;lt;p align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:large&amp;quot;&amp;gt;'''[[Desarrollo De Software]]'''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 || &amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:Metodologias-de-desarrollo-azul.png|center|Metodologias de desarrollo&lt;br /&gt;
default  [[Metodologias De Desarrollo]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt;&lt;br /&gt;
&amp;lt;p align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:large&amp;quot;&amp;gt;'''[[Metodologias De Desarrollo]]'''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 || &amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:Personas-azul.png|center|Conformación de equipos&lt;br /&gt;
default  [[Conformación de equipos]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt;&lt;br /&gt;
&amp;lt;p align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:large&amp;quot;&amp;gt;'''[[Conformación de equipos]]'''&amp;lt;/p&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tagcloud&amp;gt;&lt;br /&gt;
increase_factor=300&lt;br /&gt;
&amp;lt;/tagcloud&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=P%C3%A1gina_Principal&amp;diff=6942</id>
		<title>Página Principal</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=P%C3%A1gina_Principal&amp;diff=6942"/>
				<updated>2017-05-03T23:31:32Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Bienvenido a la Wiki de Dos Ideas, un lugar para compartir experiencias concretas del mundo profesional de Sistemas. Aquí podremos volcar conocimientos y ejemplos de diversas tecnologías, aplicadas a  cuestiones prácticas.&lt;br /&gt;
&lt;br /&gt;
La wiki de Dos Ideas contiene información sobre el proceso completo del desarrollo de sistemas. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;85%&amp;quot; align=&amp;quot;center&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 | [[Archivo:Desarrollo-de-software-azul.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:Desarrollo-de-software-azul.png|center|Desarrollo de software&lt;br /&gt;
default  [[Desarrollo De Software]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt; &lt;br /&gt;
&amp;lt;p align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:large&amp;quot;&amp;gt;'''[[Desarrollo De Software]]'''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 || &amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:Metodologias-de-desarrollo-azul.png|center|Metodologias de desarrollo&lt;br /&gt;
default  [[Metodologias De Desarrollo]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt;&lt;br /&gt;
&amp;lt;p align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:large&amp;quot;&amp;gt;'''[[Metodologias De Desarrollo]]'''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 || &amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:Personas-azul.png|center|Conformación de equipos&lt;br /&gt;
default  [[Conformación de equipos]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt;&lt;br /&gt;
&amp;lt;p align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:large&amp;quot;&amp;gt;'''[[Conformación de equipos]]'''&amp;lt;/p&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tagcloud&amp;gt;&lt;br /&gt;
increase_factor=300&lt;br /&gt;
&amp;lt;/tagcloud&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=MediaWiki:Mainpage&amp;diff=6941</id>
		<title>MediaWiki:Mainpage</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=MediaWiki:Mainpage&amp;diff=6941"/>
				<updated>2017-05-02T22:56:18Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Página creada con «Página Principal»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Página Principal&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Liferay_Portal&amp;diff=6834</id>
		<title>Liferay Portal</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Liferay_Portal&amp;diff=6834"/>
				<updated>2013-07-17T17:44:13Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Componentes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Portlet]]&lt;br /&gt;
Liferay Portal es un [[Administrador De Contenidos]] de [[Software Libre]] basado en Java, que cumple con la [[Portlet Specification Api]].&lt;br /&gt;
&lt;br /&gt;
Entre las características principales se destacan:&lt;br /&gt;
* Administrador de contenidos (CMS) y una Suite de colaboración&lt;br /&gt;
* Varios porlets integrados listos para usar&lt;br /&gt;
* Herramientas de desarrollo&lt;br /&gt;
* Traducción a 22 idiomas&lt;br /&gt;
* Funciona con los principales [[Servidor de Aplicaciones]], bases de datos y sistemas operativos.&lt;br /&gt;
&lt;br /&gt;
== Conceptos de estilos y disposición ==&lt;br /&gt;
=== Tema (Theme) ===&lt;br /&gt;
Vamos a ver los conceptos de Tema (Theme), Disposición (Layout).&lt;br /&gt;
&lt;br /&gt;
Un '''Tema (o Theme)''' es el encargado de renderizar la página en su totalidad, e incluye los aspectos visuales generales del sitio. Un Tema incluye los JavaScript generales, los CSS, y seguramente también el logo del sitio, el menú general, el pie de página, etc. El Tema define un área donde se ubicará el contenido. &lt;br /&gt;
&lt;br /&gt;
Al crear un Tema en realidad se suele &amp;quot;heredar&amp;quot; de algún tema ya existente. Liferay trae 2 temas ya preparados para heredar: &amp;quot;_styled&amp;quot; (del que suele heredarse) y &amp;quot;_unstyled&amp;quot; (que es aún más básico). Se puede consultar el código de estos temas en &amp;lt;LIFERAY_WEBAPP&amp;gt;/html/themes&lt;br /&gt;
&lt;br /&gt;
=== Disposición (layout) ===&lt;br /&gt;
Un Tema declara un área donde se ubicará el contenido. Este área de contenido puede tener distintas disposiciones (2 columnas, 3 columnas, etc.); esta disposición se conoce como Layout. Cada página en Liferay puede tener un Layout asociado. &lt;br /&gt;
&lt;br /&gt;
Liferay ya trae varios Layouts comunes declarados, y pueden crearse nuevos. Se puede consultar el código de estos temas en &amp;lt;LIFERAY_WEBAPP&amp;gt;/layouttpl&lt;br /&gt;
&lt;br /&gt;
== Conceptos de gestión de contenidos ==&lt;br /&gt;
Liferay permite manejar dos grandes conceptos para gestionar el contenido de una página:&lt;br /&gt;
* Estructuras&lt;br /&gt;
* Listas dinámicas&lt;br /&gt;
&lt;br /&gt;
=== Estructuras ===&lt;br /&gt;
Se pueden crear estructuras de datos para que el usuario complete y pueda cambiar facilmente contenido de la página sin tocar HTML. Una estructura tiene asociado una Plantilla (Template) que indica cómo se renderiza el contenido de una Estructura. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, puede crearse una estructura Promocion, que contenga un título y una imagen. Luego, se puede crear una Plantilla para la estructura Promoción que renderiza dicha estructura mostrando la imagen y el título debajo. &lt;br /&gt;
&lt;br /&gt;
Al usuario final le quedan entonces 2 pasos para completar: &lt;br /&gt;
1. Instanciar la estructura para agregarle datos. &lt;br /&gt;
2. Ubicar la estructura instanciada en alguna posición de la página.&lt;br /&gt;
&lt;br /&gt;
Las estructuras, plantillas y instancias de estructras se gestionan desde el Control Panel &amp;gt; Site &amp;gt; Web Content.&lt;br /&gt;
&lt;br /&gt;
=== Listas dinámicas ===&lt;br /&gt;
Se pueden crear listas de contenido variable, para que el usuario agregue como si de una lista se tratara. Las listas son de un tipo de dato en particular (el cual se configura al igual que una estructura), y se les asocia una plantilla para renderizar la lista (y opcionalmente, una plantilla para renderizar el formulario de ingreso de un dato de la lista). &lt;br /&gt;
&lt;br /&gt;
Las listas dinámicas se gestionan desde el Control Panel &amp;gt; Site &amp;gt; Dynamic Data Lists&lt;br /&gt;
&lt;br /&gt;
Leer más sobre [http://www.liferay.com/es/documentation/liferay-portal/6.1/user-guide/-/ai/make-it-pretty-creating-custom-displays Crear y estilar listas dinámicas en Liferay].&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://www.liferay.com Web oficial de Liferay Portal]&lt;br /&gt;
* [http://wiki.liferay.com/index.php/Main_Page Wiki oficial de Liferay ]&lt;br /&gt;
&lt;br /&gt;
== Componentes ==&lt;br /&gt;
* [[Carrusel con limite en Liferay]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Carrusel_con_limite&amp;diff=6833</id>
		<title>Carrusel con limite</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Carrusel_con_limite&amp;diff=6833"/>
				<updated>2013-07-17T17:43:32Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Carrusel con limite trasladada a Carrusel con limite en Liferay:&amp;amp;#32;Agregada la palabra &amp;quot;Liferay&amp;quot; al título.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECCIÓN [[Carrusel con limite en Liferay]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Carrusel_con_limite_en_Liferay&amp;diff=6832</id>
		<title>Carrusel con limite en Liferay</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Carrusel_con_limite_en_Liferay&amp;diff=6832"/>
				<updated>2013-07-17T17:43:32Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Carrusel con limite trasladada a Carrusel con limite en Liferay:&amp;amp;#32;Agregada la palabra &amp;quot;Liferay&amp;quot; al título.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un carrusel de imagenes personalizable para [[Liferay Portal]] con soporte para IE7+/Firefox/Chrome.&lt;br /&gt;
Los aspectos personalizables son: &lt;br /&gt;
&lt;br /&gt;
* La cantidad maxima de imagenes a mostrar.&lt;br /&gt;
* El intervalo de tiempo de transicion entre imagenes.&lt;br /&gt;
* La carga de imagenes con o sin link.&lt;br /&gt;
&lt;br /&gt;
== Implementación ==&lt;br /&gt;
&lt;br /&gt;
Utilizamos una estructura y template de Liferay. La estructura es un archivo XML y el template es un archivo velocity. &lt;br /&gt;
La estructura es la que define los campos que necesita el web content para crearse. Luego el template de velocity renderiza la estructura mencionada anteriormente.&lt;br /&gt;
Para implementarlo utilizamos como base el carrusel que provee Bootstrap. Dicho carrusel se caracteriza por ser responsive.&lt;br /&gt;
Para que además sea compatible con IE7+, utilizamos la libreria &amp;quot;respond.js&amp;quot; y algunos meta-tags html. El head debe tener lo siguiente:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;css/bootstrap/bootstrap.css&amp;quot; media=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;css/bootstrap/bootstrap-responsive.css&amp;quot; media=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;IE=8&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;IE=EmulateIE8&amp;quot; &amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;IE=EmulateIE7&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script src='js/lib/jquery-1.10.1.min.js' type='text/javascript'&amp;gt; &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src='js/lib/bootstrap.min.js' type='text/javascript' &amp;gt; &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src='js/lib/respond.min.js' type='text/javascript' &amp;gt; &amp;lt;/script&amp;gt;&lt;br /&gt;
 &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hay que tener en cuenta que respond.js debe cargarse luego de la libreria de jquery y bootstrap.&lt;br /&gt;
&lt;br /&gt;
Además, para que el estilo &amp;quot;Opacity&amp;quot; sea soportado por IE7+, utilizamos el estilo: Alpha(Opacity=100).&lt;br /&gt;
Por ejemplo, si necesitamos que nuestro div tenga una opacidad del 50%:&lt;br /&gt;
&lt;br /&gt;
 div{&lt;br /&gt;
  filter: Alpha(Opacity=50);&lt;br /&gt;
  opacity: 0.5;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Para que se puedan cargar varios carruseles en la misma página, el id identificador de cada instancia esta representado  por el id de la estructura(ej: &amp;quot;carrusel&amp;quot;), y &lt;br /&gt;
por el titulo del web-content (ej:&amp;quot;web-content-1&amp;quot;), siendo el id resultante &amp;quot;carrusel-web-content-1&amp;quot;. Esto convierte a cada instancia del carrusel en única siempre y cuando&lt;br /&gt;
los titulos de los web-content sean diferentes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Conclusión ==&lt;br /&gt;
En nuestra busqueda de implementaciones para carruseles encontramos que mucho de ellos no eran soportados por IE7+ y/o no eran responsives &lt;br /&gt;
(ej: rcarousel, FlexSlider ). Otros, en cambio,si cumplian las características anteriores pero eran demasiado complejos de personalizar.&lt;br /&gt;
Al encontrar la libreria respond.js, tomamos la alternativa del carrusel de bootstrap ya que puede ser soportado por IE7+, responsive y es facilmente personalizable.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Carrusel_con_limite_en_Liferay&amp;diff=6831</id>
		<title>Carrusel con limite en Liferay</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Carrusel_con_limite_en_Liferay&amp;diff=6831"/>
				<updated>2013-07-17T17:41:12Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Descripción */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un carrusel de imagenes personalizable para [[Liferay Portal]] con soporte para IE7+/Firefox/Chrome.&lt;br /&gt;
Los aspectos personalizables son: &lt;br /&gt;
&lt;br /&gt;
* La cantidad maxima de imagenes a mostrar.&lt;br /&gt;
* El intervalo de tiempo de transicion entre imagenes.&lt;br /&gt;
* La carga de imagenes con o sin link.&lt;br /&gt;
&lt;br /&gt;
== Implementación ==&lt;br /&gt;
&lt;br /&gt;
Utilizamos una estructura y template de Liferay. La estructura es un archivo XML y el template es un archivo velocity. &lt;br /&gt;
La estructura es la que define los campos que necesita el web content para crearse. Luego el template de velocity renderiza la estructura mencionada anteriormente.&lt;br /&gt;
Para implementarlo utilizamos como base el carrusel que provee Bootstrap. Dicho carrusel se caracteriza por ser responsive.&lt;br /&gt;
Para que además sea compatible con IE7+, utilizamos la libreria &amp;quot;respond.js&amp;quot; y algunos meta-tags html. El head debe tener lo siguiente:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;css/bootstrap/bootstrap.css&amp;quot; media=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;css/bootstrap/bootstrap-responsive.css&amp;quot; media=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;IE=8&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;IE=EmulateIE8&amp;quot; &amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;IE=EmulateIE7&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script src='js/lib/jquery-1.10.1.min.js' type='text/javascript'&amp;gt; &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src='js/lib/bootstrap.min.js' type='text/javascript' &amp;gt; &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src='js/lib/respond.min.js' type='text/javascript' &amp;gt; &amp;lt;/script&amp;gt;&lt;br /&gt;
 &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hay que tener en cuenta que respond.js debe cargarse luego de la libreria de jquery y bootstrap.&lt;br /&gt;
&lt;br /&gt;
Además, para que el estilo &amp;quot;Opacity&amp;quot; sea soportado por IE7+, utilizamos el estilo: Alpha(Opacity=100).&lt;br /&gt;
Por ejemplo, si necesitamos que nuestro div tenga una opacidad del 50%:&lt;br /&gt;
&lt;br /&gt;
 div{&lt;br /&gt;
  filter: Alpha(Opacity=50);&lt;br /&gt;
  opacity: 0.5;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Para que se puedan cargar varios carruseles en la misma página, el id identificador de cada instancia esta representado  por el id de la estructura(ej: &amp;quot;carrusel&amp;quot;), y &lt;br /&gt;
por el titulo del web-content (ej:&amp;quot;web-content-1&amp;quot;), siendo el id resultante &amp;quot;carrusel-web-content-1&amp;quot;. Esto convierte a cada instancia del carrusel en única siempre y cuando&lt;br /&gt;
los titulos de los web-content sean diferentes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Conclusión ==&lt;br /&gt;
En nuestra busqueda de implementaciones para carruseles encontramos que mucho de ellos no eran soportados por IE7+ y/o no eran responsives &lt;br /&gt;
(ej: rcarousel, FlexSlider ). Otros, en cambio,si cumplian las características anteriores pero eran demasiado complejos de personalizar.&lt;br /&gt;
Al encontrar la libreria respond.js, tomamos la alternativa del carrusel de bootstrap ya que puede ser soportado por IE7+, responsive y es facilmente personalizable.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Liferay_Portal&amp;diff=6827</id>
		<title>Liferay Portal</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Liferay_Portal&amp;diff=6827"/>
				<updated>2013-07-01T18:13:59Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Portlet]]&lt;br /&gt;
Liferay Portal es un [[Administrador De Contenidos]] de [[Software Libre]] basado en Java, que cumple con la [[Portlet Specification Api]].&lt;br /&gt;
&lt;br /&gt;
Entre las características principales se destacan:&lt;br /&gt;
* Administrador de contenidos (CMS) y una Suite de colaboración&lt;br /&gt;
* Varios porlets integrados listos para usar&lt;br /&gt;
* Herramientas de desarrollo&lt;br /&gt;
* Traducción a 22 idiomas&lt;br /&gt;
* Funciona con los principales [[Servidor de Aplicaciones]], bases de datos y sistemas operativos.&lt;br /&gt;
&lt;br /&gt;
== Conceptos de estilos y disposición ==&lt;br /&gt;
=== Tema (Theme) ===&lt;br /&gt;
Vamos a ver los conceptos de Tema (Theme), Disposición (Layout).&lt;br /&gt;
&lt;br /&gt;
Un '''Tema (o Theme)''' es el encargado de renderizar la página en su totalidad, e incluye los aspectos visuales generales del sitio. Un Tema incluye los JavaScript generales, los CSS, y seguramente también el logo del sitio, el menú general, el pie de página, etc. El Tema define un área donde se ubicará el contenido. &lt;br /&gt;
&lt;br /&gt;
Al crear un Tema en realidad se suele &amp;quot;heredar&amp;quot; de algún tema ya existente. Liferay trae 2 temas ya preparados para heredar: &amp;quot;_styled&amp;quot; (del que suele heredarse) y &amp;quot;_unstyled&amp;quot; (que es aún más básico). Se puede consultar el código de estos temas en &amp;lt;LIFERAY_WEBAPP&amp;gt;/html/themes&lt;br /&gt;
&lt;br /&gt;
=== Disposición (layout) ===&lt;br /&gt;
Un Tema declara un área donde se ubicará el contenido. Este área de contenido puede tener distintas disposiciones (2 columnas, 3 columnas, etc.); esta disposición se conoce como Layout. Cada página en Liferay puede tener un Layout asociado. &lt;br /&gt;
&lt;br /&gt;
Liferay ya trae varios Layouts comunes declarados, y pueden crearse nuevos. Se puede consultar el código de estos temas en &amp;lt;LIFERAY_WEBAPP&amp;gt;/layouttpl&lt;br /&gt;
&lt;br /&gt;
== Conceptos de gestión de contenidos ==&lt;br /&gt;
Liferay permite manejar dos grandes conceptos para gestionar el contenido de una página:&lt;br /&gt;
* Estructuras&lt;br /&gt;
* Listas dinámicas&lt;br /&gt;
&lt;br /&gt;
=== Estructuras ===&lt;br /&gt;
Se pueden crear estructuras de datos para que el usuario complete y pueda cambiar facilmente contenido de la página sin tocar HTML. Una estructura tiene asociado una Plantilla (Template) que indica cómo se renderiza el contenido de una Estructura. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, puede crearse una estructura Promocion, que contenga un título y una imagen. Luego, se puede crear una Plantilla para la estructura Promoción que renderiza dicha estructura mostrando la imagen y el título debajo. &lt;br /&gt;
&lt;br /&gt;
Al usuario final le quedan entonces 2 pasos para completar: &lt;br /&gt;
1. Instanciar la estructura para agregarle datos. &lt;br /&gt;
2. Ubicar la estructura instanciada en alguna posición de la página.&lt;br /&gt;
&lt;br /&gt;
Las estructuras, plantillas y instancias de estructras se gestionan desde el Control Panel &amp;gt; Site &amp;gt; Web Content.&lt;br /&gt;
&lt;br /&gt;
=== Listas dinámicas ===&lt;br /&gt;
Se pueden crear listas de contenido variable, para que el usuario agregue como si de una lista se tratara. Las listas son de un tipo de dato en particular (el cual se configura al igual que una estructura), y se les asocia una plantilla para renderizar la lista (y opcionalmente, una plantilla para renderizar el formulario de ingreso de un dato de la lista). &lt;br /&gt;
&lt;br /&gt;
Las listas dinámicas se gestionan desde el Control Panel &amp;gt; Site &amp;gt; Dynamic Data Lists&lt;br /&gt;
&lt;br /&gt;
Leer más sobre [http://www.liferay.com/es/documentation/liferay-portal/6.1/user-guide/-/ai/make-it-pretty-creating-custom-displays Crear y estilar listas dinámicas en Liferay].&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://www.liferay.com Web oficial de Liferay Portal]&lt;br /&gt;
* [http://wiki.liferay.com/index.php/Main_Page Wiki oficial de Liferay ]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Desarrollo_De_Software&amp;diff=6763</id>
		<title>Desarrollo De Software</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Desarrollo_De_Software&amp;diff=6763"/>
				<updated>2013-02-18T12:58:32Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;El desarrollo de software involucra no sólo el uso de [[Metodologias De Desarrollo]], sino la aplicación de tecnologías de desarrollo y testing para asegurar la calidad del producto.&lt;br /&gt;
&lt;br /&gt;
== Libros ==&lt;br /&gt;
* [[Libros]]&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[HTML]]&lt;br /&gt;
* [[JavaScript]]&lt;br /&gt;
* [[Java]]&lt;br /&gt;
* [[Diseño De Software]]&lt;br /&gt;
* [[Patrones]]&lt;br /&gt;
* [[Testing De Aplicaciones]]&lt;br /&gt;
* [[Base De Datos]]&lt;br /&gt;
* [[Herramientas Para Gestion De Calidad]]&lt;br /&gt;
* [[Performance De Aplicaciones]]&lt;br /&gt;
* [[Spring Data]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=JavaScript&amp;diff=6762</id>
		<title>JavaScript</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=JavaScript&amp;diff=6762"/>
				<updated>2013-02-18T12:57:51Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:JavaScript]]&lt;br /&gt;
[[JavaScript]] es un lenguaje de programación interpretado, es decir, que no requiere compilación, utilizado principalmente en páginas web, con una sintaxis semejante a la del lenguaje Java y el lenguaje C.&lt;br /&gt;
&lt;br /&gt;
Al igual que [[Java]], [[JavaScript]] es un lenguaje orientado a objetos propiamente dicho, ya que dispone de Herencia, si bien esta se realiza siguiendo el paradigma de programación basada en prototipos, ya que las nuevas clases se generan clonando las clases base (prototipos) y extendiendo su funcionalidad.&lt;br /&gt;
&lt;br /&gt;
Todos los navegadores modernos interpretan el código [[JavaScript]] integrado dentro de las páginas web. Para interactuar con una página web se provee al lenguaje [[JavaScript]] de una implementación del DOM.&lt;br /&gt;
&lt;br /&gt;
==Frameworks==&lt;br /&gt;
[[JavaScript]] cuenta con infinidad de frameworks y librerias que otorgan diversa funcionalidad. Entre los más conocidos:&lt;br /&gt;
* [[JQuery]], un framework de aplicación base, sumamente extensible.&lt;br /&gt;
* [[Prototype]], un framework de aplicación base que permite definir clases, muy usado.&lt;br /&gt;
* [[Rico]], un framework de componentes de presentación [AJAX].&lt;br /&gt;
* [[Concurrent Thread Javascript]], librería para manejo de hilos.&lt;br /&gt;
&lt;br /&gt;
==Compatibilidad entre navegadores==&lt;br /&gt;
===Problemas con IE===&lt;br /&gt;
====Json is undefined====&lt;br /&gt;
La version de IE7 e IE8 no tiene importado de forma nativa las librerias de Json, por lo tanto hay que importarlas.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt; !--[if lt IE 8]&amp;gt;&lt;br /&gt;
     &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/js/json2.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
 &amp;lt;![endif]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bajar la libreria de json desde [[https://github.com/douglascrockford/JSON-js aca]].&lt;br /&gt;
&lt;br /&gt;
====Change event listener====&lt;br /&gt;
El comportamiento del listener del evento &amp;quot;change&amp;quot; cuando se lo bindeamos a un radio button es el siguiente:&lt;br /&gt;
&lt;br /&gt;
* en IE 7 el evento se dispara cuando el focus abandona el radio button.&lt;br /&gt;
&lt;br /&gt;
* en Firefox (3.x), Safari (3.x) y opera (96) el evento se dispara al momento de que el radio button es seleccionado, sin esperar a que el focus abandone el radio.&lt;br /&gt;
&lt;br /&gt;
Un workaround para que IE se comporte igual que el resto de los navegadores es el siguiente:&lt;br /&gt;
&lt;br /&gt;
 if ($.browser.msie) {&lt;br /&gt;
     $('input[name=radioXXX]').bind('click', function(){&lt;br /&gt;
       this.blur();&lt;br /&gt;
       this.focus();&lt;br /&gt;
     });&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 $('input[name=radioXXX]').bind('change', function(){&lt;br /&gt;
    ........;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [http://es.wikipedia.org/wiki/JavaScript JavaScript en la Wikipedia]&lt;br /&gt;
* [http://www.theserverside.com/tt/articles/article.tss?l=OOJavaScriptDemonstrated Conceptos y operaciones básicas]&lt;br /&gt;
* [[Test de javascript con QUnit]]&lt;br /&gt;
* [[Node.js]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=P%C3%A1gina_Principal&amp;diff=6761</id>
		<title>Página Principal</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=P%C3%A1gina_Principal&amp;diff=6761"/>
				<updated>2013-02-16T23:24:25Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Bienvenido a la Wiki de Dos Ideas, un lugar para compartir experiencias concretas del mundo profesional de Sistemas. Aquí podremos volcar conocimientos y ejemplos de diversas tecnologías, aplicadas a  cuestiones prácticas.&lt;br /&gt;
&lt;br /&gt;
La wiki de Dos Ideas contiene información sobre el proceso completo del desarrollo de sistemas. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;85%&amp;quot; align=&amp;quot;center&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:Desarrollo-de-software-azul.png|center|Desarrollo de software&lt;br /&gt;
default  [[Desarrollo De Software]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt; &lt;br /&gt;
&amp;lt;p align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:large&amp;quot;&amp;gt;'''[[Desarrollo De Software]]'''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 || &amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:Metodologias-de-desarrollo-azul.png|center|Metodologias de desarrollo&lt;br /&gt;
default  [[Metodologias De Desarrollo]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt;&lt;br /&gt;
&amp;lt;p align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:large&amp;quot;&amp;gt;'''[[Metodologias De Desarrollo]]'''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 || &amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:Personas-azul.png|center|Conformación de equipos&lt;br /&gt;
default  [[Conformación de equipos]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt;&lt;br /&gt;
&amp;lt;p align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:large&amp;quot;&amp;gt;'''[[Conformación de equipos]]'''&amp;lt;/p&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tagcloud&amp;gt;&lt;br /&gt;
increase_factor=300&lt;br /&gt;
&amp;lt;/tagcloud&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Spring_Data&amp;diff=6756</id>
		<title>Spring Data</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Spring_Data&amp;diff=6756"/>
				<updated>2013-01-18T15:53:00Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Proyecto de ejemplo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introducción==&lt;br /&gt;
La herramienta que encontramos útil para dejar de hacer manualmente las implementaciones de los DAO que suelen ser siempre de la misma manera, fué a través de Spring Data JPA. [http://www.springsource.org/spring-data/jpa|http://www.springsource.org/spring-data/jpa]&lt;br /&gt;
&lt;br /&gt;
Este framework nos permite, siguiendo una serie de normas que nos establece, crear interfaces de DAOs definiendo métodos y NO realizar ninguna implementación. Es decir, dejamos la responsabilidad de la implementación al framework, el cuál hará la implementación en tiempo de corrida.&lt;br /&gt;
Para ello, el framework básicamente lo que hace es buscar, dado un paquete que le indicamos por configuración, todas las interfaces que hereden de org.springframework.data.repository.Repository&amp;lt;T, ID extends Serializable&amp;gt; ya sea directa o indirectamente.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Spring-Data-JPA-Herencia repository.PNG]]&lt;br /&gt;
&lt;br /&gt;
==Configuración==&lt;br /&gt;
&lt;br /&gt;
===Dependencias (Utilizando Maven)===&lt;br /&gt;
Para trabajar con Spring Data JPA, solo debemos agregar la dependencia:&lt;br /&gt;
 &amp;lt;dependency&amp;gt;&lt;br /&gt;
      &amp;lt;groupId&amp;gt;org.springframework.data&amp;lt;/groupId&amp;gt;&lt;br /&gt;
      &amp;lt;artifactId&amp;gt;spring-data-jpa&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
      &amp;lt;version&amp;gt;1.0.3.RELEASE&amp;lt;/version&amp;gt;&lt;br /&gt;
 &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siempre y cuando contemos con una configuración de persistencia que utilice:&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;transactionManager&amp;quot; class=&amp;quot;org.springframework.orm.jpa.JpaTransactionManager&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;property name=&amp;quot;entityManagerFactory&amp;quot; ref=&amp;quot;entityManagerFactory&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;property name=&amp;quot;jpaDialect&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;bean class=&amp;quot;org.springframework.orm.jpa.vendor.HibernateJpaDialect&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/property&amp;gt;&lt;br /&gt;
 &amp;lt;/bean&amp;gt;&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;entityManagerFactory&amp;quot; class=&amp;quot;org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;property name=&amp;quot;dataSource&amp;quot; ref=&amp;quot;defaultDataSource&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;property name=&amp;quot;jpaVendorAdapter&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;bean class=&amp;quot;org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;property name=&amp;quot;generateDdl&amp;quot; value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
           &amp;lt;/bean&amp;gt;&lt;br /&gt;
      &amp;lt;/property&amp;gt;&lt;br /&gt;
  &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configurando el paquete a escanear===&lt;br /&gt;
&lt;br /&gt;
En el applicationContext.xml:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;br /&gt;
       xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
       xmlns:jpa=&amp;quot;http://www.springframework.org/schema/data/jpa&amp;quot;&lt;br /&gt;
       xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd&lt;br /&gt;
       http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    &amp;lt;!-- Declara los repositorios de datos. Se implementarán automáticamente todas&lt;br /&gt;
         las interfaces que hereden de Repository (o CrudRepository).&lt;br /&gt;
    --&amp;gt;&lt;br /&gt;
    &amp;lt;jpa:repositories base-package=&amp;quot;com.th.ctc.dao&amp;quot; /&amp;gt;&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
    .&lt;br /&gt;
 &amp;lt;/beans&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementación==&lt;br /&gt;
===El ejemplo fácil===&lt;br /&gt;
====Definiendo la interfaz del DAO====&lt;br /&gt;
Para este ejemplo sencillo, la interfaz del DAO va a quedar sin métodos definidos explicitamente, pero con todos aquellos que estamos heredando.&lt;br /&gt;
&lt;br /&gt;
 import org.springframework.data.repository.CrudRepository;&lt;br /&gt;
 import com.th.ctc.domain.Cliente;&lt;br /&gt;
 /**&lt;br /&gt;
  * Interfaz del DAO para la entidad {@link Cliente}. Esta interfaz NO tiene una&lt;br /&gt;
  * implementacion concreta dado que al extender de Repository la implementacion&lt;br /&gt;
  * la hace en runtime Spring Data JPA.&lt;br /&gt;
  * &lt;br /&gt;
  * @author Alguien.&lt;br /&gt;
  */&lt;br /&gt;
 public interface ClienteDao extends CrudRepository&amp;lt;Cliente, Long&amp;gt; {&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Usando el DAO desde el Service====&lt;br /&gt;
Hasta acá llegamos. A partir de ahora no hay mas código vinculado con el DAO más que el uso de los métodos que estamos exponiendo en la interfaz que nosotros mismos creamos. Por lo tanto nuestro Service sería algo como:&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * DAO de clientes.&lt;br /&gt;
  */&lt;br /&gt;
 @Autowired&lt;br /&gt;
 private ClienteDao clienteDao;&lt;br /&gt;
 @Override&lt;br /&gt;
 public List&amp;lt;Cliente&amp;gt; buscarTodos() {&lt;br /&gt;
      return (List&amp;lt;Cliente&amp;gt;) clienteDao.findAll(); //El método findAll() proviene de CrudRepository&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====Test====&lt;br /&gt;
Como no hay una implementación concreta, y de haber, no la hacemos nosotros sino que estamos delegando la responsabilidad al framework, no hacemos tests de la capa DAO, pero si del Service donde probamos que estamos utilizando correctamente lo que nos provee Spring DATA JPA además claro de la lógica propia del Service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===El ejemplo habitual===&lt;br /&gt;
&lt;br /&gt;
====Definiendo la interfaz del DAO====&lt;br /&gt;
Para este ejemplo sencillo, la interfaz del DAO va a quedar sin métodos definidos explicitamente, pero con todos aquellos que estamos heredando.&lt;br /&gt;
&lt;br /&gt;
 import org.springframework.data.repository.PagingAndSortingRepository;&lt;br /&gt;
 import com.th.ctc.domain.Usuario;&lt;br /&gt;
 /**&lt;br /&gt;
 * Interfaz del DAO para la entidad {@link Usuario}. Esta interfaz NO tiene una&lt;br /&gt;
 * implementacion concreta dado que al extender de Repository la implementación&lt;br /&gt;
 * la hace en runtime Spring Data JPA.&lt;br /&gt;
 * &lt;br /&gt;
 * @author Alguien.&lt;br /&gt;
 */&lt;br /&gt;
 public interface UsuarioDao extends PagingAndSortingRepository&amp;lt;Usuario, Long&amp;gt; {&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====Usando el DAO desde el Service====&lt;br /&gt;
Hasta acá llegamos. A partir de ahora no hay mas código vinculado con el DAO más que el uso de los métodos que estamos exponiendo en la interfaz que nosotros mismos creamos. Por lo tanto nuestro Service sería algo como:&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * DAO de usuarios.&lt;br /&gt;
  */&lt;br /&gt;
 @Autowired&lt;br /&gt;
 private UsuarioDao usuarioDao;&lt;br /&gt;
 @Override&lt;br /&gt;
 public List&amp;lt;Usuario&amp;gt; buscarTodos() {&lt;br /&gt;
      // El método findAll(Sort) proviene de PagingAndSortingRepository y con el String &amp;quot;apellido&amp;quot; (es el nombre del &lt;br /&gt;
      // atributo de clase de la entidad Usuario) estamos indicando que se ordenaran los resultados por ese campo&lt;br /&gt;
      return (List&amp;lt;Usuario&amp;gt;) usuarioDao.findAll(new Sort(&amp;quot;apellido&amp;quot;)); &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====Test====&lt;br /&gt;
Como no hay una implementación concreta, y de haber, no la hacemos nosotros sino que estamos delegando la responsabilidad al framework, no hacemos tests de la capa DAO, pero si del Service donde probamos que estamos utilizando correctamente lo que nos provee Spring DATA JPA además claro de la lógica propia del Service.&lt;br /&gt;
&lt;br /&gt;
===El ejemplo dificil===&lt;br /&gt;
Supongamos que ahora necesitamos 2 cosas:&lt;br /&gt;
Por un lado, recuperar todos los elementos de una entidad, recuperar uno solo en base al ID y etc., y por otro, generar un archivo Excel con información recuperada de una consulta a una base de datos muy específica.&lt;br /&gt;
Para lograr esto, aprovechando esta herramienta, necesitamos 2 interfaces del DAO. Una para definir estos métodos tan complejos que necesitamos, y otra para utilizar de la misma manera que en el ejemplo fácil.&lt;br /&gt;
&lt;br /&gt;
¿Pero entonces el Service tiene que utilizar 2 DAOs distintos sobre la misma entidad?&lt;br /&gt;
&lt;br /&gt;
No. Antes que nada, veamos un diagrama de clases para que veamos por qué este es el ejemplo dificil:&lt;br /&gt;
[[Media:Ejemplo complejo Spring Data JPA.PNG|Diagrama de clases]]&lt;br /&gt;
&lt;br /&gt;
Es decir, tenemos un Service (TareaServiceImpl) que utiliza un DAO (TareaDao). Nada nuevo hasta acá. Sin embargo, este TareaDao no solo hereda de Repository al heredar de org.springframework.data.repository.PagingAndSortingRepository, sino que también está heredando de una interfaz definida por nosotros (CustomTareaDao).&lt;br /&gt;
&lt;br /&gt;
¿Por qué necesitamos esto?&lt;br /&gt;
&lt;br /&gt;
Bueno, por que si bien podemos definir métodos en la interfaz que hereda de Repository, estos métodos tienen que seguir una nomenclatura específica para que el framework pueda hacer la implementación y, además, porque no podemos definir métodos que no queremos que los implemente Spring Data JPA para implementarlos nosotros.&lt;br /&gt;
&lt;br /&gt;
====Definiendo la interfaz del DAO====&lt;br /&gt;
&lt;br /&gt;
 import java.util.Date;&lt;br /&gt;
 import java.util.List;&lt;br /&gt;
 import org.springframework.data.domain.Sort;&lt;br /&gt;
 import org.springframework.data.repository.PagingAndSortingRepository;&lt;br /&gt;
 import com.th.ctc.domain.Tarea;&lt;br /&gt;
 /**&lt;br /&gt;
 * Interfaz el DAO de las {@link Tarea} implementado por Spring Data JPA.&lt;br /&gt;
 * &lt;br /&gt;
 * @author Alguien.&lt;br /&gt;
 */&lt;br /&gt;
 public interface TareaDao extends PagingAndSortingRepository&amp;lt;Tarea, Long&amp;gt;, CustomTareaDao {&lt;br /&gt;
    /**&lt;br /&gt;
     * Recupera todas las tareas del usuario que le pasamos, para la fecha dada.&lt;br /&gt;
     * &lt;br /&gt;
     * @author Alguien.&lt;br /&gt;
     * @param idUsuario&lt;br /&gt;
     *            {@link Long} con el ID del usuario duenio de la tarea.&lt;br /&gt;
     * @param fechaDesde&lt;br /&gt;
     *            {@link Date} la fecha desde la cual se buscara.&lt;br /&gt;
     * @param fechaHasta&lt;br /&gt;
     *            {@link Date} la fecha hasta la cual se buscara.&lt;br /&gt;
     * @param sort&lt;br /&gt;
     *            {@link Sort} de Spring Data JPA utilizado para ordenar los&lt;br /&gt;
     *            resultados segun cierto criterio.&lt;br /&gt;
     * @return {@link List&amp;lt;Tarea&amp;gt;} Las tareas encontradas.&lt;br /&gt;
     */&lt;br /&gt;
    List&amp;lt;Tarea&amp;gt; findByUsuarioIdAndFechaBetween(Long idUsuario, Date fechaDesde, Date fechaHasta, Sort sort);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Como vemos, estamos definiendo un método '''findByUsuarioIdAndFechaBetween''' que sigue la nomenclatura del framework para recuperar un listado de tareas en base al Id del Usuario que le pasamos, entre un rango de fechas dado, y que al definir con esta nomenclatura hacemos que la implementación quede a cargo del framework.&lt;br /&gt;
&lt;br /&gt;
====Usando el DAO desde el Service====&lt;br /&gt;
Ahora, nuestro Service cuenta con un DAO que tiene:&lt;br /&gt;
* Métodos definidos en él;&lt;br /&gt;
* Métodos provistos por PagingAndSortingRepository;&lt;br /&gt;
* Métodos provistos por CustomTareaDao. &lt;br /&gt;
&lt;br /&gt;
¿Y las implementaciones?&lt;br /&gt;
&lt;br /&gt;
Las implementaciones de los métodos definidos en TareaDao y los heredados de PagingAndSortingRepository, nos las va a proveer el framework. Y para la interfaz CustomTareaDao nosotros debemos definir nuestro DaoImpl común y corriente.&lt;br /&gt;
&lt;br /&gt;
====Test====&lt;br /&gt;
A la hora de testear, debemos tener un test (en nuestro caso es TareaDaoComponenteTest) que testee de la interfaz DAO que exponemos (es decír, TareaDao): &lt;br /&gt;
* Los métodos definidos manualmente en el DAO siguiendo la nomenclatura específica del framework. Ej: List&amp;lt;Tarea&amp;gt; findByUsuarioIdAndFechaBetween(Long idUsuario, Date fechaDesde, Date fechaHasta, Sort sort);&lt;br /&gt;
* Los métodos definidos en la interfaz creada para los métodos específicos (CustomTareaDao). Ej: ScrollableResults buscarResumenHoras(FiltroResumenHorasDto filtro);&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
Como estamos delegando la responsabilidad de la implementación del DAO en un framework, y como ni siquiera sabemos como es la implementación dado que se produce en runtime, decidimos no testear aquellos métodos ya tenemos definidos al heredar de alguna de las interfaces que nos provee la herramienta.&lt;br /&gt;
Sin embargo, sí decidimos testear la capa del Service donde probamos que estamos utilizando correctamente lo que nos provee Spring DATA JPA, además claro de la lógica propia del Service.&lt;br /&gt;
&lt;br /&gt;
==Mas==&lt;br /&gt;
&lt;br /&gt;
===SELECT DISTINCT===&lt;br /&gt;
&lt;br /&gt;
====Situación a resolver====&lt;br /&gt;
Necesitamos recuperar todos los clientes, tal que alguno de los servicios de los clientes cumpla con una condición determinada.&lt;br /&gt;
&lt;br /&gt;
====Primera solución====&lt;br /&gt;
Creamos un método:&lt;br /&gt;
 List&amp;lt;Cliente&amp;gt; findByServiciosEstado(EstadosServicios estado);&lt;br /&gt;
&lt;br /&gt;
====Problema====&lt;br /&gt;
El método traía repetidos los clientes por cada uno de sus servicios que cumplían con la condición.&lt;br /&gt;
&lt;br /&gt;
=====Contexto=====&lt;br /&gt;
* Spring Data JPA, version 1.0.3.RELEASE.&lt;br /&gt;
&lt;br /&gt;
=====Solución=====&lt;br /&gt;
Al método le agregamos la keyword Distinct delante del By:&lt;br /&gt;
  List&amp;lt;Cliente&amp;gt; findDistinctByServiciosEstado(EstadosServicios estado);&lt;br /&gt;
&lt;br /&gt;
=====Comentario adicional=====&lt;br /&gt;
El problema de esto es que la keyword no está en la [http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/#repository-query-keywords| documentación oficial de Spring Data JPA].&lt;br /&gt;
Sin embargo, encontramos una [https://jira.springsource.org/browse/DATAJPA-174?page=com.atlassian.streams.streams-jira-plugin:activity-stream-issue-tab| issue en el Jira de Spring Data JPA] sobre el tema.&lt;br /&gt;
&lt;br /&gt;
Por último, [http://static.springsource.org/spring-data/data-jpa/docs/1.0.0.RELEASE/changelog.txt | en el changelog de la versión] se indica que está soportado.&lt;br /&gt;
&lt;br /&gt;
===Proyecto de ejemplo===&lt;br /&gt;
Pueden descargarse un proyecto de ejemplo haciendo un checkout mediante un cliente de SVN de:&lt;br /&gt;
 http://dosideas-aplicaciones-modelo.googlecode.com/svn/spring-data/trunk&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Hibernate&amp;diff=6658</id>
		<title>Hibernate</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Hibernate&amp;diff=6658"/>
				<updated>2012-08-07T17:22:42Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Hibernate]]&lt;br /&gt;
Hibernate es un framework de persistencia de objetos para Java. Su función principal es la de [[Mapeo Objeto-Relacional]], es decir, mapear objetos a tablas de una base de datos relacional.&lt;br /&gt;
&lt;br /&gt;
Actualmente Hibernate cuanta con varios subproyectos que resuelven distintos aspectos del acceso y manipulación de datos.&lt;br /&gt;
&lt;br /&gt;
== Log de querys ==&lt;br /&gt;
Es posible decirle a Hibernate que realice un log de los comandos SQL que ejecuta. Esto resulta muy útil en tiempo de desarrollo. &lt;br /&gt;
&lt;br /&gt;
Para esto es necesario definir la propiedad ''show_sql'' en la configuración de Hibernate (generalmente, el archivo ''hibernate.cfg.xml''): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;show_sql&amp;quot;&amp;gt;true&amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Al ejecutar veremos algo como lo siguiente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code sql&amp;gt;&lt;br /&gt;
select emails0_.PERSON_ID as PERSON1_0_, emails0_.EMAIL_ADDR as EMAIL2_0_ &lt;br /&gt;
from PERSONA emails0_ &lt;br /&gt;
where emails0_.PERSON_ID=?&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si además queremos que el log aparezca mejor formateado, agregamos la variable ''format_sql'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;format_sql&amp;quot;&amp;gt;true&amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y veremos: &lt;br /&gt;
&amp;lt;code sql&amp;gt;&lt;br /&gt;
select&lt;br /&gt;
    emails0_.PERSON_ID as PERSON1_0_,&lt;br /&gt;
    emails0_.EMAIL_ADDR as EMAIL2_0_&lt;br /&gt;
from&lt;br /&gt;
    PERSONA emails0_&lt;br /&gt;
where&lt;br /&gt;
    emails0_.PERSON_ID=?&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si ademas desean saber los valores de las bind variables, y variables de resultado que se utilizan en el query, deben configurar lo siguiente en el archivo ''log4j.properties'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    log4j.logger.org.hibernate.type=debug&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y veremos: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
12:30:56,551 DEBUG LongType:133 - binding '1' to parameter: 1&lt;br /&gt;
12:30:56,551 DEBUG LongType:172 - returning '1' as column: PERSON1_0_&lt;br /&gt;
12:30:56,567 DEBUG StringType:172 - returning 'demo@dosideas.com' as column: EMAIL2_0_&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otra opción bastante interesante es ver el manejo de recursos por parte de Jdbc. Se debe agregar la propiedad: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    log4j.logger.org.hibernate.jdbc=debug&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y veremos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   12:30:56,551 - opening JDBC connection&lt;br /&gt;
12:30:56,553 - preparing statement&lt;br /&gt;
12:30:56,554 - about to open ResultSet (open ResultSets: 0, globally: 0)&lt;br /&gt;
12:30:57,551 - about to close ResultSet (open ResultSets: 1, globally: 1)&lt;br /&gt;
12:30:58,551 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)&lt;br /&gt;
12:30:58,552 - closing statement&lt;br /&gt;
12:30:56,553 - aggressively releasing JDBC connection&lt;br /&gt;
12:30:56,554 - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) &lt;br /&gt;
(open ResultSets: 0, globally: 0)]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Cache De Hibernate]]&lt;br /&gt;
* [[Hibernate Con Spring]]&lt;br /&gt;
* [[Hibernate Annotations con Spring]]&lt;br /&gt;
* [[Actualizacion Dinamica Con Hibernate]]&lt;br /&gt;
* [[Eficiencia Ejecutando Querys Con Hibernate]]&lt;br /&gt;
* [[Stored Procedures con Hibernate]]&lt;br /&gt;
* [[Practicas con Hibernate]]&lt;br /&gt;
* [http://www.hibernate.org/ Web oficial de Hibernate]&lt;br /&gt;
* [http://docs.jboss.org/hibernate/orm/4.1/quickstart/en-US/html/files/hibernate-tutorials.zip Hibernate 4 Tutorials (proyectos con código de ejemplo)]&lt;br /&gt;
* [http://www.hibernate.org/hib_docs/v3/reference/en/html/tutorial.html#tutorial-firstapp Tutorial de Hibernate]&lt;br /&gt;
* [http://www.javaworld.com/javaworld/jw-07-2008/jw-07-orm-comparison.html Comparación entre Hibernate, iBatis y JPA]&lt;br /&gt;
* [http://www.dosideas.com/java/180-testeando-rapido-todos-los-mapeos-de-hibernate.html Testear todos los mapeos de Hibernate]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Sun_Code_Conventions&amp;diff=6657</id>
		<title>Sun Code Conventions</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Sun_Code_Conventions&amp;diff=6657"/>
				<updated>2012-07-30T15:23:22Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Diseño De Software]]&lt;br /&gt;
[[Category:Java]]&lt;br /&gt;
Las convenciones de codificación en [[Java]] de Sun (Sun Code Conventions) es un documento que contiene convenciones estandard que Sun recomienda seguir. Las reglas cubren nombres de archivos, organizacion de directorios, identación, comentarios, declaraciones, sentencias, espacios en blanco, nomenclaturas, prácticas de programación e incluye un ejemplo de código.&lt;br /&gt;
&lt;br /&gt;
== ¿Por qué tener una convención de codificación? ==&lt;br /&gt;
Las convenciones de codificación son importantes para los programadores por varias razones:&lt;br /&gt;
* el 80% del costo del software ocurre en el mantenimiento.&lt;br /&gt;
* prácticamente ningún software es mantenido toda su vida por el autor original.&lt;br /&gt;
* las convenciones mejoran la lectura del software, permitiendo a los ingenieros comprender el código nuevo de manera más rápida y completa.&lt;br /&gt;
&lt;br /&gt;
==Clase de ejemplo==&lt;br /&gt;
La siguiente clase de ejemplo trata de resumir en modo concreto el uso de la reglas. No abarca todas las situaciones ni reemplaza la lectura de las convenciones, sino que sirve como un recordatorio rápido de las situaciones más comunes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 package java.blah;&lt;br /&gt;
&lt;br /&gt;
 import java.blah.blahdy.BlahBlah;&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * La descripcion de la clase va aqui.&lt;br /&gt;
  *&lt;br /&gt;
  * @version 	1.82 18 Mar 1999&lt;br /&gt;
  * @author 	Nombre Apellido&lt;br /&gt;
  */&lt;br /&gt;
 public class Blah extends SomeClass {&lt;br /&gt;
     /* Un comentario sobre la implementacion de esta clase podria ir aqui. */&lt;br /&gt;
&lt;br /&gt;
     /** Documentacion de la variable classVar1 */&lt;br /&gt;
     public static int classVar1;&lt;br /&gt;
&lt;br /&gt;
     /**&lt;br /&gt;
      * La documentacion de classVar2 es mas larga y compleja, y puede&lt;br /&gt;
      * abarcar mas de una linea de esta manera&lt;br /&gt;
      */&lt;br /&gt;
     private static Object classVar2;&lt;br /&gt;
&lt;br /&gt;
     /** Documentacion de instanceVar1 */&lt;br /&gt;
     public Object instanceVar1;&lt;br /&gt;
&lt;br /&gt;
     /** Documentacion de instanceVar2 */&lt;br /&gt;
     protected int instanceVar2;&lt;br /&gt;
&lt;br /&gt;
     /** Documentacion de instanceVar3 */&lt;br /&gt;
     private Object[] instanceVar3;&lt;br /&gt;
&lt;br /&gt;
     /**&lt;br /&gt;
      * ...documentacion del constructor Blah...&lt;br /&gt;
      */&lt;br /&gt;
     public Blah() {&lt;br /&gt;
         // ...la implementacion va aca...&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     /**&lt;br /&gt;
      * ...documentacion del metodo doSomething...&lt;br /&gt;
      */&lt;br /&gt;
     public void doSomething() {&lt;br /&gt;
         // ...implementation goes here...&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     /**&lt;br /&gt;
      * ...documentacion del metodo doSomethingElse...&lt;br /&gt;
      * @param unParam descripcion&lt;br /&gt;
      */&lt;br /&gt;
     public void doSomethingElse(Object unParam) {&lt;br /&gt;
        // ...implementacion aca...&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     /**&lt;br /&gt;
      * ...un metodo con ejemplos de sentencias...&lt;br /&gt;
      */&lt;br /&gt;
     public void mostrarEjemplosDeSentencias() {&lt;br /&gt;
          int maxloops = 10;&lt;br /&gt;
          int a = 0;&lt;br /&gt;
          int b = 0;&lt;br /&gt;
          int c = 0;&lt;br /&gt;
          int d = 0;&lt;br /&gt;
&lt;br /&gt;
          a += c + d;&lt;br /&gt;
          a = (a + b) / (c * d);&lt;br /&gt;
          System.out.println(&amp;quot;el valor de a es &amp;quot; + a + &amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
          unMetodo((byte) a, (Object) x);&lt;br /&gt;
&lt;br /&gt;
          if (condition) {&lt;br /&gt;
              statements;&lt;br /&gt;
          } else if (condition) {&lt;br /&gt;
              statements;&lt;br /&gt;
          } else {&lt;br /&gt;
              statements;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          for (int i = 0; i &amp;lt; maxLoops; i++) {&lt;br /&gt;
             statements;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          switch (condition) {&lt;br /&gt;
          case ABC:&lt;br /&gt;
              statements;&lt;br /&gt;
              /* falls through */&lt;br /&gt;
&lt;br /&gt;
          case DEF:&lt;br /&gt;
              statements;&lt;br /&gt;
              break;&lt;br /&gt;
&lt;br /&gt;
          case XYZ:&lt;br /&gt;
              statements;&lt;br /&gt;
              break;&lt;br /&gt;
&lt;br /&gt;
          default:&lt;br /&gt;
              statements;&lt;br /&gt;
              break;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          try {&lt;br /&gt;
              statements;&lt;br /&gt;
          } catch (ExceptionClass e) {&lt;br /&gt;
              statements;&lt;br /&gt;
          } catch (OtraExceptionClass e) {&lt;br /&gt;
              statements;&lt;br /&gt;
          } finally {&lt;br /&gt;
              statements;&lt;br /&gt;
          }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [http://www.oracle.com/technetwork/java/javase/documentation/codeconvtoc-136057.html Code Conventions for the Java Programming Language]&lt;br /&gt;
* [http://www.programacion.net/java/tutorial/convenciones/ Sun Code Conventions (traducido al castellano)]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Sun_Code_Conventions&amp;diff=6656</id>
		<title>Sun Code Conventions</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Sun_Code_Conventions&amp;diff=6656"/>
				<updated>2012-07-30T15:22:43Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Revertidos los cambios de 209.202.9.10 (disc.) a la última edición de Admin&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Diseño De Software]]&lt;br /&gt;
[[Category:Java]]&lt;br /&gt;
Las convenciones de codificación en [[Java]] de Sun (Sun Code Conventions) es un documento que contiene convenciones estandard que Sun recomienda seguir. Las reglas cubren nombres de archivos, organizacion de directorios, identación, comentarios, declaraciones, sentencias, espacios en blanco, nomenclaturas, prácticas de programación e incluye un ejemplo de código.&lt;br /&gt;
&lt;br /&gt;
== ¿Por qué tener una convención de codificación? ==&lt;br /&gt;
Las convenciones de codificación son importantes para los programadores por varias razones:&lt;br /&gt;
* el 80% del costo del software ocurre en el mantenimiento.&lt;br /&gt;
* prácticamente ningún software es mantenido toda su vida por el autor original.&lt;br /&gt;
* las convenciones mejoran la lectura del software, permitiendo a los ingenieros comprender el código nuevo de manera más rápida y completa.&lt;br /&gt;
&lt;br /&gt;
==Clase de ejemplo==&lt;br /&gt;
La siguiente clase de ejemplo trata de resumir en modo concreto el uso de la reglas. No abarca todas las situaciones ni reemplaza la lectura de las convenciones, sino que sirve como un recordatorio rápido de las situaciones más comunes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 package java.blah;&lt;br /&gt;
&lt;br /&gt;
 import java.blah.blahdy.BlahBlah;&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * La descripcion de la clase va aqui.&lt;br /&gt;
  *&lt;br /&gt;
  * @version 	1.82 18 Mar 1999&lt;br /&gt;
  * @author 	Nombre Apellido&lt;br /&gt;
  */&lt;br /&gt;
 public class Blah extends SomeClass {&lt;br /&gt;
     /* Un comentario sobre la implementacion de esta clase podria ir aqui. */&lt;br /&gt;
&lt;br /&gt;
     /** Documentacion de la variable classVar1 */&lt;br /&gt;
     public static int classVar1;&lt;br /&gt;
&lt;br /&gt;
     /**&lt;br /&gt;
      * La documentacion de classVar2 es mas larga y compleja, y puede&lt;br /&gt;
      * abarcar mas de una linea de esta manera&lt;br /&gt;
      */&lt;br /&gt;
     private static Object classVar2;&lt;br /&gt;
&lt;br /&gt;
     /** Documentacion de instanceVar1 */&lt;br /&gt;
     public Object instanceVar1;&lt;br /&gt;
&lt;br /&gt;
     /** Documentacion de instanceVar2 */&lt;br /&gt;
     protected int instanceVar2;&lt;br /&gt;
&lt;br /&gt;
     /** Documentacion de instanceVar3 */&lt;br /&gt;
     private Object[] instanceVar3;&lt;br /&gt;
&lt;br /&gt;
     /**&lt;br /&gt;
      * ...documentacion del constructor Blah...&lt;br /&gt;
      */&lt;br /&gt;
     public Blah() {&lt;br /&gt;
         // ...la implementacion va aca...&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     /**&lt;br /&gt;
      * ...documentacion del metodo doSomething...&lt;br /&gt;
      */&lt;br /&gt;
     public void doSomething() {&lt;br /&gt;
         // ...implementation goes here...&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     /**&lt;br /&gt;
      * ...documentacion del metodo doSomethingElse...&lt;br /&gt;
      * @param unParam descripcion&lt;br /&gt;
      */&lt;br /&gt;
     public void doSomethingElse(Object unParam) {&lt;br /&gt;
        // ...implementacion aca...&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     /**&lt;br /&gt;
      * ...un metodo con ejemplos de sentencias...&lt;br /&gt;
      */&lt;br /&gt;
     public void mostrarEjemplosDeSentencias() {&lt;br /&gt;
          int maxloops = 10;&lt;br /&gt;
          int a = 0;&lt;br /&gt;
          int b = 0;&lt;br /&gt;
          int c = 0;&lt;br /&gt;
          int d = 0;&lt;br /&gt;
&lt;br /&gt;
          a += c + d;&lt;br /&gt;
          a = (a + b) / (c * d);&lt;br /&gt;
          System.out.println(&amp;quot;el valor de a es &amp;quot; + a + &amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
          unMetodo((byte) a, (Object) x);&lt;br /&gt;
&lt;br /&gt;
          if (condition) {&lt;br /&gt;
              statements;&lt;br /&gt;
          } else if (condition) {&lt;br /&gt;
              statements;&lt;br /&gt;
          } else {&lt;br /&gt;
              statements;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          for (int i = 0; i &amp;lt; maxLoops; i++) {&lt;br /&gt;
             statements;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          switch (condition) {&lt;br /&gt;
          case ABC:&lt;br /&gt;
              statements;&lt;br /&gt;
              /* falls through */&lt;br /&gt;
&lt;br /&gt;
          case DEF:&lt;br /&gt;
              statements;&lt;br /&gt;
              break;&lt;br /&gt;
&lt;br /&gt;
          case XYZ:&lt;br /&gt;
              statements;&lt;br /&gt;
              break;&lt;br /&gt;
&lt;br /&gt;
          default:&lt;br /&gt;
              statements;&lt;br /&gt;
              break;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          try {&lt;br /&gt;
              statements;&lt;br /&gt;
          } catch (ExceptionClass e) {&lt;br /&gt;
              statements;&lt;br /&gt;
          } catch (OtraExceptionClass e) {&lt;br /&gt;
              statements;&lt;br /&gt;
          } finally {&lt;br /&gt;
              statements;&lt;br /&gt;
          }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [http://java.sun.com/docs/codeconv/ Sun Code Conventions]&lt;br /&gt;
* [http://www.programacion.net/java/tutorial/convenciones/ Sun Code Conventions (traducido al castellano)]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=SLF4J&amp;diff=6653</id>
		<title>SLF4J</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=SLF4J&amp;diff=6653"/>
				<updated>2012-07-02T21:02:24Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Parametrización de mensajes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Simple Logging Facade for Java (SLF4J) es una librería [[Java]] que funciona como una abstracción simple para varios frameworks de logging (como [[Log4J]], java.util.logging o [[Logback]]). Le permite al usuario final agregar el framework de log deseado al momento de deploy.&lt;br /&gt;
&lt;br /&gt;
Agregar SLF4J a un proyecto implica agregar un único jar, llamado slf4j-api.jar. Si no se agrega ninguna extensión para integrar con un framework de log, SLF4J usará una implementación dummy (que no loguea).&lt;br /&gt;
&lt;br /&gt;
== Uso clásico ==&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.Logger;&lt;br /&gt;
import org.slf4j.LoggerFactory;&lt;br /&gt;
&lt;br /&gt;
public class MiClase {&lt;br /&gt;
&lt;br /&gt;
    private static Logger logger = LoggerFactory.getLogger(MiClase.class);&lt;br /&gt;
&lt;br /&gt;
    public void unMetodo() {&lt;br /&gt;
        log.info(&amp;quot;Hola, mundo&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parametrización de mensajes ===&lt;br /&gt;
En [[SLF4J]] es muy facil parametrizar mensajes de log sin realizar concatenaciones: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
 logger.debug(&amp;quot;Mensaje: {}, {}&amp;quot;, unObjectoGrande, otroObjetoGrande);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
La serialización a String de los objetos sólo se realizará si el nivel de log es el indicado, y se ubicarán en orden como reemplazo de las llaves. Este mecanismo de log es elegante y muy eficiente, porque [[SLF4J]] demora la construcción del mensaje final de log hasta que realmente sea necesario.&lt;br /&gt;
&lt;br /&gt;
== Migración de Log4J a SLF4J ==&lt;br /&gt;
Es relativamente sencillo quitar todas las referencias de [[Log4J]] de una aplicación para utilizar el API de [[SLF4J]]. Una vez hecho esto, la aplicación seguirá usando [[Log4J]] para loguear, pero las clases no harán referencia a este framework (y nos permitirá, a futuro, cambiar el framework de log sin realizar cambios en el código). &lt;br /&gt;
&lt;br /&gt;
Los pasos para agregar SLF4J a un proyecto con Log4J son: &lt;br /&gt;
# Agregar los JAR de SLF4J.&lt;br /&gt;
# Reemplazar las referencias a Log4J en el código por las equivalentes en SLF4J.&lt;br /&gt;
&lt;br /&gt;
=== Agregar los JAR de SLF4J ===&lt;br /&gt;
Necesitamos al menos 2 JAR: &lt;br /&gt;
* slf4j-api&lt;br /&gt;
* slf4j-log4j12&lt;br /&gt;
&lt;br /&gt;
Además, es muy probable que algunas librerías del proyecto utilicen Jakarta Commons Logging (JCL). Para integrar también estas librerías, necesitamos agregar un JAR extra: &lt;br /&gt;
* jcl-over-slf4j&lt;br /&gt;
&lt;br /&gt;
Usando [[Maven]], el POM queda: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;jcl-over-slf4j&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar referencias a Log4J por equivalentes en SLF4J ===&lt;br /&gt;
Existen equivalente en SLF4J para llamadas a Log4J. &lt;br /&gt;
&lt;br /&gt;
==== Obtención del Logger ====&lt;br /&gt;
En [[Log4J]] el logger se obtiene: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.apache.log4j.Logger;&lt;br /&gt;
...&lt;br /&gt;
private static Logger log = Logger.getLogger(MiClase.class);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En [[SLF4J]] el logger se obtiene: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.Logger;&lt;br /&gt;
import org.slf4j.LoggerFactory;&lt;br /&gt;
..&lt;br /&gt;
private static Logger log = LoggerFactory.getLogger(MiClase.class);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Uso de MDC ====&lt;br /&gt;
[[Log4J#Log4JMDC]] permite asociar información de contexto para ser usada por el framework de log. En [[Log4J]] el MDC se establece: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.apache.log4j.MDC;&lt;br /&gt;
...&lt;br /&gt;
    try {&lt;br /&gt;
        MDC.put(&amp;quot;unValor&amp;quot;, valor);&lt;br /&gt;
        //hacer algo&lt;br /&gt;
    } finally {&lt;br /&gt;
        MDC.remove(&amp;quot;unValor&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En [[SLF4J]] la sintaxis es igual, sólo cambia el import del MDC: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.MDC;&lt;br /&gt;
...&lt;br /&gt;
    try {&lt;br /&gt;
        MDC.put(&amp;quot;unValor&amp;quot;, valor);&lt;br /&gt;
        //hacer algo&lt;br /&gt;
    } finally {&lt;br /&gt;
        MDC.remove(&amp;quot;unValor&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clase Level de Log4J ====&lt;br /&gt;
Log4J expone una clase Level (una enumeración que contiene los niveles de log) que se utiliza en el API para, programáticamente, establecer el nivel de log. Eso se realiza con el API de Log4J logger.log(Level level, Object mensaje).&lt;br /&gt;
&lt;br /&gt;
No existe un equivalente directo en SLF4J para este caso. En StackOverflow hay una interesante discusión con [http://stackoverflow.com/questions/2621701/setting-log-level-of-message-at-runtime-in-slf4j alternativas para establecer el nivel de log en tiempo de ejecución con SLF4J]. La alternativa final a usar estará determinada por la necesidad del sistema.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://www.slf4j.org/ Web oficial de SLF4J]&lt;br /&gt;
* [[Log4J]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=SLF4J&amp;diff=6652</id>
		<title>SLF4J</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=SLF4J&amp;diff=6652"/>
				<updated>2012-07-02T21:02:00Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Parametrización de mensajes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Simple Logging Facade for Java (SLF4J) es una librería [[Java]] que funciona como una abstracción simple para varios frameworks de logging (como [[Log4J]], java.util.logging o [[Logback]]). Le permite al usuario final agregar el framework de log deseado al momento de deploy.&lt;br /&gt;
&lt;br /&gt;
Agregar SLF4J a un proyecto implica agregar un único jar, llamado slf4j-api.jar. Si no se agrega ninguna extensión para integrar con un framework de log, SLF4J usará una implementación dummy (que no loguea).&lt;br /&gt;
&lt;br /&gt;
== Uso clásico ==&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.Logger;&lt;br /&gt;
import org.slf4j.LoggerFactory;&lt;br /&gt;
&lt;br /&gt;
public class MiClase {&lt;br /&gt;
&lt;br /&gt;
    private static Logger logger = LoggerFactory.getLogger(MiClase.class);&lt;br /&gt;
&lt;br /&gt;
    public void unMetodo() {&lt;br /&gt;
        log.info(&amp;quot;Hola, mundo&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parametrización de mensajes ===&lt;br /&gt;
En [[SLF4J]] es muy facil parametrizar mensajes de log sin realizar concatenaciones: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
 logger.debug(&amp;quot;Mensaje: {}, {}&amp;quot;, unObjectoGrande, otroObjetoGrande);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
La serialización a String de los objetos sólo se realizará si el nivel de log es el indicado, y se ubicarán en orden como reemplazo de las llaves. Este mecanismo de log es elegante y muy eficiente, porque [[SLF4]] demora la construcción del mensaje final de log hasta que realmente sea necesario.&lt;br /&gt;
&lt;br /&gt;
== Migración de Log4J a SLF4J ==&lt;br /&gt;
Es relativamente sencillo quitar todas las referencias de [[Log4J]] de una aplicación para utilizar el API de [[SLF4J]]. Una vez hecho esto, la aplicación seguirá usando [[Log4J]] para loguear, pero las clases no harán referencia a este framework (y nos permitirá, a futuro, cambiar el framework de log sin realizar cambios en el código). &lt;br /&gt;
&lt;br /&gt;
Los pasos para agregar SLF4J a un proyecto con Log4J son: &lt;br /&gt;
# Agregar los JAR de SLF4J.&lt;br /&gt;
# Reemplazar las referencias a Log4J en el código por las equivalentes en SLF4J.&lt;br /&gt;
&lt;br /&gt;
=== Agregar los JAR de SLF4J ===&lt;br /&gt;
Necesitamos al menos 2 JAR: &lt;br /&gt;
* slf4j-api&lt;br /&gt;
* slf4j-log4j12&lt;br /&gt;
&lt;br /&gt;
Además, es muy probable que algunas librerías del proyecto utilicen Jakarta Commons Logging (JCL). Para integrar también estas librerías, necesitamos agregar un JAR extra: &lt;br /&gt;
* jcl-over-slf4j&lt;br /&gt;
&lt;br /&gt;
Usando [[Maven]], el POM queda: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;jcl-over-slf4j&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar referencias a Log4J por equivalentes en SLF4J ===&lt;br /&gt;
Existen equivalente en SLF4J para llamadas a Log4J. &lt;br /&gt;
&lt;br /&gt;
==== Obtención del Logger ====&lt;br /&gt;
En [[Log4J]] el logger se obtiene: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.apache.log4j.Logger;&lt;br /&gt;
...&lt;br /&gt;
private static Logger log = Logger.getLogger(MiClase.class);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En [[SLF4J]] el logger se obtiene: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.Logger;&lt;br /&gt;
import org.slf4j.LoggerFactory;&lt;br /&gt;
..&lt;br /&gt;
private static Logger log = LoggerFactory.getLogger(MiClase.class);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Uso de MDC ====&lt;br /&gt;
[[Log4J#Log4JMDC]] permite asociar información de contexto para ser usada por el framework de log. En [[Log4J]] el MDC se establece: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.apache.log4j.MDC;&lt;br /&gt;
...&lt;br /&gt;
    try {&lt;br /&gt;
        MDC.put(&amp;quot;unValor&amp;quot;, valor);&lt;br /&gt;
        //hacer algo&lt;br /&gt;
    } finally {&lt;br /&gt;
        MDC.remove(&amp;quot;unValor&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En [[SLF4J]] la sintaxis es igual, sólo cambia el import del MDC: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.MDC;&lt;br /&gt;
...&lt;br /&gt;
    try {&lt;br /&gt;
        MDC.put(&amp;quot;unValor&amp;quot;, valor);&lt;br /&gt;
        //hacer algo&lt;br /&gt;
    } finally {&lt;br /&gt;
        MDC.remove(&amp;quot;unValor&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clase Level de Log4J ====&lt;br /&gt;
Log4J expone una clase Level (una enumeración que contiene los niveles de log) que se utiliza en el API para, programáticamente, establecer el nivel de log. Eso se realiza con el API de Log4J logger.log(Level level, Object mensaje).&lt;br /&gt;
&lt;br /&gt;
No existe un equivalente directo en SLF4J para este caso. En StackOverflow hay una interesante discusión con [http://stackoverflow.com/questions/2621701/setting-log-level-of-message-at-runtime-in-slf4j alternativas para establecer el nivel de log en tiempo de ejecución con SLF4J]. La alternativa final a usar estará determinada por la necesidad del sistema.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://www.slf4j.org/ Web oficial de SLF4J]&lt;br /&gt;
* [[Log4J]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=SLF4J&amp;diff=6651</id>
		<title>SLF4J</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=SLF4J&amp;diff=6651"/>
				<updated>2012-07-02T21:01:41Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Uso clásico */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Simple Logging Facade for Java (SLF4J) es una librería [[Java]] que funciona como una abstracción simple para varios frameworks de logging (como [[Log4J]], java.util.logging o [[Logback]]). Le permite al usuario final agregar el framework de log deseado al momento de deploy.&lt;br /&gt;
&lt;br /&gt;
Agregar SLF4J a un proyecto implica agregar un único jar, llamado slf4j-api.jar. Si no se agrega ninguna extensión para integrar con un framework de log, SLF4J usará una implementación dummy (que no loguea).&lt;br /&gt;
&lt;br /&gt;
== Uso clásico ==&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.Logger;&lt;br /&gt;
import org.slf4j.LoggerFactory;&lt;br /&gt;
&lt;br /&gt;
public class MiClase {&lt;br /&gt;
&lt;br /&gt;
    private static Logger logger = LoggerFactory.getLogger(MiClase.class);&lt;br /&gt;
&lt;br /&gt;
    public void unMetodo() {&lt;br /&gt;
        log.info(&amp;quot;Hola, mundo&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parametrización de mensajes ===&lt;br /&gt;
En [[SLF4J]] es muy facil parametrizar mensajes de log sin realizar concatenaciones: &lt;br /&gt;
&lt;br /&gt;
 logger.debug(&amp;quot;Mensaje: {}, {}&amp;quot;, unObjectoGrande, otroObjetoGrande);&lt;br /&gt;
&lt;br /&gt;
La serialización a String de los objetos sólo se realizará si el nivel de log es el indicado, y se ubicarán en orden como reemplazo de las llaves. Este mecanismo de log es elegante y muy eficiente, porque [[SLF4]] demora la construcción del mensaje final de log hasta que realmente sea necesario.&lt;br /&gt;
&lt;br /&gt;
== Migración de Log4J a SLF4J ==&lt;br /&gt;
Es relativamente sencillo quitar todas las referencias de [[Log4J]] de una aplicación para utilizar el API de [[SLF4J]]. Una vez hecho esto, la aplicación seguirá usando [[Log4J]] para loguear, pero las clases no harán referencia a este framework (y nos permitirá, a futuro, cambiar el framework de log sin realizar cambios en el código). &lt;br /&gt;
&lt;br /&gt;
Los pasos para agregar SLF4J a un proyecto con Log4J son: &lt;br /&gt;
# Agregar los JAR de SLF4J.&lt;br /&gt;
# Reemplazar las referencias a Log4J en el código por las equivalentes en SLF4J.&lt;br /&gt;
&lt;br /&gt;
=== Agregar los JAR de SLF4J ===&lt;br /&gt;
Necesitamos al menos 2 JAR: &lt;br /&gt;
* slf4j-api&lt;br /&gt;
* slf4j-log4j12&lt;br /&gt;
&lt;br /&gt;
Además, es muy probable que algunas librerías del proyecto utilicen Jakarta Commons Logging (JCL). Para integrar también estas librerías, necesitamos agregar un JAR extra: &lt;br /&gt;
* jcl-over-slf4j&lt;br /&gt;
&lt;br /&gt;
Usando [[Maven]], el POM queda: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;jcl-over-slf4j&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar referencias a Log4J por equivalentes en SLF4J ===&lt;br /&gt;
Existen equivalente en SLF4J para llamadas a Log4J. &lt;br /&gt;
&lt;br /&gt;
==== Obtención del Logger ====&lt;br /&gt;
En [[Log4J]] el logger se obtiene: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.apache.log4j.Logger;&lt;br /&gt;
...&lt;br /&gt;
private static Logger log = Logger.getLogger(MiClase.class);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En [[SLF4J]] el logger se obtiene: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.Logger;&lt;br /&gt;
import org.slf4j.LoggerFactory;&lt;br /&gt;
..&lt;br /&gt;
private static Logger log = LoggerFactory.getLogger(MiClase.class);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Uso de MDC ====&lt;br /&gt;
[[Log4J#Log4JMDC]] permite asociar información de contexto para ser usada por el framework de log. En [[Log4J]] el MDC se establece: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.apache.log4j.MDC;&lt;br /&gt;
...&lt;br /&gt;
    try {&lt;br /&gt;
        MDC.put(&amp;quot;unValor&amp;quot;, valor);&lt;br /&gt;
        //hacer algo&lt;br /&gt;
    } finally {&lt;br /&gt;
        MDC.remove(&amp;quot;unValor&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En [[SLF4J]] la sintaxis es igual, sólo cambia el import del MDC: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.MDC;&lt;br /&gt;
...&lt;br /&gt;
    try {&lt;br /&gt;
        MDC.put(&amp;quot;unValor&amp;quot;, valor);&lt;br /&gt;
        //hacer algo&lt;br /&gt;
    } finally {&lt;br /&gt;
        MDC.remove(&amp;quot;unValor&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clase Level de Log4J ====&lt;br /&gt;
Log4J expone una clase Level (una enumeración que contiene los niveles de log) que se utiliza en el API para, programáticamente, establecer el nivel de log. Eso se realiza con el API de Log4J logger.log(Level level, Object mensaje).&lt;br /&gt;
&lt;br /&gt;
No existe un equivalente directo en SLF4J para este caso. En StackOverflow hay una interesante discusión con [http://stackoverflow.com/questions/2621701/setting-log-level-of-message-at-runtime-in-slf4j alternativas para establecer el nivel de log en tiempo de ejecución con SLF4J]. La alternativa final a usar estará determinada por la necesidad del sistema.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://www.slf4j.org/ Web oficial de SLF4J]&lt;br /&gt;
* [[Log4J]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=SLF4J&amp;diff=6650</id>
		<title>SLF4J</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=SLF4J&amp;diff=6650"/>
				<updated>2012-07-02T20:54:45Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Simple Logging Facade for Java (SLF4J) es una librería [[Java]] que funciona como una abstracción simple para varios frameworks de logging (como [[Log4J]], java.util.logging o [[Logback]]). Le permite al usuario final agregar el framework de log deseado al momento de deploy.&lt;br /&gt;
&lt;br /&gt;
Agregar SLF4J a un proyecto implica agregar un único jar, llamado slf4j-api.jar. Si no se agrega ninguna extensión para integrar con un framework de log, SLF4J usará una implementación dummy (que no loguea).&lt;br /&gt;
&lt;br /&gt;
== Uso clásico ==&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.Logger;&lt;br /&gt;
import org.slf4j.LoggerFactory;&lt;br /&gt;
&lt;br /&gt;
public class MiClase {&lt;br /&gt;
&lt;br /&gt;
    private static Logger logger = LoggerFactory.getLogger(MiClase.class);&lt;br /&gt;
&lt;br /&gt;
    public void unMetodo() {&lt;br /&gt;
        log.info(&amp;quot;Hola, mundo&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Migración de Log4J a SLF4J ==&lt;br /&gt;
Es relativamente sencillo quitar todas las referencias de [[Log4J]] de una aplicación para utilizar el API de [[SLF4J]]. Una vez hecho esto, la aplicación seguirá usando [[Log4J]] para loguear, pero las clases no harán referencia a este framework (y nos permitirá, a futuro, cambiar el framework de log sin realizar cambios en el código). &lt;br /&gt;
&lt;br /&gt;
Los pasos para agregar SLF4J a un proyecto con Log4J son: &lt;br /&gt;
# Agregar los JAR de SLF4J.&lt;br /&gt;
# Reemplazar las referencias a Log4J en el código por las equivalentes en SLF4J.&lt;br /&gt;
&lt;br /&gt;
=== Agregar los JAR de SLF4J ===&lt;br /&gt;
Necesitamos al menos 2 JAR: &lt;br /&gt;
* slf4j-api&lt;br /&gt;
* slf4j-log4j12&lt;br /&gt;
&lt;br /&gt;
Además, es muy probable que algunas librerías del proyecto utilicen Jakarta Commons Logging (JCL). Para integrar también estas librerías, necesitamos agregar un JAR extra: &lt;br /&gt;
* jcl-over-slf4j&lt;br /&gt;
&lt;br /&gt;
Usando [[Maven]], el POM queda: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;jcl-over-slf4j&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar referencias a Log4J por equivalentes en SLF4J ===&lt;br /&gt;
Existen equivalente en SLF4J para llamadas a Log4J. &lt;br /&gt;
&lt;br /&gt;
==== Obtención del Logger ====&lt;br /&gt;
En [[Log4J]] el logger se obtiene: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.apache.log4j.Logger;&lt;br /&gt;
...&lt;br /&gt;
private static Logger log = Logger.getLogger(MiClase.class);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En [[SLF4J]] el logger se obtiene: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.Logger;&lt;br /&gt;
import org.slf4j.LoggerFactory;&lt;br /&gt;
..&lt;br /&gt;
private static Logger log = LoggerFactory.getLogger(MiClase.class);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Uso de MDC ====&lt;br /&gt;
[[Log4J#Log4JMDC]] permite asociar información de contexto para ser usada por el framework de log. En [[Log4J]] el MDC se establece: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.apache.log4j.MDC;&lt;br /&gt;
...&lt;br /&gt;
    try {&lt;br /&gt;
        MDC.put(&amp;quot;unValor&amp;quot;, valor);&lt;br /&gt;
        //hacer algo&lt;br /&gt;
    } finally {&lt;br /&gt;
        MDC.remove(&amp;quot;unValor&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En [[SLF4J]] la sintaxis es igual, sólo cambia el import del MDC: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.MDC;&lt;br /&gt;
...&lt;br /&gt;
    try {&lt;br /&gt;
        MDC.put(&amp;quot;unValor&amp;quot;, valor);&lt;br /&gt;
        //hacer algo&lt;br /&gt;
    } finally {&lt;br /&gt;
        MDC.remove(&amp;quot;unValor&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Clase Level de Log4J ====&lt;br /&gt;
Log4J expone una clase Level (una enumeración que contiene los niveles de log) que se utiliza en el API para, programáticamente, establecer el nivel de log. Eso se realiza con el API de Log4J logger.log(Level level, Object mensaje).&lt;br /&gt;
&lt;br /&gt;
No existe un equivalente directo en SLF4J para este caso. En StackOverflow hay una interesante discusión con [http://stackoverflow.com/questions/2621701/setting-log-level-of-message-at-runtime-in-slf4j alternativas para establecer el nivel de log en tiempo de ejecución con SLF4J]. La alternativa final a usar estará determinada por la necesidad del sistema.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://www.slf4j.org/ Web oficial de SLF4J]&lt;br /&gt;
* [[Log4J]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=SLF4J&amp;diff=6649</id>
		<title>SLF4J</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=SLF4J&amp;diff=6649"/>
				<updated>2012-07-02T20:48:15Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Uso de MDC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Simple Logging Facade for Java (SLF4J) es una librería [[Java]] que funciona como una abstracción simple para varios frameworks de logging (como [[Log4J]], java.util.logging o [[Logback]]). Le permite al usuario final agregar el framework de log deseado al momento de deploy.&lt;br /&gt;
&lt;br /&gt;
Agregar SLF4J a un proyecto implica agregar un único jar, llamado slf4j-api.jar. Si no se agrega ninguna extensión para integrar con un framework de log, SLF4J usará una implementación dummy (que no loguea).&lt;br /&gt;
&lt;br /&gt;
== Uso clásico ==&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.Logger;&lt;br /&gt;
import org.slf4j.LoggerFactory;&lt;br /&gt;
&lt;br /&gt;
public class MiClase {&lt;br /&gt;
&lt;br /&gt;
    private static Logger logger = LoggerFactory.getLogger(MiClase.class);&lt;br /&gt;
&lt;br /&gt;
    public void unMetodo() {&lt;br /&gt;
        log.info(&amp;quot;Hola, mundo&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Migración de Log4J a SLF4J ==&lt;br /&gt;
Es relativamente sencillo quitar todas las referencias de [[Log4J]] de una aplicación para utilizar el API de [[SLF4J]]. Una vez hecho esto, la aplicación seguirá usando [[Log4J]] para loguear, pero las clases no harán referencia a este framework (y nos permitirá, a futuro, cambiar el framework de log sin realizar cambios en el código). &lt;br /&gt;
&lt;br /&gt;
Los pasos para agregar SLF4J a un proyecto con Log4J son: &lt;br /&gt;
# Agregar los JAR de SLF4J.&lt;br /&gt;
# Reemplazar las referencias a Log4J en el código por las equivalentes en SLF4J.&lt;br /&gt;
&lt;br /&gt;
=== Agregar los JAR de SLF4J ===&lt;br /&gt;
Necesitamos al menos 2 JAR: &lt;br /&gt;
* slf4j-api&lt;br /&gt;
* slf4j-log4j12&lt;br /&gt;
&lt;br /&gt;
Además, es muy probable que algunas librerías del proyecto utilicen Jakarta Commons Logging (JCL). Para integrar también estas librerías, necesitamos agregar un JAR extra: &lt;br /&gt;
* jcl-over-slf4j&lt;br /&gt;
&lt;br /&gt;
Usando [[Maven]], el POM queda: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;jcl-over-slf4j&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar referencias a Log4J por equivalentes en SLF4J ===&lt;br /&gt;
Existen equivalente en SLF4J para llamadas a Log4J. &lt;br /&gt;
&lt;br /&gt;
==== Obtención del Logger ====&lt;br /&gt;
En [[Log4J]] el logger se obtiene: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.apache.log4j.Logger;&lt;br /&gt;
...&lt;br /&gt;
private static Logger log = Logger.getLogger(MiClase.class);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En [[SLF4J]] el logger se obtiene: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.Logger;&lt;br /&gt;
import org.slf4j.LoggerFactory;&lt;br /&gt;
..&lt;br /&gt;
private static Logger log = LoggerFactory.getLogger(MiClase.class);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Uso de MDC ====&lt;br /&gt;
[[Log4J#Log4JMDC]] permite asociar información de contexto para ser usada por el framework de log. En [[Log4J]] el MDC se establece: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.apache.log4j.MDC;&lt;br /&gt;
...&lt;br /&gt;
    try {&lt;br /&gt;
        MDC.put(&amp;quot;unValor&amp;quot;, valor);&lt;br /&gt;
        //hacer algo&lt;br /&gt;
    } finally {&lt;br /&gt;
        MDC.remove(&amp;quot;unValor&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En [[SLF4J]] la sintaxis es igual, sólo cambia el import del MDC: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.MDC;&lt;br /&gt;
...&lt;br /&gt;
    try {&lt;br /&gt;
        MDC.put(&amp;quot;unValor&amp;quot;, valor);&lt;br /&gt;
        //hacer algo&lt;br /&gt;
    } finally {&lt;br /&gt;
        MDC.remove(&amp;quot;unValor&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://www.slf4j.org/ Web oficial de SLF4J]&lt;br /&gt;
* [[Log4J]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=SLF4J&amp;diff=6648</id>
		<title>SLF4J</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=SLF4J&amp;diff=6648"/>
				<updated>2012-07-02T20:39:48Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Migración de Log4J a SLF4J */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Simple Logging Facade for Java (SLF4J) es una librería [[Java]] que funciona como una abstracción simple para varios frameworks de logging (como [[Log4J]], java.util.logging o [[Logback]]). Le permite al usuario final agregar el framework de log deseado al momento de deploy.&lt;br /&gt;
&lt;br /&gt;
Agregar SLF4J a un proyecto implica agregar un único jar, llamado slf4j-api.jar. Si no se agrega ninguna extensión para integrar con un framework de log, SLF4J usará una implementación dummy (que no loguea).&lt;br /&gt;
&lt;br /&gt;
== Uso clásico ==&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.Logger;&lt;br /&gt;
import org.slf4j.LoggerFactory;&lt;br /&gt;
&lt;br /&gt;
public class MiClase {&lt;br /&gt;
&lt;br /&gt;
    private static Logger logger = LoggerFactory.getLogger(MiClase.class);&lt;br /&gt;
&lt;br /&gt;
    public void unMetodo() {&lt;br /&gt;
        log.info(&amp;quot;Hola, mundo&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Migración de Log4J a SLF4J ==&lt;br /&gt;
Es relativamente sencillo quitar todas las referencias de [[Log4J]] de una aplicación para utilizar el API de [[SLF4J]]. Una vez hecho esto, la aplicación seguirá usando [[Log4J]] para loguear, pero las clases no harán referencia a este framework (y nos permitirá, a futuro, cambiar el framework de log sin realizar cambios en el código). &lt;br /&gt;
&lt;br /&gt;
Los pasos para agregar SLF4J a un proyecto con Log4J son: &lt;br /&gt;
# Agregar los JAR de SLF4J.&lt;br /&gt;
# Reemplazar las referencias a Log4J en el código por las equivalentes en SLF4J.&lt;br /&gt;
&lt;br /&gt;
=== Agregar los JAR de SLF4J ===&lt;br /&gt;
Necesitamos al menos 2 JAR: &lt;br /&gt;
* slf4j-api&lt;br /&gt;
* slf4j-log4j12&lt;br /&gt;
&lt;br /&gt;
Además, es muy probable que algunas librerías del proyecto utilicen Jakarta Commons Logging (JCL). Para integrar también estas librerías, necesitamos agregar un JAR extra: &lt;br /&gt;
* jcl-over-slf4j&lt;br /&gt;
&lt;br /&gt;
Usando [[Maven]], el POM queda: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;jcl-over-slf4j&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar referencias a Log4J por equivalentes en SLF4J ===&lt;br /&gt;
Existen equivalente en SLF4J para llamadas a Log4J. &lt;br /&gt;
&lt;br /&gt;
==== Obtención del Logger ====&lt;br /&gt;
En [[Log4J]] el logger se obtiene: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.apache.log4j.Logger;&lt;br /&gt;
...&lt;br /&gt;
private static Logger log = Logger.getLogger(MiClase.class);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En [[SLF4J]] el logger se obtiene: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.Logger;&lt;br /&gt;
import org.slf4j.LoggerFactory;&lt;br /&gt;
..&lt;br /&gt;
private static Logger log = LoggerFactory.getLogger(MiClase.class);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Uso de MDC ====&lt;br /&gt;
[[Log4J#Log4JMDC]] permite asociar información de contexto para ser usada por el framework de log. En [[Log4J]] el MDC se establece: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.apache.log4j.MDC;&lt;br /&gt;
...&lt;br /&gt;
    try {&lt;br /&gt;
        MDC.put(&amp;quot;unValor&amp;quot;, valor);&lt;br /&gt;
        //hacer algo&lt;br /&gt;
    } finally {&lt;br /&gt;
        MDC.remove(&amp;quot;unValor&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En [[SLF4]] la sintaxis es igual, sólo cambia el import del MDC: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.MDC;&lt;br /&gt;
...&lt;br /&gt;
    try {&lt;br /&gt;
        MDC.put(&amp;quot;unValor&amp;quot;, valor);&lt;br /&gt;
        //hacer algo&lt;br /&gt;
    } finally {&lt;br /&gt;
        MDC.remove(&amp;quot;unValor&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://www.slf4j.org/ Web oficial de SLF4J]&lt;br /&gt;
* [[Log4J]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=SLF4J&amp;diff=6647</id>
		<title>SLF4J</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=SLF4J&amp;diff=6647"/>
				<updated>2012-07-02T20:32:37Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Simple Logging Facade for Java (SLF4J) es una librería [[Java]] que funciona como una abstracción simple para varios frameworks de logging (como [[Log4J]], java.util.logging o [[Logback]]). Le permite al usuario final agregar el framework de log deseado al momento de deploy.&lt;br /&gt;
&lt;br /&gt;
Agregar SLF4J a un proyecto implica agregar un único jar, llamado slf4j-api.jar. Si no se agrega ninguna extensión para integrar con un framework de log, SLF4J usará una implementación dummy (que no loguea).&lt;br /&gt;
&lt;br /&gt;
== Uso clásico ==&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.Logger;&lt;br /&gt;
import org.slf4j.LoggerFactory;&lt;br /&gt;
&lt;br /&gt;
public class MiClase {&lt;br /&gt;
&lt;br /&gt;
    private static Logger logger = LoggerFactory.getLogger(MiClase.class);&lt;br /&gt;
&lt;br /&gt;
    public void unMetodo() {&lt;br /&gt;
        log.info(&amp;quot;Hola, mundo&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Migración de Log4J a SLF4J ==&lt;br /&gt;
Es relativamente sencillo quitar todas las referencias de [[Log4J]] de una aplicación para utilizar el API de [[SLF4J]]. Una vez hecho esto, la aplicación seguirá usando [[Log4J]] para loguear, pero las clases no harán referencia a este framework (y nos permitirá, a futuro, cambiar el framework de log sin realizar cambios en el código). &lt;br /&gt;
&lt;br /&gt;
Los pasos para agregar SLF4J a un proyecto con Log4J son: &lt;br /&gt;
# Agregar los JAR de SLF4J.&lt;br /&gt;
# Reemplazar las referencias a Log4J en el código por las equivalentes en SLF4J.&lt;br /&gt;
&lt;br /&gt;
==== Agregar los JAR de SLF4J ====&lt;br /&gt;
Necesitamos al menos 2 JAR: &lt;br /&gt;
* slf4j-api&lt;br /&gt;
* slf4j-log4j12&lt;br /&gt;
&lt;br /&gt;
Además, es muy probable que algunas librerías del proyecto utilicen Jakarta Commons Logging (JCL). Para integrar también estas librerías, necesitamos agregar un JAR extra: &lt;br /&gt;
* jcl-over-slf4j&lt;br /&gt;
&lt;br /&gt;
Usando [[Maven]], el POM queda: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;jcl-over-slf4j&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.6.6&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://www.slf4j.org/ Web oficial de SLF4J]&lt;br /&gt;
* [[Log4J]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=SLF4J&amp;diff=6646</id>
		<title>SLF4J</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=SLF4J&amp;diff=6646"/>
				<updated>2012-07-02T20:27:18Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Página creada con 'Simple Logging Facade for Java (SLF4J) es una librería Java que funciona como una abstracción simple para varios frameworks de logging (como Log4J, java.util.logging o…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Simple Logging Facade for Java (SLF4J) es una librería [[Java]] que funciona como una abstracción simple para varios frameworks de logging (como [[Log4J]], java.util.logging o [[Logback]]). Le permite al usuario final agregar el framework de log deseado al momento de deploy.&lt;br /&gt;
&lt;br /&gt;
Agregar SLF4J a un proyecto implica agregar un único jar, llamado slf4j-api.jar. Si no se agrega ninguna extensión para integrar con un framework de log, SLF4J usará una implementación dummy (que no loguea).&lt;br /&gt;
&lt;br /&gt;
== Uso clásico ==&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
import org.slf4j.Logger;&lt;br /&gt;
import org.slf4j.LoggerFactory;&lt;br /&gt;
&lt;br /&gt;
public class MiClase {&lt;br /&gt;
&lt;br /&gt;
    private static Logger logger = LoggerFactory.getLogger(MiClase.class);&lt;br /&gt;
&lt;br /&gt;
    public void unMetodo() {&lt;br /&gt;
        log.info(&amp;quot;Hola, mundo&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://www.slf4j.org/ Web oficial de SLF4J]&lt;br /&gt;
* [[Log4J]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Java&amp;diff=6645</id>
		<title>Java</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Java&amp;diff=6645"/>
				<updated>2012-07-02T20:09:11Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Cuestiones generales de Java */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Java]]&lt;br /&gt;
Java es un lenguaje de programación, aunque también se suele hacer referencia con este nombre a toda una plataforma para el desarrollo de aplicaciones. Hay un buen [http://es.wikipedia.org/wiki/Java_%28Sun%29 resumen de Java en la wikipedia].&lt;br /&gt;
&lt;br /&gt;
Al desarrollar un sistema se suele basar en una [[Arquitectura De Software]] para crear los componentes.&lt;br /&gt;
&lt;br /&gt;
Java se caracteriza por una enorme cantidad de proyectos libres.&lt;br /&gt;
&lt;br /&gt;
== Algunas tecnologías Java ==&lt;br /&gt;
=== Frameworks de base===&lt;br /&gt;
* [[Spring Framework]]&lt;br /&gt;
* [[Terracotta]]&lt;br /&gt;
* [[EJB]]&lt;br /&gt;
* [[Restlet]]&lt;br /&gt;
&lt;br /&gt;
===Acceso a datos===&lt;br /&gt;
* [[Hibernate]]&lt;br /&gt;
* [[Apache Lucene]]&lt;br /&gt;
&lt;br /&gt;
===Frameworks de presentación===&lt;br /&gt;
* [[Apache Tiles]]&lt;br /&gt;
* [[Struts]]&lt;br /&gt;
* [[JSF]]&lt;br /&gt;
* [[JSTL]]&lt;br /&gt;
* [[GWT]]&lt;br /&gt;
&lt;br /&gt;
===Librerías===&lt;br /&gt;
* [[Google Guava]]&lt;br /&gt;
* [[Jawr]]&lt;br /&gt;
&lt;br /&gt;
===Mensajeria===&lt;br /&gt;
* [[JMS]]&lt;br /&gt;
&lt;br /&gt;
===Web Services===&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
&lt;br /&gt;
===Ejecuciones batch y programadas===&lt;br /&gt;
* [[Quartz]]&lt;br /&gt;
* [[Spring Batch]]&lt;br /&gt;
&lt;br /&gt;
===Cuestiones generales de Java===&lt;br /&gt;
* [[Fechas En Java]]&lt;br /&gt;
* [[Numeros En Java]]&lt;br /&gt;
* [[Encoding En Java]]&lt;br /&gt;
* [[Serializacion De Objetos En Java]]&lt;br /&gt;
* [[Log4J]]&lt;br /&gt;
* [[SLF4J]]&lt;br /&gt;
* [[Cache De Objetos Java]]&lt;br /&gt;
* [[Exportacion Hacia Archivos]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Log4J&amp;diff=6644</id>
		<title>Log4J</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Log4J&amp;diff=6644"/>
				<updated>2012-07-02T20:08:44Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Java]]&lt;br /&gt;
Log4J es una librería para resolver el log de aplicaciones [[Java]].&lt;br /&gt;
&lt;br /&gt;
==Los Appender==&lt;br /&gt;
Log4J utiliza &amp;quot;appenders&amp;quot; para guardar el log generado por las aplicaciones. Un appender es el encargado de procesar un mensaje de log enviado por la aplicación. Usualmente se encarga de almacenarlo en algún medio persistente, como ser un archivo. &lt;br /&gt;
&lt;br /&gt;
Existen distintos appenders para guardar logs en archivos, base de datos o colas de mensajeria. &lt;br /&gt;
&lt;br /&gt;
===JMSAppnder===&lt;br /&gt;
&lt;br /&gt;
Log4J cuenta con un Appender especial que redirecciona los eventos de log a un Topic [[JMS]].&lt;br /&gt;
&lt;br /&gt;
El appender a utilizar es ''org.apache.log4j.net.JMSAppender'', el cual se encarga de enviar los eventos de log a un Topic asociado. Un topic es parecido a una cola, pero con la diferencia que los mensajes se distribuyen a todos los suscriptores de la misma. Si no hay suscriptores, el mensaje se pierde.&lt;br /&gt;
&lt;br /&gt;
El JMSAppnder es muy útil en un ambiente en cluster, para centralizar la información de los log en un único lugar.&lt;br /&gt;
&lt;br /&gt;
==== Ejemplo de uso ====&lt;br /&gt;
&lt;br /&gt;
En la práctica, utilizar log4j con este appender es igual que en cualquier otro caso. En el archivo de configuración ''log4j.properties'' es necesario agregar el appender en cuestión.&lt;br /&gt;
&lt;br /&gt;
 log4j.logger.com.zim=DEBUG, jms&lt;br /&gt;
 log4j.appender.jms=org.apache.log4j.net.JMSAppender&lt;br /&gt;
 log4j.appender.jms.InitialContextFactoryName=weblogic.jndi.WLInitialContextFactory&lt;br /&gt;
 log4j.appender.jms.ProviderURL=t3://miApplicationServer:7001&lt;br /&gt;
 log4j.appender.jms.TopicConnectionFactoryBindingName=JmsZimCF&lt;br /&gt;
 log4j.appender.jms.TopicBindingName=ZimTopic&lt;br /&gt;
 log4j.appender.jms.locationInfo=true&lt;br /&gt;
&lt;br /&gt;
En el ejemplo, utilizamos el Connection Factory ''JmsZmiCF'' para conectarnos al topic ''ZimTopic'' (ambos teniendo que estar configurados en algún [[Servidor de Aplicaciones]]).&lt;br /&gt;
&lt;br /&gt;
Con esta configuración todos los logs de las clases que pertenezcan al paquete &amp;quot;com.zim&amp;quot; se enviaran como mensajes al topic. Al Topic se envian objetos de tipo ''LoggingEvent'', clase que contiene la información de un evento de log.&lt;br /&gt;
&lt;br /&gt;
Luego, podrá haber distintos suscriptores que tomen las acciones necesarias sobre el mensaje. Por ejemplo, podriamos tener suscriptores que guarden el log en una base de datos, u otros que envien un mail o sms.&lt;br /&gt;
&lt;br /&gt;
====Sobre el locationInfo====&lt;br /&gt;
&lt;br /&gt;
Por default, el atributo locationInfo está en &amp;quot;false&amp;quot;. Esto hace que NO se envien los datos para el objeto ''LocationInfo'' de ''LoggingEvent''. Al setearlo en true, el objeto ''LocationInfo'' contendrá la información sobre la clase, método y número de línea en donde ocurrió el error.&lt;br /&gt;
&lt;br /&gt;
====Procesando el mensaje====&lt;br /&gt;
&lt;br /&gt;
Luego, queda tan solo decidir qué hacer con el mensaje. Usualmente, será un [[Message Driven Bean]] que procese de alguna manera el mensaje que envia Log4J.&lt;br /&gt;
&lt;br /&gt;
¿Y qué envia exactamente? Log4J enviará un ''ObjectMessage'' de JMS, que contiene una instancia de ''LoggingEvent'', la cual contiene la información relativa al log que generó la aplicación.&lt;br /&gt;
&lt;br /&gt;
===SMTPAppender===&lt;br /&gt;
&lt;br /&gt;
Es un Appender muy útil para la generación de alarmas vía mail. &lt;br /&gt;
&lt;br /&gt;
NOTA 1: Por estar pensado para casos de error (o tal vez por bug) sólo se envía el mail cuando el nivel de log es ERROR o superior. &lt;br /&gt;
&lt;br /&gt;
NOTA 2: Utilizar la versión de log4j 1.2.16 o superior (en las anteriores hay algún inconveniente sobre todo si se utiliza smtp.gmail.com).&lt;br /&gt;
&lt;br /&gt;
==== Ejemplo de uso ====&lt;br /&gt;
&lt;br /&gt;
Configuración en ''log4j.properties'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Acordate!!! Nivel ERROR o superior&lt;br /&gt;
&lt;br /&gt;
log4j.logger.com.demo.smtpAppender.MyService=ERROR, mailAppender&lt;br /&gt;
&lt;br /&gt;
# SMTP appender para alarmas via mail&lt;br /&gt;
&lt;br /&gt;
log4j.appender.mailAppender=org.apache.log4j.net.SMTPAppender&lt;br /&gt;
log4j.appender.mailAppender.Threshold=WARN&lt;br /&gt;
log4j.appender.mailAppender.BufferSize=10&lt;br /&gt;
log4j.appender.mailAppender.To=&amp;lt;mails_destino_separados_por_coma&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.From=&amp;lt;mail_from&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPHost=&amp;lt;smtp_host&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPPort=&amp;lt;puerto&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPUsername=&amp;lt;username&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPPassword=&amp;lt;password&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPProtocol=smtps&lt;br /&gt;
log4j.appender.mailAppender.Subject=Alarma generada con Log4J&lt;br /&gt;
log4j.appender.mailAppender.layout=org.apache.log4j.PatternLayout&lt;br /&gt;
log4j.appender.mailAppender.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esta configuración los logs de nivel error o superior de la clase MyService enviarán un mail con la información que se loguee.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Log4j en J2EE, en servidores WebLogic==&lt;br /&gt;
&lt;br /&gt;
Si queres compartir los mismos componentes log4j en un módulo EJB y Web, y el EJB se usa localmente, en el ear tienen que estar el EJB y el Web. El log4-*.jar en /APP-INF/lib, y log4.properties en /APP-INF/classes. /APP-INF/ en la raíz del ear. &lt;br /&gt;
&lt;br /&gt;
Y dentro del build-impl.xml del ear, los sgtes. pasos para la tarea que crea el META-INF:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;copy todir=&amp;quot;${build.dir}/APP-INF/lib&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fileset file=&amp;quot;${log4j.jar}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/copy&amp;gt;&lt;br /&gt;
&amp;lt;copy todir=&amp;quot;${build.dir}/APP-INF/classes&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fileset file=&amp;quot;${log4j.properties}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/copy&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Log4J en Debug==&lt;br /&gt;
&lt;br /&gt;
Se puede usar el argumento '''-Dlog4j.debug''' como parametro para la JVM y muestra algunas cosas de log4J por consola, como por ejemplo, el archivo desde donde está levantando las propiedades.&lt;br /&gt;
&lt;br /&gt;
==Obtención del Logger==&lt;br /&gt;
Existe una serie de variantes para definir y obtener el logger de una clase:&lt;br /&gt;
&lt;br /&gt;
===Los modificadores===&lt;br /&gt;
====private====&lt;br /&gt;
Por lo general queremos que el logger se reporte como la clase que se está ejecutando. Utilizando private nos aseguramos que una clase que herede tenga que declarar su propio Logger y no usará accidentalmente el de la superclase. Contrariamente, si queremos por granularidad que utilice el de la superclase, habrá que declararlo como protected.&lt;br /&gt;
&lt;br /&gt;
====final====&lt;br /&gt;
La referencia al logger es la misma durante todo el ciclo de vida de una clase (si se declara static) o de un objeto (si es atributo de instancia). Por lo tanto, declarándola final se expresa esto, se protege a una asignación errónea y se mejora la performance.&lt;br /&gt;
&lt;br /&gt;
====static====&lt;br /&gt;
La creación del Logger está administrada por una fábrica a la que le pedimos las instancias. Es responsabilidad de la fábrica darnos la instancia correcta. En este caso, la motivación de utilizar static no es la de tener una sola copia. La motivación es que los logger no deben serializarse, deberían ser transient. Siendo static es una variable de la clase y no un atributo de la instancia, por lo que no será serializado. La razón de no marcarlo como transient (que sería conceptualmente más acertado) es que se debería implementar un mecanismo para que cuando la instancia es des-serializada, vuelva a obtener una copia del logger.&lt;br /&gt;
&lt;br /&gt;
====transient====&lt;br /&gt;
Los logger no deben ser serializados, por eso deberían ser marcados como transient. Es más fácil marcarlos como static ya que de esta forma no es necesario volver a obtenerlos cuando la clase es des-serializada. Si la clase no es serializable, no es necesario.&lt;br /&gt;
&lt;br /&gt;
===Clave para la obtención del logger===&lt;br /&gt;
El logger se le pide a la fábrica a través de una clave. Esta clave es de tipo String. El método está sobrecargado para recibir también un objeto de tipo class que luego la fábrica convertirá a String.&lt;br /&gt;
&lt;br /&gt;
====String====&lt;br /&gt;
 private static final Logger log = Logger.getLogger(&amp;quot;com.foo.bar.Blah&amp;quot;);&lt;br /&gt;
Utilizando un String se obtiene un logger independientemente de la clase donde se esté. Si lo que se busca el logger para la clase, esta es la forma más riesgosa ya que no está verificada por el compilador.&lt;br /&gt;
&lt;br /&gt;
====Objeto class====&lt;br /&gt;
 private static final Logger log = Logger.getLogger(Blah.class);&lt;br /&gt;
Utilizando un objeto de tipo Class permite que el compilador verifique el nombre de la clase. También se actualiza si se utiliza alguna herramienta o IDE para cambiar el nomre de la clase.&lt;br /&gt;
&lt;br /&gt;
====método getClass()====&lt;br /&gt;
 private transient Logger log = Logger.getLogger(getClass());&lt;br /&gt;
En este caso la clave se genera en tiempo de ejecución pidiendo al objeto su clase a través del método getClass(). Esto tiene la ventaja de que siempre tendrá el nombre apropiado de la clase. Tiene la restricción de que sólo se podrá utilizar si el logger es un atributo de  instancia (no static).&lt;br /&gt;
&lt;br /&gt;
Otra particularidad es que el método getClass() invocado en una clase padre responderá desde la clase hija.&lt;br /&gt;
&lt;br /&gt;
En caso de que el objeto sea serializable habrá que agregar el modificador transient para que no se serialice el logger.&lt;br /&gt;
&lt;br /&gt;
===Conclusión===&lt;br /&gt;
La forma práctica de no cometer errores es la de utilizar la combinación más restrictiva y cambiarla sólo si se tiene alguna razón claramente justificada e implementando los mecanismos necesarios.&lt;br /&gt;
&lt;br /&gt;
Forma típica:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
public class Blah {&lt;br /&gt;
    private static final Logger log = Logger.getLogger(Blah.class);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Log4JMDC ==&lt;br /&gt;
MDC es una característica de [[Log4J]] que permite agregar información adicional (de forma &amp;quot;clave=valor&amp;quot;), que luego puede ser referenciada en el patrón de log. Aquí entonces podemos almacenar datos generales (como ser, el nombre de usuario) y mostrarlos en todos los logs que se generen. &lt;br /&gt;
&lt;br /&gt;
En el patrón de log, se pueden hacer referencia a las variables del MDC usando: &lt;br /&gt;
 %X{clave}&lt;br /&gt;
&lt;br /&gt;
Los datos del MDC se guardan en el thread en ejecución. Un uso común es crear un Filter web, y allí guardar el nombre de usuario logueado en el entorno MDC, para que luego pueda loguearse. &lt;br /&gt;
&lt;br /&gt;
=== Filter web con MDC ===&lt;br /&gt;
El siguiente es un filter web común que guarda la variable &amp;quot;username&amp;quot; en el MDC, para luego referenciarla en patrón de log4j.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * To change this template, choose Tools | Templates&lt;br /&gt;
 * and open the template in the editor.&lt;br /&gt;
 */&lt;br /&gt;
package com.dosideas.mdc.filter;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import javax.servlet.*;&lt;br /&gt;
import org.apache.log4j.MDC;&lt;br /&gt;
import org.springframework.security.core.Authentication;&lt;br /&gt;
import org.springframework.security.core.context.SecurityContextHolder;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Adds MDC information for Log4j. In particular, it adds the username (if&lt;br /&gt;
 * available) to MDC.&lt;br /&gt;
 */&lt;br /&gt;
public class Log4jMDCFilter implements Filter {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {&lt;br /&gt;
&lt;br /&gt;
        String username = obtenerNombreDeUsuarioLogueado();&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            MDC.put(&amp;quot;username&amp;quot;, username);&lt;br /&gt;
            chain.doFilter(request, response);&lt;br /&gt;
        } finally {&lt;br /&gt;
            MDC.remove(&amp;quot;username&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void init(FilterConfig filterConfig) throws ServletException { }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void destroy() { }&lt;br /&gt;
&lt;br /&gt;
    private String obtenerNombreDeUsuarioLogueado() { .... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego, en el archivo log4j.xml podemos hacer uso de la variable username (noten el valor del atributo &amp;quot;ConversionPattern&amp;quot;): &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE log4j:configuration SYSTEM &amp;quot;log4j.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;log4j:configuration xmlns:log4j=&amp;quot;http://jakarta.apache.org/log4j/&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;appender name=&amp;quot;console&amp;quot; class=&amp;quot;org.apache.log4j.ConsoleAppender&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;param name=&amp;quot;Target&amp;quot; value=&amp;quot;System.out&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;layout class=&amp;quot;org.apache.log4j.PatternLayout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;param name=&amp;quot;ConversionPattern&amp;quot; value=&amp;quot;%-5p %d{ISO8601} [%X{username}] %c - %m%n&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/layout&amp;gt;&lt;br /&gt;
    &amp;lt;/appender&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;root&amp;gt;&lt;br /&gt;
        &amp;lt;priority value =&amp;quot;debug&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;appender-ref ref=&amp;quot;console&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/root&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/log4j:configuration&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modificar log4j en ejecución ==&lt;br /&gt;
Utilizando un listener de spring se puede configurar la ruta del archivo log4j.properties (fuera del empaquetado) y el tiempo en que se vuelve a leer el mismo, lo cual nos permite modificar sus valores en ejecucion sin necesidad de redeployar la aplicacion. &lt;br /&gt;
&lt;br /&gt;
Para esto se configura dentro del web.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;listener&amp;gt;&lt;br /&gt;
  &amp;lt;listener-class&amp;gt;org.springframework.web.util.Log4jConfigListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;
&amp;lt;/listener&amp;gt;&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
        &amp;lt;param-name&amp;gt;log4jConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;
        &amp;lt;param-value&amp;gt;file:/path/log4j.properties&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
        &amp;lt;param-name&amp;gt;log4jRefreshInterval&amp;lt;/param-name&amp;gt;&lt;br /&gt;
        &amp;lt;param-value&amp;gt;5000&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;   &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un error con el que nos podemos topar al momento de agregar esta configuración e intentar desplegar en Weblogic es el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;Cannot set web app root system property when WAR file is not expanded&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ante este error, la solución es agregar en el weblogic.xml dentro del tag &amp;lt;weblogic-web-app&amp;gt; el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;container-descriptor&amp;gt;&lt;br /&gt;
        &amp;lt;show-archived-real-path-enabled&amp;gt;true&amp;lt;/show-archived-real-path-enabled&amp;gt;&lt;br /&gt;
&amp;lt;/container-descriptor&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configurar Log4j con Spring ==&lt;br /&gt;
Para configurar Log4j con Spring se debe agregar el siguiente bean a la aplicación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;log4jInitializer&amp;quot;  class=&amp;quot;org.springframework.beans.factory.config.MethodInvokingFactoryBean&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;staticMethod&amp;quot;  value=&amp;quot;org.springframework.util.Log4jConfigurer.initLogging&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;arguments&amp;quot;&amp;gt;&lt;br /&gt;
       &amp;lt;list&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;file:/path/log4j.properties&amp;lt;/value&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;1000&amp;lt;/value&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
    &amp;lt;/property&amp;gt;&lt;br /&gt;
 &amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el bean se esta indicando la ruta desde la cual se va a tomar el log4j.properties y el intervalo de refresco, el cual nos permite modificar sus valores en ejecucion sin necesidad de redeployar la aplicacion.&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [http://logging.apache.org/log4j Web oficial de Log4J]&lt;br /&gt;
* [http://logging.apache.org/log4j/docs/api/org/apache/log4j/spi/LoggingEvent.html Javadoc del LogginEvent]&lt;br /&gt;
* [http://www.slideshare.net/Emmerson_Miranda/log4j-1215-short-manual Introducción a Log4j]&lt;br /&gt;
* [http://books.google.com.ar/books?id=vHvY008Zq-YC&amp;amp;pg=PA158&amp;amp;lpg=PA158&amp;amp;dq=weblogic+same+class+loader+log4j&amp;amp;source=bl&amp;amp;ots=yh8Z3e1X7C&amp;amp;sig=x81fCioIEn5nGAZNRg8kLNcOk0Y&amp;amp;hl=es&amp;amp;ei=x267Sum5HprKtgfD1NXEDQ&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=7#v=onepage&amp;amp;q=weblogic%20same%20class%20loader%20log4j&amp;amp;f=false Pro Apache Log4j]&lt;br /&gt;
* [[SLF4J]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Log4J&amp;diff=6643</id>
		<title>Log4J</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Log4J&amp;diff=6643"/>
				<updated>2012-07-02T20:07:52Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Java]]&lt;br /&gt;
Log4J es una librería para resolver el log de aplicaciones [[Java]].&lt;br /&gt;
&lt;br /&gt;
==Los Appender==&lt;br /&gt;
Log4J utiliza &amp;quot;appenders&amp;quot; para guardar el log generado por las aplicaciones. Un appender es el encargado de procesar un mensaje de log enviado por la aplicación. Usualmente se encarga de almacenarlo en algún medio persistente, como ser un archivo. &lt;br /&gt;
&lt;br /&gt;
Existen distintos appenders para guardar logs en archivos, base de datos o colas de mensajeria. &lt;br /&gt;
&lt;br /&gt;
===JMSAppnder===&lt;br /&gt;
&lt;br /&gt;
Log4J cuenta con un Appender especial que redirecciona los eventos de log a un Topic [[JMS]].&lt;br /&gt;
&lt;br /&gt;
El appender a utilizar es ''org.apache.log4j.net.JMSAppender'', el cual se encarga de enviar los eventos de log a un Topic asociado. Un topic es parecido a una cola, pero con la diferencia que los mensajes se distribuyen a todos los suscriptores de la misma. Si no hay suscriptores, el mensaje se pierde.&lt;br /&gt;
&lt;br /&gt;
El JMSAppnder es muy útil en un ambiente en cluster, para centralizar la información de los log en un único lugar.&lt;br /&gt;
&lt;br /&gt;
==== Ejemplo de uso ====&lt;br /&gt;
&lt;br /&gt;
En la práctica, utilizar log4j con este appender es igual que en cualquier otro caso. En el archivo de configuración ''log4j.properties'' es necesario agregar el appender en cuestión.&lt;br /&gt;
&lt;br /&gt;
 log4j.logger.com.zim=DEBUG, jms&lt;br /&gt;
 log4j.appender.jms=org.apache.log4j.net.JMSAppender&lt;br /&gt;
 log4j.appender.jms.InitialContextFactoryName=weblogic.jndi.WLInitialContextFactory&lt;br /&gt;
 log4j.appender.jms.ProviderURL=t3://miApplicationServer:7001&lt;br /&gt;
 log4j.appender.jms.TopicConnectionFactoryBindingName=JmsZimCF&lt;br /&gt;
 log4j.appender.jms.TopicBindingName=ZimTopic&lt;br /&gt;
 log4j.appender.jms.locationInfo=true&lt;br /&gt;
&lt;br /&gt;
En el ejemplo, utilizamos el Connection Factory ''JmsZmiCF'' para conectarnos al topic ''ZimTopic'' (ambos teniendo que estar configurados en algún [[Servidor de Aplicaciones]]).&lt;br /&gt;
&lt;br /&gt;
Con esta configuración todos los logs de las clases que pertenezcan al paquete &amp;quot;com.zim&amp;quot; se enviaran como mensajes al topic. Al Topic se envian objetos de tipo ''LoggingEvent'', clase que contiene la información de un evento de log.&lt;br /&gt;
&lt;br /&gt;
Luego, podrá haber distintos suscriptores que tomen las acciones necesarias sobre el mensaje. Por ejemplo, podriamos tener suscriptores que guarden el log en una base de datos, u otros que envien un mail o sms.&lt;br /&gt;
&lt;br /&gt;
====Sobre el locationInfo====&lt;br /&gt;
&lt;br /&gt;
Por default, el atributo locationInfo está en &amp;quot;false&amp;quot;. Esto hace que NO se envien los datos para el objeto ''LocationInfo'' de ''LoggingEvent''. Al setearlo en true, el objeto ''LocationInfo'' contendrá la información sobre la clase, método y número de línea en donde ocurrió el error.&lt;br /&gt;
&lt;br /&gt;
====Procesando el mensaje====&lt;br /&gt;
&lt;br /&gt;
Luego, queda tan solo decidir qué hacer con el mensaje. Usualmente, será un [[Message Driven Bean]] que procese de alguna manera el mensaje que envia Log4J.&lt;br /&gt;
&lt;br /&gt;
¿Y qué envia exactamente? Log4J enviará un ''ObjectMessage'' de JMS, que contiene una instancia de ''LoggingEvent'', la cual contiene la información relativa al log que generó la aplicación.&lt;br /&gt;
&lt;br /&gt;
===SMTPAppender===&lt;br /&gt;
&lt;br /&gt;
Es un Appender muy útil para la generación de alarmas vía mail. &lt;br /&gt;
&lt;br /&gt;
NOTA 1: Por estar pensado para casos de error (o tal vez por bug) sólo se envía el mail cuando el nivel de log es ERROR o superior. &lt;br /&gt;
&lt;br /&gt;
NOTA 2: Utilizar la versión de log4j 1.2.16 o superior (en las anteriores hay algún inconveniente sobre todo si se utiliza smtp.gmail.com).&lt;br /&gt;
&lt;br /&gt;
==== Ejemplo de uso ====&lt;br /&gt;
&lt;br /&gt;
Configuración en ''log4j.properties'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Acordate!!! Nivel ERROR o superior&lt;br /&gt;
&lt;br /&gt;
log4j.logger.com.demo.smtpAppender.MyService=ERROR, mailAppender&lt;br /&gt;
&lt;br /&gt;
# SMTP appender para alarmas via mail&lt;br /&gt;
&lt;br /&gt;
log4j.appender.mailAppender=org.apache.log4j.net.SMTPAppender&lt;br /&gt;
log4j.appender.mailAppender.Threshold=WARN&lt;br /&gt;
log4j.appender.mailAppender.BufferSize=10&lt;br /&gt;
log4j.appender.mailAppender.To=&amp;lt;mails_destino_separados_por_coma&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.From=&amp;lt;mail_from&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPHost=&amp;lt;smtp_host&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPPort=&amp;lt;puerto&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPUsername=&amp;lt;username&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPPassword=&amp;lt;password&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPProtocol=smtps&lt;br /&gt;
log4j.appender.mailAppender.Subject=Alarma generada con Log4J&lt;br /&gt;
log4j.appender.mailAppender.layout=org.apache.log4j.PatternLayout&lt;br /&gt;
log4j.appender.mailAppender.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esta configuración los logs de nivel error o superior de la clase MyService enviarán un mail con la información que se loguee.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Log4j en J2EE, en servidores WebLogic==&lt;br /&gt;
&lt;br /&gt;
Si queres compartir los mismos componentes log4j en un módulo EJB y Web, y el EJB se usa localmente, en el ear tienen que estar el EJB y el Web. El log4-*.jar en /APP-INF/lib, y log4.properties en /APP-INF/classes. /APP-INF/ en la raíz del ear. &lt;br /&gt;
&lt;br /&gt;
Y dentro del build-impl.xml del ear, los sgtes. pasos para la tarea que crea el META-INF:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;copy todir=&amp;quot;${build.dir}/APP-INF/lib&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fileset file=&amp;quot;${log4j.jar}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/copy&amp;gt;&lt;br /&gt;
&amp;lt;copy todir=&amp;quot;${build.dir}/APP-INF/classes&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fileset file=&amp;quot;${log4j.properties}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/copy&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Log4J en Debug==&lt;br /&gt;
&lt;br /&gt;
Se puede usar el argumento '''-Dlog4j.debug''' como parametro para la JVM y muestra algunas cosas de log4J por consola, como por ejemplo, el archivo desde donde está levantando las propiedades.&lt;br /&gt;
&lt;br /&gt;
==Obtención del Logger==&lt;br /&gt;
Existe una serie de variantes para definir y obtener el logger de una clase:&lt;br /&gt;
&lt;br /&gt;
===Los modificadores===&lt;br /&gt;
====private====&lt;br /&gt;
Por lo general queremos que el logger se reporte como la clase que se está ejecutando. Utilizando private nos aseguramos que una clase que herede tenga que declarar su propio Logger y no usará accidentalmente el de la superclase. Contrariamente, si queremos por granularidad que utilice el de la superclase, habrá que declararlo como protected.&lt;br /&gt;
&lt;br /&gt;
====final====&lt;br /&gt;
La referencia al logger es la misma durante todo el ciclo de vida de una clase (si se declara static) o de un objeto (si es atributo de instancia). Por lo tanto, declarándola final se expresa esto, se protege a una asignación errónea y se mejora la performance.&lt;br /&gt;
&lt;br /&gt;
====static====&lt;br /&gt;
La creación del Logger está administrada por una fábrica a la que le pedimos las instancias. Es responsabilidad de la fábrica darnos la instancia correcta. En este caso, la motivación de utilizar static no es la de tener una sola copia. La motivación es que los logger no deben serializarse, deberían ser transient. Siendo static es una variable de la clase y no un atributo de la instancia, por lo que no será serializado. La razón de no marcarlo como transient (que sería conceptualmente más acertado) es que se debería implementar un mecanismo para que cuando la instancia es des-serializada, vuelva a obtener una copia del logger.&lt;br /&gt;
&lt;br /&gt;
====transient====&lt;br /&gt;
Los logger no deben ser serializados, por eso deberían ser marcados como transient. Es más fácil marcarlos como static ya que de esta forma no es necesario volver a obtenerlos cuando la clase es des-serializada. Si la clase no es serializable, no es necesario.&lt;br /&gt;
&lt;br /&gt;
===Clave para la obtención del logger===&lt;br /&gt;
El logger se le pide a la fábrica a través de una clave. Esta clave es de tipo String. El método está sobrecargado para recibir también un objeto de tipo class que luego la fábrica convertirá a String.&lt;br /&gt;
&lt;br /&gt;
====String====&lt;br /&gt;
 private static final Logger log = Logger.getLogger(&amp;quot;com.foo.bar.Blah&amp;quot;);&lt;br /&gt;
Utilizando un String se obtiene un logger independientemente de la clase donde se esté. Si lo que se busca el logger para la clase, esta es la forma más riesgosa ya que no está verificada por el compilador.&lt;br /&gt;
&lt;br /&gt;
====Objeto class====&lt;br /&gt;
 private static final Logger log = Logger.getLogger(Blah.class);&lt;br /&gt;
Utilizando un objeto de tipo Class permite que el compilador verifique el nombre de la clase. También se actualiza si se utiliza alguna herramienta o IDE para cambiar el nomre de la clase.&lt;br /&gt;
&lt;br /&gt;
====método getClass()====&lt;br /&gt;
 private transient Logger log = Logger.getLogger(getClass());&lt;br /&gt;
En este caso la clave se genera en tiempo de ejecución pidiendo al objeto su clase a través del método getClass(). Esto tiene la ventaja de que siempre tendrá el nombre apropiado de la clase. Tiene la restricción de que sólo se podrá utilizar si el logger es un atributo de  instancia (no static).&lt;br /&gt;
&lt;br /&gt;
Otra particularidad es que el método getClass() invocado en una clase padre responderá desde la clase hija.&lt;br /&gt;
&lt;br /&gt;
En caso de que el objeto sea serializable habrá que agregar el modificador transient para que no se serialice el logger.&lt;br /&gt;
&lt;br /&gt;
===Conclusión===&lt;br /&gt;
La forma práctica de no cometer errores es la de utilizar la combinación más restrictiva y cambiarla sólo si se tiene alguna razón claramente justificada e implementando los mecanismos necesarios.&lt;br /&gt;
&lt;br /&gt;
Forma típica:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
public class Blah {&lt;br /&gt;
    private static final Logger log = Logger.getLogger(Blah.class);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Log4JMDC ==&lt;br /&gt;
MDC es una característica de [[Log4J]] que permite agregar información adicional (de forma &amp;quot;clave=valor&amp;quot;), que luego puede ser referenciada en el patrón de log. Aquí entonces podemos almacenar datos generales (como ser, el nombre de usuario) y mostrarlos en todos los logs que se generen. &lt;br /&gt;
&lt;br /&gt;
En el patrón de log, se pueden hacer referencia a las variables del MDC usando: &lt;br /&gt;
 %X{clave}&lt;br /&gt;
&lt;br /&gt;
Los datos del MDC se guardan en el thread en ejecución. Un uso común es crear un Filter web, y allí guardar el nombre de usuario logueado en el entorno MDC, para que luego pueda loguearse. &lt;br /&gt;
&lt;br /&gt;
=== Filter web con MDC ===&lt;br /&gt;
El siguiente es un filter web común que guarda la variable &amp;quot;username&amp;quot; en el MDC, para luego referenciarla en patrón de log4j.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * To change this template, choose Tools | Templates&lt;br /&gt;
 * and open the template in the editor.&lt;br /&gt;
 */&lt;br /&gt;
package com.dosideas.mdc.filter;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import javax.servlet.*;&lt;br /&gt;
import org.apache.log4j.MDC;&lt;br /&gt;
import org.springframework.security.core.Authentication;&lt;br /&gt;
import org.springframework.security.core.context.SecurityContextHolder;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Adds MDC information for Log4j. In particular, it adds the username (if&lt;br /&gt;
 * available) to MDC.&lt;br /&gt;
 */&lt;br /&gt;
public class Log4jMDCFilter implements Filter {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {&lt;br /&gt;
&lt;br /&gt;
        String username = obtenerNombreDeUsuarioLogueado();&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            MDC.put(&amp;quot;username&amp;quot;, username);&lt;br /&gt;
            chain.doFilter(request, response);&lt;br /&gt;
        } finally {&lt;br /&gt;
            MDC.remove(&amp;quot;username&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void init(FilterConfig filterConfig) throws ServletException { }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void destroy() { }&lt;br /&gt;
&lt;br /&gt;
    private String obtenerNombreDeUsuarioLogueado() { .... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego, en el archivo log4j.xml podemos hacer uso de la variable username (noten el valor del atributo &amp;quot;ConversionPattern&amp;quot;): &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE log4j:configuration SYSTEM &amp;quot;log4j.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;log4j:configuration xmlns:log4j=&amp;quot;http://jakarta.apache.org/log4j/&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;appender name=&amp;quot;console&amp;quot; class=&amp;quot;org.apache.log4j.ConsoleAppender&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;param name=&amp;quot;Target&amp;quot; value=&amp;quot;System.out&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;layout class=&amp;quot;org.apache.log4j.PatternLayout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;param name=&amp;quot;ConversionPattern&amp;quot; value=&amp;quot;%-5p %d{ISO8601} [%X{username}] %c - %m%n&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/layout&amp;gt;&lt;br /&gt;
    &amp;lt;/appender&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;root&amp;gt;&lt;br /&gt;
        &amp;lt;priority value =&amp;quot;debug&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;appender-ref ref=&amp;quot;console&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/root&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/log4j:configuration&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modificar log4j en ejecución ==&lt;br /&gt;
Utilizando un listener de spring se puede configurar la ruta del archivo log4j.properties (fuera del empaquetado) y el tiempo en que se vuelve a leer el mismo, lo cual nos permite modificar sus valores en ejecucion sin necesidad de redeployar la aplicacion. &lt;br /&gt;
&lt;br /&gt;
Para esto se configura dentro del web.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;listener&amp;gt;&lt;br /&gt;
  &amp;lt;listener-class&amp;gt;org.springframework.web.util.Log4jConfigListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;
&amp;lt;/listener&amp;gt;&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
        &amp;lt;param-name&amp;gt;log4jConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;
        &amp;lt;param-value&amp;gt;file:/path/log4j.properties&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
        &amp;lt;param-name&amp;gt;log4jRefreshInterval&amp;lt;/param-name&amp;gt;&lt;br /&gt;
        &amp;lt;param-value&amp;gt;5000&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;   &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un error con el que nos podemos topar al momento de agregar esta configuración e intentar desplegar en Weblogic es el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;Cannot set web app root system property when WAR file is not expanded&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ante este error, la solución es agregar en el weblogic.xml dentro del tag &amp;lt;weblogic-web-app&amp;gt; el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;container-descriptor&amp;gt;&lt;br /&gt;
        &amp;lt;show-archived-real-path-enabled&amp;gt;true&amp;lt;/show-archived-real-path-enabled&amp;gt;&lt;br /&gt;
&amp;lt;/container-descriptor&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configurar Log4j con Spring ==&lt;br /&gt;
Para configurar Log4j con Spring se debe agregar el siguiente bean a la aplicación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;log4jInitializer&amp;quot;  class=&amp;quot;org.springframework.beans.factory.config.MethodInvokingFactoryBean&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;staticMethod&amp;quot;  value=&amp;quot;org.springframework.util.Log4jConfigurer.initLogging&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;arguments&amp;quot;&amp;gt;&lt;br /&gt;
       &amp;lt;list&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;file:/path/log4j.properties&amp;lt;/value&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;1000&amp;lt;/value&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
    &amp;lt;/property&amp;gt;&lt;br /&gt;
 &amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el bean se esta indicando la ruta desde la cual se va a tomar el log4j.properties y el intervalo de refresco, el cual nos permite modificar sus valores en ejecucion sin necesidad de redeployar la aplicacion.&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [http://logging.apache.org/log4j Web oficial de Log4J]&lt;br /&gt;
* [http://logging.apache.org/log4j/docs/api/org/apache/log4j/spi/LoggingEvent.html Javadoc del LogginEvent]&lt;br /&gt;
* [http://www.slideshare.net/Emmerson_Miranda/log4j-1215-short-manual Introducción a Log4j]&lt;br /&gt;
* [http://books.google.com.ar/books?id=vHvY008Zq-YC&amp;amp;pg=PA158&amp;amp;lpg=PA158&amp;amp;dq=weblogic+same+class+loader+log4j&amp;amp;source=bl&amp;amp;ots=yh8Z3e1X7C&amp;amp;sig=x81fCioIEn5nGAZNRg8kLNcOk0Y&amp;amp;hl=es&amp;amp;ei=x267Sum5HprKtgfD1NXEDQ&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=7#v=onepage&amp;amp;q=weblogic%20same%20class%20loader%20log4j&amp;amp;f=false Pro Apache Log4j]&lt;br /&gt;
* [[Slf4J]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Java&amp;diff=6642</id>
		<title>Java</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Java&amp;diff=6642"/>
				<updated>2012-07-02T20:07:32Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Cuestiones generales de Java */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Java]]&lt;br /&gt;
Java es un lenguaje de programación, aunque también se suele hacer referencia con este nombre a toda una plataforma para el desarrollo de aplicaciones. Hay un buen [http://es.wikipedia.org/wiki/Java_%28Sun%29 resumen de Java en la wikipedia].&lt;br /&gt;
&lt;br /&gt;
Al desarrollar un sistema se suele basar en una [[Arquitectura De Software]] para crear los componentes.&lt;br /&gt;
&lt;br /&gt;
Java se caracteriza por una enorme cantidad de proyectos libres.&lt;br /&gt;
&lt;br /&gt;
== Algunas tecnologías Java ==&lt;br /&gt;
=== Frameworks de base===&lt;br /&gt;
* [[Spring Framework]]&lt;br /&gt;
* [[Terracotta]]&lt;br /&gt;
* [[EJB]]&lt;br /&gt;
* [[Restlet]]&lt;br /&gt;
&lt;br /&gt;
===Acceso a datos===&lt;br /&gt;
* [[Hibernate]]&lt;br /&gt;
* [[Apache Lucene]]&lt;br /&gt;
&lt;br /&gt;
===Frameworks de presentación===&lt;br /&gt;
* [[Apache Tiles]]&lt;br /&gt;
* [[Struts]]&lt;br /&gt;
* [[JSF]]&lt;br /&gt;
* [[JSTL]]&lt;br /&gt;
* [[GWT]]&lt;br /&gt;
&lt;br /&gt;
===Librerías===&lt;br /&gt;
* [[Google Guava]]&lt;br /&gt;
* [[Jawr]]&lt;br /&gt;
&lt;br /&gt;
===Mensajeria===&lt;br /&gt;
* [[JMS]]&lt;br /&gt;
&lt;br /&gt;
===Web Services===&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
&lt;br /&gt;
===Ejecuciones batch y programadas===&lt;br /&gt;
* [[Quartz]]&lt;br /&gt;
* [[Spring Batch]]&lt;br /&gt;
&lt;br /&gt;
===Cuestiones generales de Java===&lt;br /&gt;
* [[Fechas En Java]]&lt;br /&gt;
* [[Numeros En Java]]&lt;br /&gt;
* [[Encoding En Java]]&lt;br /&gt;
* [[Serializacion De Objetos En Java]]&lt;br /&gt;
* [[Log4J]]&lt;br /&gt;
* [[Slf4J]]&lt;br /&gt;
* [[Cache De Objetos Java]]&lt;br /&gt;
* [[Exportacion Hacia Archivos]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Apache_Tiles&amp;diff=6625</id>
		<title>Apache Tiles</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Apache_Tiles&amp;diff=6625"/>
				<updated>2012-06-11T14:32:33Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* 2. Actualizar la configuración del web.xml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Apache Tiles]] es un framework de template para simplificar el desarrollo de interfaces de usuario. Tiles permite definir ''fragmentos'' y crear páginas que se ensamblan en tiempo de ejecución con estos fragmentos.&lt;br /&gt;
&lt;br /&gt;
== Configuración rápida de Apache Tiles 3.0 ==&lt;br /&gt;
Configurar Apache Tiles 3.0 para un sitio web consiste de estos pasos básicos: &lt;br /&gt;
# Agregar las librerias de Tiles al proyecto.&lt;br /&gt;
# Crear el archivo de configuración ''tiles.xml''' con las definiciones de las páginas.&lt;br /&gt;
# Configurar el listener de Tiles en el archivo web.xml para que levante la configuración del punto 2. &lt;br /&gt;
# Configurar un Servlet que atienda peticiones y cree las páginas a partir de las definiciones del punto 2.&lt;br /&gt;
&lt;br /&gt;
=== 1. Configurar las librerias de Tiles ===&lt;br /&gt;
Usando Maven, incluir 3 dependencias: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-servlet&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-jsp&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-extras&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Configurar tiles.xml ===&lt;br /&gt;
Crear un archivo '''WEB-INF/tiles.xml''' en la aplicación web. El siguiente archivo tiene una definición de ejemplo agregada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE tiles-definitions PUBLIC&lt;br /&gt;
       &amp;quot;-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN&amp;quot;&lt;br /&gt;
       &amp;quot;http://tiles.apache.org/dtds/tiles-config_2_1.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tiles-definitions&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;definition name=&amp;quot;prueba/holamundo&amp;quot; template=&amp;quot;/WEB-INF/layouts/default.jsp&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;put-attribute name=&amp;quot;titulo&amp;quot; value=&amp;quot;Un hola mundo con Tiles&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;put-attribute name=&amp;quot;menu&amp;quot; value=&amp;quot;/WEB-INF/jsp/menu.jsp&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;put-attribute name=&amp;quot;body&amp;quot; value=&amp;quot;/WEB-INF/jsp/holamundo.jsp&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/definition&amp;gt;&lt;br /&gt;
&amp;lt;/tiles-definitions&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La definición del template ====&lt;br /&gt;
El ejemplo anterior hace referencia a un template, que contiene la estructura de la página. El template tiene lugares (placeholders) donde se ubican los fragmentos. Un template de ejemplo podría ser: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;%@ taglib uri=&amp;quot;http://tiles.apache.org/tags-tiles&amp;quot; prefix=&amp;quot;tiles&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;&amp;lt;tiles:getAsString name=&amp;quot;title&amp;quot;/&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;lateral&amp;quot;&amp;gt;&amp;lt;tiles:insertAttribute name=&amp;quot;menu&amp;quot;/&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;principal&amp;quot;&amp;gt;&amp;lt;tiles:insertAttribute name=&amp;quot;body&amp;quot;/&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Configurar el listener de Tiles ===&lt;br /&gt;
En el archivo '''web.xml''' configurar el listener de Tiles 3: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;listener&amp;gt;&lt;br /&gt;
        &amp;lt;listener-class&amp;gt;org.apache.tiles.extras.complete.CompleteAutoloadTilesListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;
    &amp;lt;/listener&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Configurar un servlet que atienda peticiones ===&lt;br /&gt;
Tiles brinda integración con varios frameworks de presentación (como Struts, Spring, Shale, Velocity y otros). También provee de un Servlet muy sencillo que atiende las peticiones y renderiza directo la definición asociada. &lt;br /&gt;
&lt;br /&gt;
La configuración de este Servlet se hace en el archivo ''web.xml'': &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;servlet&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Tiles Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-class&amp;gt;org.apache.tiles.web.util.TilesDispatchServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;load-on-startup&amp;gt;2&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Tiles Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;*.tiles&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esta configuración puede desplegarse la aplicación. La petición &amp;quot;prueba/holamundo.tiles&amp;quot; será atendida por este servlet, y aplicada la definición en ''tiles.xml''. &lt;br /&gt;
&lt;br /&gt;
== Migrar de Tiles 2.2 a Tiles 3.0 ==&lt;br /&gt;
La migración de Tiles 2.2 a Tiles 3.0 es sencilla e involucra los siguienets pasos: &lt;br /&gt;
&lt;br /&gt;
# Actualizar los JAR&lt;br /&gt;
# Actualizar la configuración del web.xml&lt;br /&gt;
# Actualizar los tags en los templates&lt;br /&gt;
# Actualizar el DTD de tiles.xml (opcional)&lt;br /&gt;
&lt;br /&gt;
=== 1. Actualizar los JAR ===&lt;br /&gt;
Tiles 3.0 necesita de 3 JAR para funcionar. Usando [[Maven]]: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-servlet&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-jsp&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-extras&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Actualizar la configuración del web.xml ===&lt;br /&gt;
Tiles 2.2 usaba un listener simple para levantar la configuración de Tiles, llamado ''org.apache.tiles.web.startup.simple.SimpleTilesListener''. Esta clase sigue existendo en Tiles 3, pero no parece funcionar correctamente ([https://issues.apache.org/jira/browse/TILES-553 confirmado como bug]). La solución es reemplazar el listener por el nuevo de Tiles 3: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;listener&amp;gt;&lt;br /&gt;
        &amp;lt;listener-class&amp;gt;org.apache.tiles.extras.complete.CompleteAutoloadTilesListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;
    &amp;lt;/listener&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Actualizar los tags en los templates ===&lt;br /&gt;
Los templates usan los taglib de Tiles para insertar definiciones. En particular, en Tiles 3 dejó de existir el tag '''tiles:useAttribute''' el cual es reemplazado por el tag '''tiles:importAttribute'''. &lt;br /&gt;
&lt;br /&gt;
=== 4. Actualizar el DTD de tiles.xml (opcional) ===&lt;br /&gt;
Por último, el archivo '''tiles.xml''' tiene un nuevo DTD, el cual se puede actualizar. Este paso es opcional, ya que Tiles 3 funciona con la configuración de Tiles 2. &lt;br /&gt;
&lt;br /&gt;
El nuevo encabezado para los archivos de definición de tiles (tiles.xml y demás) es: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE tiles-definitions PUBLIC&lt;br /&gt;
       &amp;quot;-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN&amp;quot;&lt;br /&gt;
       &amp;quot;http://tiles.apache.org/dtds/tiles-config_3_0.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://tiles.apache.org Página oficial de Apache Tiles]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Apache_Tiles&amp;diff=6624</id>
		<title>Apache Tiles</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Apache_Tiles&amp;diff=6624"/>
				<updated>2012-06-11T14:32:01Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* 2. Actualizar la configuración del web.xml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Apache Tiles]] es un framework de template para simplificar el desarrollo de interfaces de usuario. Tiles permite definir ''fragmentos'' y crear páginas que se ensamblan en tiempo de ejecución con estos fragmentos.&lt;br /&gt;
&lt;br /&gt;
== Configuración rápida de Apache Tiles 3.0 ==&lt;br /&gt;
Configurar Apache Tiles 3.0 para un sitio web consiste de estos pasos básicos: &lt;br /&gt;
# Agregar las librerias de Tiles al proyecto.&lt;br /&gt;
# Crear el archivo de configuración ''tiles.xml''' con las definiciones de las páginas.&lt;br /&gt;
# Configurar el listener de Tiles en el archivo web.xml para que levante la configuración del punto 2. &lt;br /&gt;
# Configurar un Servlet que atienda peticiones y cree las páginas a partir de las definiciones del punto 2.&lt;br /&gt;
&lt;br /&gt;
=== 1. Configurar las librerias de Tiles ===&lt;br /&gt;
Usando Maven, incluir 3 dependencias: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-servlet&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-jsp&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-extras&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Configurar tiles.xml ===&lt;br /&gt;
Crear un archivo '''WEB-INF/tiles.xml''' en la aplicación web. El siguiente archivo tiene una definición de ejemplo agregada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE tiles-definitions PUBLIC&lt;br /&gt;
       &amp;quot;-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN&amp;quot;&lt;br /&gt;
       &amp;quot;http://tiles.apache.org/dtds/tiles-config_2_1.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tiles-definitions&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;definition name=&amp;quot;prueba/holamundo&amp;quot; template=&amp;quot;/WEB-INF/layouts/default.jsp&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;put-attribute name=&amp;quot;titulo&amp;quot; value=&amp;quot;Un hola mundo con Tiles&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;put-attribute name=&amp;quot;menu&amp;quot; value=&amp;quot;/WEB-INF/jsp/menu.jsp&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;put-attribute name=&amp;quot;body&amp;quot; value=&amp;quot;/WEB-INF/jsp/holamundo.jsp&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/definition&amp;gt;&lt;br /&gt;
&amp;lt;/tiles-definitions&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La definición del template ====&lt;br /&gt;
El ejemplo anterior hace referencia a un template, que contiene la estructura de la página. El template tiene lugares (placeholders) donde se ubican los fragmentos. Un template de ejemplo podría ser: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;%@ taglib uri=&amp;quot;http://tiles.apache.org/tags-tiles&amp;quot; prefix=&amp;quot;tiles&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;&amp;lt;tiles:getAsString name=&amp;quot;title&amp;quot;/&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;lateral&amp;quot;&amp;gt;&amp;lt;tiles:insertAttribute name=&amp;quot;menu&amp;quot;/&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;principal&amp;quot;&amp;gt;&amp;lt;tiles:insertAttribute name=&amp;quot;body&amp;quot;/&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Configurar el listener de Tiles ===&lt;br /&gt;
En el archivo '''web.xml''' configurar el listener de Tiles 3: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;listener&amp;gt;&lt;br /&gt;
        &amp;lt;listener-class&amp;gt;org.apache.tiles.extras.complete.CompleteAutoloadTilesListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;
    &amp;lt;/listener&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Configurar un servlet que atienda peticiones ===&lt;br /&gt;
Tiles brinda integración con varios frameworks de presentación (como Struts, Spring, Shale, Velocity y otros). También provee de un Servlet muy sencillo que atiende las peticiones y renderiza directo la definición asociada. &lt;br /&gt;
&lt;br /&gt;
La configuración de este Servlet se hace en el archivo ''web.xml'': &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;servlet&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Tiles Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-class&amp;gt;org.apache.tiles.web.util.TilesDispatchServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;load-on-startup&amp;gt;2&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Tiles Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;*.tiles&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esta configuración puede desplegarse la aplicación. La petición &amp;quot;prueba/holamundo.tiles&amp;quot; será atendida por este servlet, y aplicada la definición en ''tiles.xml''. &lt;br /&gt;
&lt;br /&gt;
== Migrar de Tiles 2.2 a Tiles 3.0 ==&lt;br /&gt;
La migración de Tiles 2.2 a Tiles 3.0 es sencilla e involucra los siguienets pasos: &lt;br /&gt;
&lt;br /&gt;
# Actualizar los JAR&lt;br /&gt;
# Actualizar la configuración del web.xml&lt;br /&gt;
# Actualizar los tags en los templates&lt;br /&gt;
# Actualizar el DTD de tiles.xml (opcional)&lt;br /&gt;
&lt;br /&gt;
=== 1. Actualizar los JAR ===&lt;br /&gt;
Tiles 3.0 necesita de 3 JAR para funcionar. Usando [[Maven]]: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-servlet&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-jsp&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-extras&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Actualizar la configuración del web.xml ===&lt;br /&gt;
Tiles 2.2 usaba un listener simple para levantar la configuración de Tiles, llamado ''org.apache.tiles.web.startup.simple.SimpleTilesListener''. Esta clase sigue existendo en Tiles 3, pero no parece funcionar correctamente ([https://issues.apache.org/jira/browse/TILES-553 confirmado como bug]. La solución es reemplazar el listener por el nuevo de Tiles 3: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;listener&amp;gt;&lt;br /&gt;
        &amp;lt;listener-class&amp;gt;org.apache.tiles.extras.complete.CompleteAutoloadTilesListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;
    &amp;lt;/listener&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Actualizar los tags en los templates ===&lt;br /&gt;
Los templates usan los taglib de Tiles para insertar definiciones. En particular, en Tiles 3 dejó de existir el tag '''tiles:useAttribute''' el cual es reemplazado por el tag '''tiles:importAttribute'''. &lt;br /&gt;
&lt;br /&gt;
=== 4. Actualizar el DTD de tiles.xml (opcional) ===&lt;br /&gt;
Por último, el archivo '''tiles.xml''' tiene un nuevo DTD, el cual se puede actualizar. Este paso es opcional, ya que Tiles 3 funciona con la configuración de Tiles 2. &lt;br /&gt;
&lt;br /&gt;
El nuevo encabezado para los archivos de definición de tiles (tiles.xml y demás) es: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE tiles-definitions PUBLIC&lt;br /&gt;
       &amp;quot;-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN&amp;quot;&lt;br /&gt;
       &amp;quot;http://tiles.apache.org/dtds/tiles-config_3_0.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://tiles.apache.org Página oficial de Apache Tiles]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Apache_Tiles&amp;diff=6623</id>
		<title>Apache Tiles</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Apache_Tiles&amp;diff=6623"/>
				<updated>2012-06-08T13:18:19Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Apache Tiles]] es un framework de template para simplificar el desarrollo de interfaces de usuario. Tiles permite definir ''fragmentos'' y crear páginas que se ensamblan en tiempo de ejecución con estos fragmentos.&lt;br /&gt;
&lt;br /&gt;
== Configuración rápida de Apache Tiles 3.0 ==&lt;br /&gt;
Configurar Apache Tiles 3.0 para un sitio web consiste de estos pasos básicos: &lt;br /&gt;
# Agregar las librerias de Tiles al proyecto.&lt;br /&gt;
# Crear el archivo de configuración ''tiles.xml''' con las definiciones de las páginas.&lt;br /&gt;
# Configurar el listener de Tiles en el archivo web.xml para que levante la configuración del punto 2. &lt;br /&gt;
# Configurar un Servlet que atienda peticiones y cree las páginas a partir de las definiciones del punto 2.&lt;br /&gt;
&lt;br /&gt;
=== 1. Configurar las librerias de Tiles ===&lt;br /&gt;
Usando Maven, incluir 3 dependencias: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-servlet&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-jsp&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-extras&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Configurar tiles.xml ===&lt;br /&gt;
Crear un archivo '''WEB-INF/tiles.xml''' en la aplicación web. El siguiente archivo tiene una definición de ejemplo agregada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE tiles-definitions PUBLIC&lt;br /&gt;
       &amp;quot;-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN&amp;quot;&lt;br /&gt;
       &amp;quot;http://tiles.apache.org/dtds/tiles-config_2_1.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tiles-definitions&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;definition name=&amp;quot;prueba/holamundo&amp;quot; template=&amp;quot;/WEB-INF/layouts/default.jsp&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;put-attribute name=&amp;quot;titulo&amp;quot; value=&amp;quot;Un hola mundo con Tiles&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;put-attribute name=&amp;quot;menu&amp;quot; value=&amp;quot;/WEB-INF/jsp/menu.jsp&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;put-attribute name=&amp;quot;body&amp;quot; value=&amp;quot;/WEB-INF/jsp/holamundo.jsp&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/definition&amp;gt;&lt;br /&gt;
&amp;lt;/tiles-definitions&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La definición del template ====&lt;br /&gt;
El ejemplo anterior hace referencia a un template, que contiene la estructura de la página. El template tiene lugares (placeholders) donde se ubican los fragmentos. Un template de ejemplo podría ser: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;%@ taglib uri=&amp;quot;http://tiles.apache.org/tags-tiles&amp;quot; prefix=&amp;quot;tiles&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;&amp;lt;tiles:getAsString name=&amp;quot;title&amp;quot;/&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;lateral&amp;quot;&amp;gt;&amp;lt;tiles:insertAttribute name=&amp;quot;menu&amp;quot;/&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;principal&amp;quot;&amp;gt;&amp;lt;tiles:insertAttribute name=&amp;quot;body&amp;quot;/&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Configurar el listener de Tiles ===&lt;br /&gt;
En el archivo '''web.xml''' configurar el listener de Tiles 3: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;listener&amp;gt;&lt;br /&gt;
        &amp;lt;listener-class&amp;gt;org.apache.tiles.extras.complete.CompleteAutoloadTilesListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;
    &amp;lt;/listener&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Configurar un servlet que atienda peticiones ===&lt;br /&gt;
Tiles brinda integración con varios frameworks de presentación (como Struts, Spring, Shale, Velocity y otros). También provee de un Servlet muy sencillo que atiende las peticiones y renderiza directo la definición asociada. &lt;br /&gt;
&lt;br /&gt;
La configuración de este Servlet se hace en el archivo ''web.xml'': &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;servlet&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Tiles Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-class&amp;gt;org.apache.tiles.web.util.TilesDispatchServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;load-on-startup&amp;gt;2&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Tiles Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;*.tiles&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esta configuración puede desplegarse la aplicación. La petición &amp;quot;prueba/holamundo.tiles&amp;quot; será atendida por este servlet, y aplicada la definición en ''tiles.xml''. &lt;br /&gt;
&lt;br /&gt;
== Migrar de Tiles 2.2 a Tiles 3.0 ==&lt;br /&gt;
La migración de Tiles 2.2 a Tiles 3.0 es sencilla e involucra los siguienets pasos: &lt;br /&gt;
&lt;br /&gt;
# Actualizar los JAR&lt;br /&gt;
# Actualizar la configuración del web.xml&lt;br /&gt;
# Actualizar los tags en los templates&lt;br /&gt;
# Actualizar el DTD de tiles.xml (opcional)&lt;br /&gt;
&lt;br /&gt;
=== 1. Actualizar los JAR ===&lt;br /&gt;
Tiles 3.0 necesita de 3 JAR para funcionar. Usando [[Maven]]: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-servlet&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-jsp&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-extras&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Actualizar la configuración del web.xml ===&lt;br /&gt;
Tiles 2.2 usaba un listener simple para levantar la configuración de Tiles, llamado ''org.apache.tiles.web.startup.simple.SimpleTilesListener''. Esta clase sigue existendo en Tiles 3, pero no parece funcionar correctamente. La solución es reemplazar el listener por el nuevo de Tiles 3: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;listener&amp;gt;&lt;br /&gt;
        &amp;lt;listener-class&amp;gt;org.apache.tiles.extras.complete.CompleteAutoloadTilesListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;
    &amp;lt;/listener&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Actualizar los tags en los templates ===&lt;br /&gt;
Los templates usan los taglib de Tiles para insertar definiciones. En particular, en Tiles 3 dejó de existir el tag '''tiles:useAttribute''' el cual es reemplazado por el tag '''tiles:importAttribute'''. &lt;br /&gt;
&lt;br /&gt;
=== 4. Actualizar el DTD de tiles.xml (opcional) ===&lt;br /&gt;
Por último, el archivo '''tiles.xml''' tiene un nuevo DTD, el cual se puede actualizar. Este paso es opcional, ya que Tiles 3 funciona con la configuración de Tiles 2. &lt;br /&gt;
&lt;br /&gt;
El nuevo encabezado para los archivos de definición de tiles (tiles.xml y demás) es: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE tiles-definitions PUBLIC&lt;br /&gt;
       &amp;quot;-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN&amp;quot;&lt;br /&gt;
       &amp;quot;http://tiles.apache.org/dtds/tiles-config_3_0.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://tiles.apache.org Página oficial de Apache Tiles]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Apache_Tiles&amp;diff=6622</id>
		<title>Apache Tiles</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Apache_Tiles&amp;diff=6622"/>
				<updated>2012-06-08T13:11:16Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* La definición del template */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Apache Tiles]] es un framework de template para simplificar el desarrollo de interfaces de usuario. Tiles permite definir ''fragmentos'' y crear páginas que se ensamblan en tiempo de ejecución con estos fragmentos.&lt;br /&gt;
&lt;br /&gt;
== Configuración rápida de Apache Tiles 3.0 ==&lt;br /&gt;
Configurar Apache Tiles 3.0 para un sitio web consiste de estos pasos básicos: &lt;br /&gt;
# Agregar las librerias de Tiles al proyecto.&lt;br /&gt;
# Crear el archivo de configuración ''tiles.xml''' con las definiciones de las páginas.&lt;br /&gt;
# Configurar el listener de Tiles en el archivo web.xml para que levante la configuración del punto 2. &lt;br /&gt;
# Configurar un Servlet que atienda peticiones y cree las páginas a partir de las definiciones del punto 2.&lt;br /&gt;
&lt;br /&gt;
=== 1. Configurar las librerias de Tiles ===&lt;br /&gt;
Usando Maven, incluir 3 dependencias: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-servlet&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-jsp&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-extras&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Configurar tiles.xml ===&lt;br /&gt;
Crear un archivo '''WEB-INF/tiles.xml''' en la aplicación web. El siguiente archivo tiene una definición de ejemplo agregada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE tiles-definitions PUBLIC&lt;br /&gt;
       &amp;quot;-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN&amp;quot;&lt;br /&gt;
       &amp;quot;http://tiles.apache.org/dtds/tiles-config_2_1.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tiles-definitions&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;definition name=&amp;quot;prueba/holamundo&amp;quot; template=&amp;quot;/WEB-INF/layouts/default.jsp&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;put-attribute name=&amp;quot;titulo&amp;quot; value=&amp;quot;Un hola mundo con Tiles&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;put-attribute name=&amp;quot;menu&amp;quot; value=&amp;quot;/WEB-INF/jsp/menu.jsp&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;put-attribute name=&amp;quot;body&amp;quot; value=&amp;quot;/WEB-INF/jsp/holamundo.jsp&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/definition&amp;gt;&lt;br /&gt;
&amp;lt;/tiles-definitions&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La definición del template ====&lt;br /&gt;
El ejemplo anterior hace referencia a un template, que contiene la estructura de la página. El template tiene lugares (placeholders) donde se ubican los fragmentos. Un template de ejemplo podría ser: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;%@ taglib uri=&amp;quot;http://tiles.apache.org/tags-tiles&amp;quot; prefix=&amp;quot;tiles&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;&amp;lt;tiles:getAsString name=&amp;quot;title&amp;quot;/&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;lateral&amp;quot;&amp;gt;&amp;lt;tiles:insertAttribute name=&amp;quot;menu&amp;quot;/&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;principal&amp;quot;&amp;gt;&amp;lt;tiles:insertAttribute name=&amp;quot;body&amp;quot;/&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Configurar el listener de Tiles ===&lt;br /&gt;
En el archivo '''web.xml''' configurar el listener de Tiles 3: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;listener&amp;gt;&lt;br /&gt;
        &amp;lt;listener-class&amp;gt;org.apache.tiles.extras.complete.CompleteAutoloadTilesListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;
    &amp;lt;/listener&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Configurar un servlet que atienda peticiones ===&lt;br /&gt;
Tiles brinda integración con varios frameworks de presentación (como Struts, Spring, Shale, Velocity y otros). También provee de un Servlet muy sencillo que atiende las peticiones y renderiza directo la definición asociada. &lt;br /&gt;
&lt;br /&gt;
La configuración de este Servlet se hace en el archivo ''web.xml'': &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;servlet&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Tiles Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-class&amp;gt;org.apache.tiles.web.util.TilesDispatchServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;load-on-startup&amp;gt;2&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Tiles Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;*.tiles&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esta configuración puede desplegarse la aplicación. La petición &amp;quot;prueba/holamundo.tiles&amp;quot; será atendida por este servlet, y aplicada la definición en ''tiles.xml''. &lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://tiles.apache.org Página oficial de Apache Tiles]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Apache_Tiles&amp;diff=6621</id>
		<title>Apache Tiles</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Apache_Tiles&amp;diff=6621"/>
				<updated>2012-06-08T13:10:48Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* La definición del template */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Apache Tiles]] es un framework de template para simplificar el desarrollo de interfaces de usuario. Tiles permite definir ''fragmentos'' y crear páginas que se ensamblan en tiempo de ejecución con estos fragmentos.&lt;br /&gt;
&lt;br /&gt;
== Configuración rápida de Apache Tiles 3.0 ==&lt;br /&gt;
Configurar Apache Tiles 3.0 para un sitio web consiste de estos pasos básicos: &lt;br /&gt;
# Agregar las librerias de Tiles al proyecto.&lt;br /&gt;
# Crear el archivo de configuración ''tiles.xml''' con las definiciones de las páginas.&lt;br /&gt;
# Configurar el listener de Tiles en el archivo web.xml para que levante la configuración del punto 2. &lt;br /&gt;
# Configurar un Servlet que atienda peticiones y cree las páginas a partir de las definiciones del punto 2.&lt;br /&gt;
&lt;br /&gt;
=== 1. Configurar las librerias de Tiles ===&lt;br /&gt;
Usando Maven, incluir 3 dependencias: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-servlet&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-jsp&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-extras&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Configurar tiles.xml ===&lt;br /&gt;
Crear un archivo '''WEB-INF/tiles.xml''' en la aplicación web. El siguiente archivo tiene una definición de ejemplo agregada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE tiles-definitions PUBLIC&lt;br /&gt;
       &amp;quot;-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN&amp;quot;&lt;br /&gt;
       &amp;quot;http://tiles.apache.org/dtds/tiles-config_2_1.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tiles-definitions&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;definition name=&amp;quot;prueba/holamundo&amp;quot; template=&amp;quot;/WEB-INF/layouts/default.jsp&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;put-attribute name=&amp;quot;titulo&amp;quot; value=&amp;quot;Un hola mundo con Tiles&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;put-attribute name=&amp;quot;menu&amp;quot; value=&amp;quot;/WEB-INF/jsp/menu.jsp&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;put-attribute name=&amp;quot;body&amp;quot; value=&amp;quot;/WEB-INF/jsp/holamundo.jsp&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/definition&amp;gt;&lt;br /&gt;
&amp;lt;/tiles-definitions&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La definición del template ====&lt;br /&gt;
El ejemplo anterior hace referencia a un template, que contiene la estructura de la página. El template tiene lugares (placeholders) donde se ubican los fragmentos. Un template de ejemplo podría ser: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code html5&amp;gt;&lt;br /&gt;
&amp;lt;%@ taglib uri=&amp;quot;http://tiles.apache.org/tags-tiles&amp;quot; prefix=&amp;quot;tiles&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;&amp;lt;tiles:getAsString name=&amp;quot;title&amp;quot;/&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;lateral&amp;quot;&amp;gt;&amp;lt;tiles:insertAttribute name=&amp;quot;menu&amp;quot;/&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;principal&amp;quot;&amp;gt;&amp;lt;tiles:insertAttribute name=&amp;quot;body&amp;quot;/&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Configurar el listener de Tiles ===&lt;br /&gt;
En el archivo '''web.xml''' configurar el listener de Tiles 3: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;listener&amp;gt;&lt;br /&gt;
        &amp;lt;listener-class&amp;gt;org.apache.tiles.extras.complete.CompleteAutoloadTilesListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;
    &amp;lt;/listener&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Configurar un servlet que atienda peticiones ===&lt;br /&gt;
Tiles brinda integración con varios frameworks de presentación (como Struts, Spring, Shale, Velocity y otros). También provee de un Servlet muy sencillo que atiende las peticiones y renderiza directo la definición asociada. &lt;br /&gt;
&lt;br /&gt;
La configuración de este Servlet se hace en el archivo ''web.xml'': &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;servlet&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Tiles Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-class&amp;gt;org.apache.tiles.web.util.TilesDispatchServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;load-on-startup&amp;gt;2&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Tiles Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;*.tiles&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esta configuración puede desplegarse la aplicación. La petición &amp;quot;prueba/holamundo.tiles&amp;quot; será atendida por este servlet, y aplicada la definición en ''tiles.xml''. &lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://tiles.apache.org Página oficial de Apache Tiles]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Apache_Tiles&amp;diff=6620</id>
		<title>Apache Tiles</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Apache_Tiles&amp;diff=6620"/>
				<updated>2012-06-08T13:05:40Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Página creada con 'Apache Tiles es un framework de template para simplificar el desarrollo de interfaces de usuario. Tiles permite definir ''fragmentos'' y crear páginas que se ensamblan en t…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Apache Tiles]] es un framework de template para simplificar el desarrollo de interfaces de usuario. Tiles permite definir ''fragmentos'' y crear páginas que se ensamblan en tiempo de ejecución con estos fragmentos.&lt;br /&gt;
&lt;br /&gt;
== Configuración rápida de Apache Tiles 3.0 ==&lt;br /&gt;
Configurar Apache Tiles 3.0 para un sitio web consiste de estos pasos básicos: &lt;br /&gt;
# Agregar las librerias de Tiles al proyecto.&lt;br /&gt;
# Crear el archivo de configuración ''tiles.xml''' con las definiciones de las páginas.&lt;br /&gt;
# Configurar el listener de Tiles en el archivo web.xml para que levante la configuración del punto 2. &lt;br /&gt;
# Configurar un Servlet que atienda peticiones y cree las páginas a partir de las definiciones del punto 2.&lt;br /&gt;
&lt;br /&gt;
=== 1. Configurar las librerias de Tiles ===&lt;br /&gt;
Usando Maven, incluir 3 dependencias: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-servlet&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-jsp&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
        &amp;lt;dependency&amp;gt;&lt;br /&gt;
            &amp;lt;groupId&amp;gt;org.apache.tiles&amp;lt;/groupId&amp;gt;&lt;br /&gt;
            &amp;lt;artifactId&amp;gt;tiles-extras&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
            &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Configurar tiles.xml ===&lt;br /&gt;
Crear un archivo '''WEB-INF/tiles.xml''' en la aplicación web. El siguiente archivo tiene una definición de ejemplo agregada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE tiles-definitions PUBLIC&lt;br /&gt;
       &amp;quot;-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN&amp;quot;&lt;br /&gt;
       &amp;quot;http://tiles.apache.org/dtds/tiles-config_2_1.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tiles-definitions&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;definition name=&amp;quot;prueba/holamundo&amp;quot; template=&amp;quot;/WEB-INF/layouts/default.jsp&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;put-attribute name=&amp;quot;titulo&amp;quot; value=&amp;quot;Un hola mundo con Tiles&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;put-attribute name=&amp;quot;menu&amp;quot; value=&amp;quot;/WEB-INF/jsp/menu.jsp&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;put-attribute name=&amp;quot;body&amp;quot; value=&amp;quot;/WEB-INF/jsp/holamundo.jsp&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/definition&amp;gt;&lt;br /&gt;
&amp;lt;/tiles-definitions&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La definición del template ====&lt;br /&gt;
El ejemplo anterior hace referencia a un template, que contiene la estructura de la página. El template tiene lugares (placeholders) donde se ubican los fragmentos. Un template de ejemplo podría ser: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code html&amp;gt;&lt;br /&gt;
&amp;lt;%@ taglib uri=&amp;quot;http://tiles.apache.org/tags-tiles&amp;quot; prefix=&amp;quot;tiles&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;&amp;lt;tiles:getAsString name=&amp;quot;title&amp;quot;/&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;lateral&amp;quot;&amp;gt;&amp;lt;tiles:insertAttribute name=&amp;quot;menu&amp;quot;/&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;principal&amp;quot;&amp;gt;&amp;lt;tiles:insertAttribute name=&amp;quot;body&amp;quot;/&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Configurar el listener de Tiles ===&lt;br /&gt;
En el archivo '''web.xml''' configurar el listener de Tiles 3: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;listener&amp;gt;&lt;br /&gt;
        &amp;lt;listener-class&amp;gt;org.apache.tiles.extras.complete.CompleteAutoloadTilesListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;
    &amp;lt;/listener&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Configurar un servlet que atienda peticiones ===&lt;br /&gt;
Tiles brinda integración con varios frameworks de presentación (como Struts, Spring, Shale, Velocity y otros). También provee de un Servlet muy sencillo que atiende las peticiones y renderiza directo la definición asociada. &lt;br /&gt;
&lt;br /&gt;
La configuración de este Servlet se hace en el archivo ''web.xml'': &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;servlet&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Tiles Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-class&amp;gt;org.apache.tiles.web.util.TilesDispatchServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;load-on-startup&amp;gt;2&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Tiles Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;*.tiles&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esta configuración puede desplegarse la aplicación. La petición &amp;quot;prueba/holamundo.tiles&amp;quot; será atendida por este servlet, y aplicada la definición en ''tiles.xml''. &lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://tiles.apache.org Página oficial de Apache Tiles]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Java&amp;diff=6619</id>
		<title>Java</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Java&amp;diff=6619"/>
				<updated>2012-06-08T12:05:32Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Frameworks de presentación */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Java]]&lt;br /&gt;
Java es un lenguaje de programación, aunque también se suele hacer referencia con este nombre a toda una plataforma para el desarrollo de aplicaciones. Hay un buen [http://es.wikipedia.org/wiki/Java_%28Sun%29 resumen de Java en la wikipedia].&lt;br /&gt;
&lt;br /&gt;
Al desarrollar un sistema se suele basar en una [[Arquitectura De Software]] para crear los componentes.&lt;br /&gt;
&lt;br /&gt;
Java se caracteriza por una enorme cantidad de proyectos libres.&lt;br /&gt;
&lt;br /&gt;
== Algunas tecnologías Java ==&lt;br /&gt;
=== Frameworks de base===&lt;br /&gt;
* [[Spring Framework]]&lt;br /&gt;
* [[Terracotta]]&lt;br /&gt;
* [[EJB]]&lt;br /&gt;
* [[Restlet]]&lt;br /&gt;
&lt;br /&gt;
===Acceso a datos===&lt;br /&gt;
* [[Hibernate]]&lt;br /&gt;
* [[Apache Lucene]]&lt;br /&gt;
&lt;br /&gt;
===Frameworks de presentación===&lt;br /&gt;
* [[Apache Tiles]]&lt;br /&gt;
* [[Struts]]&lt;br /&gt;
* [[JSF]]&lt;br /&gt;
* [[JSTL]]&lt;br /&gt;
* [[GWT]]&lt;br /&gt;
&lt;br /&gt;
===Librerías===&lt;br /&gt;
* [[Google Guava]]&lt;br /&gt;
* [[Jawr]]&lt;br /&gt;
&lt;br /&gt;
===Mensajeria===&lt;br /&gt;
* [[JMS]]&lt;br /&gt;
&lt;br /&gt;
===Web Services===&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
&lt;br /&gt;
===Ejecuciones batch y programadas===&lt;br /&gt;
* [[Quartz]]&lt;br /&gt;
* [[Spring Batch]]&lt;br /&gt;
&lt;br /&gt;
===Cuestiones generales de Java===&lt;br /&gt;
* [[Fechas En Java]]&lt;br /&gt;
* [[Numeros En Java]]&lt;br /&gt;
* [[Encoding En Java]]&lt;br /&gt;
* [[Serializacion De Objetos En Java]]&lt;br /&gt;
* [[Log4J]]&lt;br /&gt;
* [[Cache De Objetos Java]]&lt;br /&gt;
* [[Exportacion Hacia Archivos]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Informaci%C3%B3n_del_build_con_Maven&amp;diff=6576</id>
		<title>Información del build con Maven</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Informaci%C3%B3n_del_build_con_Maven&amp;diff=6576"/>
				<updated>2012-03-30T13:37:56Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Usando [[Maven]] es posible obtener información del build para ser usada en tiempo de ejecución. La idea general es guardar esta información (hora del build, versión del repositorio de código, etc.) en un archivo de texto, que luego la aplicación puede usar en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
Durante el build, Maven permite filtrar los archivos de recursos y reemplazar placeholders con valores de variables de Maven. De esta manera, la estrategia será crear un archivo .properties con placeholders, que luego Maven se encargará de reemplazar al momento de hacer el build. &lt;br /&gt;
&lt;br /&gt;
== Ejemplo de uso ==&lt;br /&gt;
Vamos a usar un archivo projectInfo.properties que tendrá información general del build e información sobre los fuentes en el SVN.&lt;br /&gt;
&lt;br /&gt;
=== El archivo projectInfo.properties ===&lt;br /&gt;
Este archivo de propiedades está ubicado junto al resto de los recursos del proyecto, para que sea accesible en tiempo de ejecución por la aplicación.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
project.version=${pom.version}&lt;br /&gt;
project.build.date=${project.build.timestamp}&lt;br /&gt;
&lt;br /&gt;
project.svn.repository=${project.svn.repository}&lt;br /&gt;
project.svn.path=${project.svn.path}&lt;br /&gt;
project.svn.revision=${project.svn.revision}&lt;br /&gt;
project.svn.mixedRevisions=${project.svn.mixedRevisions}&lt;br /&gt;
project.svn.committedRevision=${project.svn.committedRevision}&lt;br /&gt;
project.svn.committedDate=${project.svn.committedDate}&lt;br /&gt;
project.svn.status=${project.svn.status}&lt;br /&gt;
project.svn.specialStatus=${project.svn.specialStatus}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuración de Maven ===&lt;br /&gt;
Es necesario configurar Maven, con los siguientes pasos:&lt;br /&gt;
# Activar el filtrado de recursos, para que cambie los placeholders. &lt;br /&gt;
# Activar el módulo de información de SVN.&lt;br /&gt;
# Crear una variable explícita con la hora del build, por un bug en Maven.&lt;br /&gt;
&lt;br /&gt;
El archivo pom.xml queda: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;build&amp;gt;&lt;br /&gt;
        &amp;lt;resources&amp;gt;&lt;br /&gt;
            &amp;lt;resource&amp;gt;&lt;br /&gt;
                &amp;lt;directory&amp;gt;src/main/resources&amp;lt;/directory&amp;gt;&lt;br /&gt;
                &amp;lt;filtering&amp;gt;true&amp;lt;/filtering&amp;gt;&lt;br /&gt;
            &amp;lt;/resource&amp;gt;&lt;br /&gt;
        &amp;lt;/resources&amp;gt;&lt;br /&gt;
        &amp;lt;plugins&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            ...&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;plugin&amp;gt;&lt;br /&gt;
                &amp;lt;groupId&amp;gt;com.google.code.maven-svn-revision-number-plugin&amp;lt;/groupId&amp;gt;&lt;br /&gt;
                &amp;lt;artifactId&amp;gt;maven-svn-revision-number-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
                &amp;lt;version&amp;gt;1.7&amp;lt;/version&amp;gt;&lt;br /&gt;
                &amp;lt;executions&amp;gt;&lt;br /&gt;
                    &amp;lt;execution&amp;gt;&lt;br /&gt;
                        &amp;lt;goals&amp;gt;&lt;br /&gt;
                            &amp;lt;goal&amp;gt;revision&amp;lt;/goal&amp;gt;&lt;br /&gt;
                        &amp;lt;/goals&amp;gt;&lt;br /&gt;
                    &amp;lt;/execution&amp;gt;&lt;br /&gt;
                &amp;lt;/executions&amp;gt;&lt;br /&gt;
                &amp;lt;configuration&amp;gt;&lt;br /&gt;
                    &amp;lt;entries&amp;gt;&lt;br /&gt;
                        &amp;lt;entry&amp;gt;&lt;br /&gt;
                            &amp;lt;prefix&amp;gt;project.svn&amp;lt;/prefix&amp;gt;&lt;br /&gt;
                        &amp;lt;/entry&amp;gt;&lt;br /&gt;
                    &amp;lt;/entries&amp;gt;&lt;br /&gt;
                &amp;lt;/configuration&amp;gt;&lt;br /&gt;
            &amp;lt;/plugin&amp;gt;&lt;br /&gt;
        &amp;lt;/plugins&amp;gt;&lt;br /&gt;
    &amp;lt;/build&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;properties&amp;gt;&lt;br /&gt;
        &amp;lt;project.build.timestamp&amp;gt;${maven.build.timestamp}&amp;lt;/project.build.timestamp&amp;gt;&lt;br /&gt;
        &amp;lt;maven.build.timestamp.format&amp;gt;yyyy-MM-dd HH:mm&amp;lt;/maven.build.timestamp.format&amp;gt;&lt;br /&gt;
    &amp;lt;/properties&amp;gt;&lt;br /&gt;
&amp;lt;/project&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ejecución y resultado final ===&lt;br /&gt;
Al ejecutar el build se filtrará el archivo projectInfo.properties y se llenarán los valores. Este archivo quedará empaquetado en el resultado final de la siguiente manera. Por ejemplo: &lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
project.version=1.0&lt;br /&gt;
project.build.date=2012-03-28 04:07&lt;br /&gt;
&lt;br /&gt;
project.svn.repository=https://100.200.0.100/svn/dosideas&lt;br /&gt;
project.svn.path=trunk/dosideas&lt;br /&gt;
project.svn.revision=598&lt;br /&gt;
project.svn.mixedRevisions=false&lt;br /&gt;
project.svn.committedRevision=598&lt;br /&gt;
project.svn.committedDate=2012-03-27 13:07:14 +1200 (Tue, 27 Mar 2012)&lt;br /&gt;
project.svn.status=M&lt;br /&gt;
project.svn.specialStatus=M&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso en un JSP ===&lt;br /&gt;
Teniendo este archivo, es muy facil usar esta información en un JSP: &lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
&amp;lt;%@ taglib uri=&amp;quot;http://java.sun.com/jsp/jstl/fmt&amp;quot; prefix=&amp;quot;fmt&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;fmt:setBundle basename=&amp;quot;projectInfo&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Informacion del build&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Fecha del build: &amp;lt;fmt:message key=&amp;quot;project.build.date&amp;quot;/&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Revision: &amp;lt;fmt:message key=&amp;quot;project.svn.revision&amp;quot;/&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Fecha de la Revision: &amp;lt;fmt:message key=&amp;quot;project.svn.committedDate&amp;quot;/&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Maven]]&lt;br /&gt;
* [http://java.dzone.com/tips/stamping-version-number-and Stamping version number with Maven]&lt;br /&gt;
* [http://maven-svn-revision-number-plugin.googlecode.com/svn/site/examples/resource_filtering.html Maven SVN Revision plugin]&lt;br /&gt;
* [http://www.innovationontherun.com/creating-a-build-number-with-ant-and-subversion/ Creating a Build Number With Ant and Subversion]&lt;br /&gt;
* [http://obscuredclarity.blogspot.com.ar/2010/08/java-ant-build-war-file-with-auto.html  Java Ant - Build .War file with Auto-Incrementing Build Number]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Informaci%C3%B3n_del_build_con_Maven&amp;diff=6575</id>
		<title>Información del build con Maven</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Informaci%C3%B3n_del_build_con_Maven&amp;diff=6575"/>
				<updated>2012-03-29T18:40:40Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Configuración de Maven */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Usando [[Maven]] es posible obtener información del build para ser usada en tiempo de ejecución. La idea general es guardar esta información (hora del build, versión del repositorio de código, etc.) en un archivo de texto, que luego la aplicación puede usar en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
Durante el build, Maven permite filtrar los archivos de recursos y reemplazar placeholders con valores de variables de Maven. De esta manera, la estrategia será crear un archivo .properties con placeholders, que luego Maven se encargará de reemplazar al momento de hacer el build. &lt;br /&gt;
&lt;br /&gt;
== Ejemplo de uso ==&lt;br /&gt;
Vamos a usar un archivo projectInfo.properties que tendrá información general del build e información sobre los fuentes en el SVN.&lt;br /&gt;
&lt;br /&gt;
=== El archivo projectInfo.properties ===&lt;br /&gt;
Este archivo de propiedades está ubicado junto al resto de los recursos del proyecto, para que sea accesible en tiempo de ejecución por la aplicación.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
project.version=${pom.version}&lt;br /&gt;
project.build.date=${project.build.timestamp}&lt;br /&gt;
&lt;br /&gt;
project.svn.repository=${project.svn.repository}&lt;br /&gt;
project.svn.path=${project.svn.path}&lt;br /&gt;
project.svn.revision=${project.svn.revision}&lt;br /&gt;
project.svn.mixedRevisions=${project.svn.mixedRevisions}&lt;br /&gt;
project.svn.committedRevision=${project.svn.committedRevision}&lt;br /&gt;
project.svn.committedDate=${project.svn.committedDate}&lt;br /&gt;
project.svn.status=${project.svn.status}&lt;br /&gt;
project.svn.specialStatus=${project.svn.specialStatus}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuración de Maven ===&lt;br /&gt;
Es necesario configurar Maven, con los siguientes pasos:&lt;br /&gt;
# Activar el filtrado de recursos, para que cambie los placeholders. &lt;br /&gt;
# Activar el módulo de información de SVN.&lt;br /&gt;
# Crear una variable explícita con la hora del build, por un bug en Maven.&lt;br /&gt;
&lt;br /&gt;
El archivo pom.xml queda: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;build&amp;gt;&lt;br /&gt;
        &amp;lt;resources&amp;gt;&lt;br /&gt;
            &amp;lt;resource&amp;gt;&lt;br /&gt;
                &amp;lt;directory&amp;gt;src/main/resources&amp;lt;/directory&amp;gt;&lt;br /&gt;
                &amp;lt;filtering&amp;gt;true&amp;lt;/filtering&amp;gt;&lt;br /&gt;
            &amp;lt;/resource&amp;gt;&lt;br /&gt;
        &amp;lt;/resources&amp;gt;&lt;br /&gt;
        &amp;lt;plugins&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            ...&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;plugin&amp;gt;&lt;br /&gt;
                &amp;lt;groupId&amp;gt;com.google.code.maven-svn-revision-number-plugin&amp;lt;/groupId&amp;gt;&lt;br /&gt;
                &amp;lt;artifactId&amp;gt;maven-svn-revision-number-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
                &amp;lt;version&amp;gt;1.7&amp;lt;/version&amp;gt;&lt;br /&gt;
                &amp;lt;executions&amp;gt;&lt;br /&gt;
                    &amp;lt;execution&amp;gt;&lt;br /&gt;
                        &amp;lt;goals&amp;gt;&lt;br /&gt;
                            &amp;lt;goal&amp;gt;revision&amp;lt;/goal&amp;gt;&lt;br /&gt;
                        &amp;lt;/goals&amp;gt;&lt;br /&gt;
                    &amp;lt;/execution&amp;gt;&lt;br /&gt;
                &amp;lt;/executions&amp;gt;&lt;br /&gt;
                &amp;lt;configuration&amp;gt;&lt;br /&gt;
                    &amp;lt;entries&amp;gt;&lt;br /&gt;
                        &amp;lt;entry&amp;gt;&lt;br /&gt;
                            &amp;lt;prefix&amp;gt;project.svn&amp;lt;/prefix&amp;gt;&lt;br /&gt;
                        &amp;lt;/entry&amp;gt;&lt;br /&gt;
                    &amp;lt;/entries&amp;gt;&lt;br /&gt;
                &amp;lt;/configuration&amp;gt;&lt;br /&gt;
            &amp;lt;/plugin&amp;gt;&lt;br /&gt;
        &amp;lt;/plugins&amp;gt;&lt;br /&gt;
    &amp;lt;/build&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;properties&amp;gt;&lt;br /&gt;
        &amp;lt;project.build.timestamp&amp;gt;${maven.build.timestamp}&amp;lt;/project.build.timestamp&amp;gt;&lt;br /&gt;
        &amp;lt;maven.build.timestamp.format&amp;gt;yyyy-MM-dd HH:mm&amp;lt;/maven.build.timestamp.format&amp;gt;&lt;br /&gt;
    &amp;lt;/properties&amp;gt;&lt;br /&gt;
&amp;lt;/project&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ejecución y resultado final ===&lt;br /&gt;
Al ejecutar el build se filtrará el archivo projectInfo.properties y se llenarán los valores. Este archivo quedará empaquetado en el resultado final de la siguiente manera. Por ejemplo: &lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
project.version=1.0&lt;br /&gt;
project.build.date=2012-03-28 04:07&lt;br /&gt;
&lt;br /&gt;
project.svn.repository=https://100.200.0.100/svn/dosideas&lt;br /&gt;
project.svn.path=trunk/dosideas&lt;br /&gt;
project.svn.revision=598&lt;br /&gt;
project.svn.mixedRevisions=false&lt;br /&gt;
project.svn.committedRevision=598&lt;br /&gt;
project.svn.committedDate=2012-03-27 13:07:14 +1200 (Tue, 27 Mar 2012)&lt;br /&gt;
project.svn.status=M&lt;br /&gt;
project.svn.specialStatus=M&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso en un JSP ===&lt;br /&gt;
Teniendo este archivo, es muy facil usar esta información en un JSP: &lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
&amp;lt;%@ taglib uri=&amp;quot;http://java.sun.com/jsp/jstl/fmt&amp;quot; prefix=&amp;quot;fmt&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;fmt:setBundle basename=&amp;quot;projectInfo&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Informacion del build&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Fecha del build: &amp;lt;fmt:message key=&amp;quot;project.build.date&amp;quot;/&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Revision: &amp;lt;fmt:message key=&amp;quot;project.svn.revision&amp;quot;/&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Fecha de la Revision: &amp;lt;fmt:message key=&amp;quot;project.svn.committedDate&amp;quot;/&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Maven]]&lt;br /&gt;
* [http://java.dzone.com/tips/stamping-version-number-and Stamping version number with Maven]&lt;br /&gt;
* [http://maven-svn-revision-number-plugin.googlecode.com/svn/site/examples/resource_filtering.html Maven SVN Revision plugin]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Informaci%C3%B3n_del_build_con_Maven&amp;diff=6574</id>
		<title>Información del build con Maven</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Informaci%C3%B3n_del_build_con_Maven&amp;diff=6574"/>
				<updated>2012-03-29T18:31:21Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Usando [[Maven]] es posible obtener información del build para ser usada en tiempo de ejecución. La idea general es guardar esta información (hora del build, versión del repositorio de código, etc.) en un archivo de texto, que luego la aplicación puede usar en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
Durante el build, Maven permite filtrar los archivos de recursos y reemplazar placeholders con valores de variables de Maven. De esta manera, la estrategia será crear un archivo .properties con placeholders, que luego Maven se encargará de reemplazar al momento de hacer el build. &lt;br /&gt;
&lt;br /&gt;
== Ejemplo de uso ==&lt;br /&gt;
Vamos a usar un archivo projectInfo.properties que tendrá información general del build e información sobre los fuentes en el SVN.&lt;br /&gt;
&lt;br /&gt;
=== El archivo projectInfo.properties ===&lt;br /&gt;
Este archivo de propiedades está ubicado junto al resto de los recursos del proyecto, para que sea accesible en tiempo de ejecución por la aplicación.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
project.version=${pom.version}&lt;br /&gt;
project.build.date=${project.build.timestamp}&lt;br /&gt;
&lt;br /&gt;
project.svn.repository=${project.svn.repository}&lt;br /&gt;
project.svn.path=${project.svn.path}&lt;br /&gt;
project.svn.revision=${project.svn.revision}&lt;br /&gt;
project.svn.mixedRevisions=${project.svn.mixedRevisions}&lt;br /&gt;
project.svn.committedRevision=${project.svn.committedRevision}&lt;br /&gt;
project.svn.committedDate=${project.svn.committedDate}&lt;br /&gt;
project.svn.status=${project.svn.status}&lt;br /&gt;
project.svn.specialStatus=${project.svn.specialStatus}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuración de Maven ===&lt;br /&gt;
Es necesario configurar Maven, con los siguientes pasos:&lt;br /&gt;
# Activar el filtrado de recursos, para que cambie los placeholders. &lt;br /&gt;
# Activar el módulo de información de SVN.&lt;br /&gt;
# Crear una variable explícita con la hora del build, por un bug en Maven.&lt;br /&gt;
&lt;br /&gt;
El archivo pom.xml queda: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;build&amp;gt;&lt;br /&gt;
        &amp;lt;resources&amp;gt;&lt;br /&gt;
            &amp;lt;resource&amp;gt;&lt;br /&gt;
                &amp;lt;directory&amp;gt;src/main/resources&amp;lt;/directory&amp;gt;&lt;br /&gt;
                &amp;lt;filtering&amp;gt;true&amp;lt;/filtering&amp;gt;&lt;br /&gt;
            &amp;lt;/resource&amp;gt;&lt;br /&gt;
        &amp;lt;/resources&amp;gt;&lt;br /&gt;
        &amp;lt;plugins&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            ...&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;plugin&amp;gt;&lt;br /&gt;
                &amp;lt;groupId&amp;gt;com.google.code.maven-svn-revision-number-plugin&amp;lt;/groupId&amp;gt;&lt;br /&gt;
                &amp;lt;artifactId&amp;gt;maven-svn-revision-number-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
                &amp;lt;version&amp;gt;1.7&amp;lt;/version&amp;gt;&lt;br /&gt;
                &amp;lt;executions&amp;gt;&lt;br /&gt;
                    &amp;lt;execution&amp;gt;&lt;br /&gt;
                        &amp;lt;goals&amp;gt;&lt;br /&gt;
                            &amp;lt;goal&amp;gt;revision&amp;lt;/goal&amp;gt;&lt;br /&gt;
                        &amp;lt;/goals&amp;gt;&lt;br /&gt;
                    &amp;lt;/execution&amp;gt;&lt;br /&gt;
                &amp;lt;/executions&amp;gt;&lt;br /&gt;
                &amp;lt;configuration&amp;gt;&lt;br /&gt;
                    &amp;lt;entries&amp;gt;&lt;br /&gt;
                        &amp;lt;entry&amp;gt;&lt;br /&gt;
                            &amp;lt;prefix&amp;gt;project.svn&amp;lt;/prefix&amp;gt;&lt;br /&gt;
                        &amp;lt;/entry&amp;gt;&lt;br /&gt;
                    &amp;lt;/entries&amp;gt;&lt;br /&gt;
                &amp;lt;/configuration&amp;gt;&lt;br /&gt;
            &amp;lt;/plugin&amp;gt;&lt;br /&gt;
        &amp;lt;/plugins&amp;gt;&lt;br /&gt;
    &amp;lt;/build&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;properties&amp;gt;&lt;br /&gt;
        &amp;lt;project.build.timestamp&amp;gt;${maven.build.timestamp}&amp;lt;/project.build.timestamp&amp;gt;&lt;br /&gt;
        &amp;lt;maven.build.timestamp.format&amp;gt;yyyy-MM-dd HH:mm&amp;lt;/maven.build.timestamp.format&amp;gt;&lt;br /&gt;
    &amp;lt;/properties&amp;gt;&lt;br /&gt;
&amp;lt;/project&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Al ejecuta&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Maven]]&lt;br /&gt;
* [http://java.dzone.com/tips/stamping-version-number-and Stamping version number with Maven]&lt;br /&gt;
* [http://maven-svn-revision-number-plugin.googlecode.com/svn/site/examples/resource_filtering.html Maven SVN Revision plugin]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Informaci%C3%B3n_del_build_con_Maven&amp;diff=6573</id>
		<title>Información del build con Maven</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Informaci%C3%B3n_del_build_con_Maven&amp;diff=6573"/>
				<updated>2012-03-29T18:22:16Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Página creada con 'Usando Maven es posible obtener información del build para ser usada en tiempo de ejecución. La idea general es guardar esta información (hora del build, versión del rep…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Usando [[Maven]] es posible obtener información del build para ser usada en tiempo de ejecución. La idea general es guardar esta información (hora del build, versión del repositorio de código, etc.) en un archivo de texto, que luego la aplicación puede usar en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
Durante el build, Maven permite filtrar los archivos de recursos y reemplazar placeholders con valores de variables de Maven. De esta manera, la estrategia será crear un archivo .properties con placeholders, que luego Maven se encargará de reemplazar al momento de hacer el build. &lt;br /&gt;
&lt;br /&gt;
== Ejemplo de uso ==&lt;br /&gt;
Vamos a usar un archivo projectInfo.properties que tendrá información general del build e información sobre los fuentes en el SVN.&lt;br /&gt;
&lt;br /&gt;
=== El archivo projectInfo.properties ===&lt;br /&gt;
Este archivo de propiedades está ubicado junto al resto de los recursos del proyecto, para que sea accesible en tiempo de ejecución por la aplicación.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
project.version=${pom.version}&lt;br /&gt;
project.build.date=${project.build.timestamp}&lt;br /&gt;
&lt;br /&gt;
project.svn.repository=${project.svn.repository}&lt;br /&gt;
project.svn.path=${project.svn.path}&lt;br /&gt;
project.svn.revision=${project.svn.revision}&lt;br /&gt;
project.svn.mixedRevisions=${project.svn.mixedRevisions}&lt;br /&gt;
project.svn.committedRevision=${project.svn.committedRevision}&lt;br /&gt;
project.svn.committedDate=${project.svn.committedDate}&lt;br /&gt;
project.svn.status=${project.svn.status}&lt;br /&gt;
project.svn.specialStatus=${project.svn.specialStatus}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuración de Maven ===&lt;br /&gt;
Es necesario configurar Maven, con los siguientes pasos:&lt;br /&gt;
# Activar el filtrado de recursos, para que cambie los placeholders. &lt;br /&gt;
# Activar el módulo de información de SVN.&lt;br /&gt;
# Crear una variable explícita con la hora del build, por un bug en Maven.&lt;br /&gt;
&lt;br /&gt;
El archivo pom.xml queda: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;build&amp;gt;&lt;br /&gt;
        &amp;lt;resources&amp;gt;&lt;br /&gt;
            &amp;lt;resource&amp;gt;&lt;br /&gt;
                &amp;lt;directory&amp;gt;src/main/resources&amp;lt;/directory&amp;gt;&lt;br /&gt;
                &amp;lt;filtering&amp;gt;true&amp;lt;/filtering&amp;gt;&lt;br /&gt;
            &amp;lt;/resource&amp;gt;&lt;br /&gt;
        &amp;lt;/resources&amp;gt;&lt;br /&gt;
        &amp;lt;plugins&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            ...&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;plugin&amp;gt;&lt;br /&gt;
                &amp;lt;groupId&amp;gt;com.google.code.maven-svn-revision-number-plugin&amp;lt;/groupId&amp;gt;&lt;br /&gt;
                &amp;lt;artifactId&amp;gt;maven-svn-revision-number-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
                &amp;lt;version&amp;gt;1.7&amp;lt;/version&amp;gt;&lt;br /&gt;
                &amp;lt;executions&amp;gt;&lt;br /&gt;
                    &amp;lt;execution&amp;gt;&lt;br /&gt;
                        &amp;lt;goals&amp;gt;&lt;br /&gt;
                            &amp;lt;goal&amp;gt;revision&amp;lt;/goal&amp;gt;&lt;br /&gt;
                        &amp;lt;/goals&amp;gt;&lt;br /&gt;
                    &amp;lt;/execution&amp;gt;&lt;br /&gt;
                &amp;lt;/executions&amp;gt;&lt;br /&gt;
                &amp;lt;configuration&amp;gt;&lt;br /&gt;
                    &amp;lt;entries&amp;gt;&lt;br /&gt;
                        &amp;lt;entry&amp;gt;&lt;br /&gt;
                            &amp;lt;prefix&amp;gt;project.svn&amp;lt;/prefix&amp;gt;&lt;br /&gt;
                        &amp;lt;/entry&amp;gt;&lt;br /&gt;
                    &amp;lt;/entries&amp;gt;&lt;br /&gt;
                &amp;lt;/configuration&amp;gt;&lt;br /&gt;
            &amp;lt;/plugin&amp;gt;&lt;br /&gt;
        &amp;lt;/plugins&amp;gt;&lt;br /&gt;
    &amp;lt;/build&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;properties&amp;gt;&lt;br /&gt;
        &amp;lt;project.build.timestamp&amp;gt;${maven.build.timestamp}&amp;lt;/project.build.timestamp&amp;gt;&lt;br /&gt;
        &amp;lt;maven.build.timestamp.format&amp;gt;yyyy-MM-dd HH:mm&amp;lt;/maven.build.timestamp.format&amp;gt;&lt;br /&gt;
    &amp;lt;/properties&amp;gt;&lt;br /&gt;
&amp;lt;/project&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Maven&amp;diff=6572</id>
		<title>Maven</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Maven&amp;diff=6572"/>
				<updated>2012-03-29T18:02:05Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Java]]&lt;br /&gt;
Maven es una herramienta software para la gestión y comprensión de proyectos [[Java]].&lt;br /&gt;
&lt;br /&gt;
La versión 2 usa un archivo de configuración en XML llamado '''pom.xml'''. Su funcionalidad es parecida a Apache [[Ant]] de manera que permite compilar, ejecutar test o realizar distribuciones pero con la diferencia que trata de forma automática las dependencias del proyecto. Una de las más importantes características es su actualización en línea mediante servidores repositorios. Maven es capaz de descargar nuevas actualizaciones de las bibliotecas de las que depende el proyecto y de igual manera subir una nueva distribución a un repositorio de versiones, dejandola al acceso de todos los usuarios.&lt;br /&gt;
&lt;br /&gt;
==Diferencias con Ant==&lt;br /&gt;
===Declarativo vs. Procedural===&lt;br /&gt;
En Ant las acciones a realizar se definen en forma procedural paso por paso, mientras que con Maven se declara que plugins se van a utilizar, con que configuración y con que dependencias y Maven se encarga del orden en el que se utilizan las cosas para lograr el objetivo declarado.&lt;br /&gt;
&lt;br /&gt;
==Conceptos de Maven==&lt;br /&gt;
===Dependencias Transitivas (Transitive Dependencies)===&lt;br /&gt;
Esto es que las dependencias que declara una dependencia son utilizadas como dependencias propias del POM que se está utilizando.&lt;br /&gt;
Ejemplo: si A declara dependencias sobre B y B declara dependencias sobre X e Y, cuando se ejecuten las fases del ciclo de vida de Maven se van a utilizar como dependencias B, X e Y.&lt;br /&gt;
&lt;br /&gt;
===POM ('''P'''roject '''O'''bject '''M'''odel)===&lt;br /&gt;
Es un archivo xml llamado pom.xml y ubicado en la raiz de un proyecto (o un módulo) que declara datos sobre el mismo, dependencias y plugins a utilizar durante el ciclo de vida de la administración del proyecto.&lt;br /&gt;
[http://maven.apache.org/pom.html]&lt;br /&gt;
&lt;br /&gt;
===Herencia y POM Real (Effective POM)===&lt;br /&gt;
Los POMs pueden heredar de otro POM que se defina como parent. La raiz implícita desde donde heredan todos los POMs es el Super POM definido por Maven.&lt;br /&gt;
El POM resultante luego de incorporar todos los ancestros se llama Effective POM. Se puede inspeccionar corriendo el goal effective-pom del plugin help parados sobre el directorio donde se encuentra el pom en cuestión.&lt;br /&gt;
&amp;lt;code&amp;gt;mvn help:effective-pom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Goal===&lt;br /&gt;
Los Goals de Maven son las unidades mínimas de ejecución de las que disponemos durante su uso. Los goals pueden programarse en diferentes lenguajes pero en la práctica están la mayoría programados en Java. No es común que como usuario se piense en programar un goal. Un grupo de goals conforman un plugin. La ejecución de un goal se dispara desde línea de comandos invocando Maven con el nombre del plugin que lo contiene: &amp;lt;code&amp;gt;mvn plugin:goal&amp;lt;/code&amp;gt;.&lt;br /&gt;
Otra forma de invocar un goal es indirectamente declarando por ejemplo el uso de un plugin en un POM. Maven lo invocará dependiendo de la fase del ciclo de vida cuando por ejemplo se ejecute &amp;lt;code&amp;gt;mvn compile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Dependencia (Dependency)===&lt;br /&gt;
Maven maneja todas las necesidades de conseguir artefactos (libs, jars, ears, zips, etc.) mediante las dependencias ubicando cada dependencia mediante las coordenadas.&lt;br /&gt;
&lt;br /&gt;
===Grupo (Group)===&lt;br /&gt;
El grupo es simplemente una forma de agrupar artefactos bajo una denominación común. La identificación del grupo es groupId. El nombre suele ser el nombre de la organización, el projecto o el equipo de trabajo o bien la raiz del package de java que contendrá las clases del artefacto, ej: com.xyz.foo. Lo importante es recordar que el groupId forma parte de las coordenadas de Maven con la que se identifican en forma única los artefactos en las dependencias y los repositorios.&lt;br /&gt;
&lt;br /&gt;
===Artefacto (Artifact)===&lt;br /&gt;
Maven utilza el término artifact para denominar a la unidad mínima que maneja en su repositorio. Puede ser por ejemplo un jar, un ear, un zip, etc. Cuando Maven compila y empaqueta código, produce también artifacts que instala en el repositorio.&lt;br /&gt;
Los artifacts están agrupados bajo el id de grupo (groupId) y tienen un id propio (artifactId), una versión, un clasificador y una extensión.&lt;br /&gt;
Para administrar los artefactos en el repositrio Maven los acompaña con un respectivo pom.xml conteniendo los datos anteriores.&lt;br /&gt;
&lt;br /&gt;
===Repositorio (Repository)===&lt;br /&gt;
El_ funcionamiento de Maven se basa en el uso de un repositorio a donde ir a buscar las dependencias. La identificación de los artefactos que necesita se hace a través del sistema de coordenadas ''groupId:artifactId:version'' que asegura que cada dependencia sea única y proveer una ruta para conseguirla.&lt;br /&gt;
&lt;br /&gt;
El repositorio por default es el repositorio central de Maven. A este repositorio se suman otros repositorios, un respositorio local y la posiblidad de utilizar un repositorio/proxy.&lt;br /&gt;
&lt;br /&gt;
Cuando Maven sale a buscar y consigue una dependencia la guarda en el repositorio local que es un directorio en la máquina del usuario (~/.m2/repository). Las siguientes veces que necesite esta dependencia irá la conseguirá en el directorio local haciéndolo mucho más rápido que la primera vez.&lt;br /&gt;
&lt;br /&gt;
El directorio central y los directorios de terceros en lo único que se diferencian es en que se va a encontrar en cada uno. En el repositorio central de Maven podemos esperar encontrar la mayoría de las dependencias que necesitemos como JUnit, Maven mismo, Java, Spring, Hibernate, etc.&lt;br /&gt;
&lt;br /&gt;
El repositorio/proxy es un servicio que podemos instalar en la LAN para cumplir una función similar a la del repositorio local pero compartido por un grupo de usuarios. Esto, además de mejorar la performance, permite tener un mayor control de las versiones de dependencias que se utilizarán.&lt;br /&gt;
&lt;br /&gt;
===Coordenadas (Coordinates)===&lt;br /&gt;
Las coordenadas de Maven es la forma de identificar a un projecto, dependencia, plugin o artefacto en forma única en un pom y en un repositorio. Una coordenada se compone de los siguientes identificadores: ''groupId:artefactId:version''.&lt;br /&gt;
&lt;br /&gt;
A veces es necesario generar dos empaquetados distintos de una misma versión por cuestiones técnicas, por ejemplo un mimso artefacto para correr sobre dos entornos diferentes. En esta situación se puede utilizar un identificador más: ''groupId:artefactId:version:classifier''.&lt;br /&gt;
&lt;br /&gt;
Al momento de producir artefactos, estos cuatro identificadores funcionan en conjunto con uno más, pero que no forma parte de la coordenada: ''packaging'' y que se refiere al tipo de empaquetado del artefacto (ejs: zip, jar, ear). De hecho no es posible tener en el repositorio dos artefactos de la misma versión pero con diferente empaquetado.&lt;br /&gt;
&lt;br /&gt;
* '''groupId''' nombre bajo el que se agrupan una serie de artefactos (ej: junit, spring, org.xyx, com.tm.projectox').&lt;br /&gt;
&lt;br /&gt;
* '''artifactId''' identificacion de la unidad mínima administrada por el repositorio (ej: junit, moduloEjb, ejb-api, servlet-api).&lt;br /&gt;
&lt;br /&gt;
* '''version''' la versión del artefacto con la siguiente nomenclatura ''&amp;lt;major version&amp;gt;.&amp;lt;minor version&amp;gt;.&amp;lt;incremental version&amp;gt;-&amp;lt;qualifier&amp;gt;''.&lt;br /&gt;
&lt;br /&gt;
* '''classifier''' clasificador que permite diferenciar iguales versiones pero preparadas o compiladas para diferentes entornos.&lt;br /&gt;
&lt;br /&gt;
* '''packaging''' no forma parte de la coordenada y sólo se utiliza al momento de generar un artefacto. Define el formato del empaquetado (ejs: jar, war, zip, pom).&lt;br /&gt;
&lt;br /&gt;
===MOJO ('''M'''aven Plain '''O'''ld '''J'''ava '''O'''bject)===&lt;br /&gt;
MOJO es el término que utiliza Maven para referirse a un artefacto que representa un Goal. El término parte de un juego de palabras entre POJO (Plain Old Java Object, clases simples sin imposiciones de un framework) y Mojo (un hechizo mágico que se hace típicamente envolviendo ciertos elementos en un paño rojo). Maven hacen al término MOJO extensivo también a goals programados en otros lenguajes.&lt;br /&gt;
&lt;br /&gt;
Para programar un Goal utilizando Java como lenguaje, basta con escribir una clase que haga lo que se necesita hacer con la única imposición de implementar una interfase. El resto de la configuración va en un descriptor en xml. Luego solo resta empaquetarlo con la ayuda del propio Maven y publicarlo en algún repositorio.&lt;br /&gt;
&lt;br /&gt;
===Plugin===&lt;br /&gt;
Un Plugin es un conjunto de Mojos (Goals) junto con una descripción y configuración en un xml. Los plugins pueden instalarse y distribuirse mediante los repositorios. Los goals de los plugins pueden utilizarse desde línea de comando: '''mvn plugin:goal''' o declarándolo en el pom en la sección ''&amp;lt;plugins/&amp;gt;'' con el tag ''&amp;lt;plugin//&amp;gt;''.&lt;br /&gt;
&lt;br /&gt;
===Ciclo de Vida (Lifecycle)===&lt;br /&gt;
Maven utiliza el concepto de cilcos de vida para ejecutar una secuencia ordenada de pasos denominados fases. El ciclo de vida más común y el usado por defecto por Maven es el de ''build''. &lt;br /&gt;
&lt;br /&gt;
Este ciclo de vida define la secuencia de fases que va desde validar la integridad hasta el despliegue en su instalación final de un proyecto. Cuando se solicita la ejecución de una fase Maven ejecuta primero todas las fases anteriores siguiendo la secuencia y termina en la fase solicitada.&lt;br /&gt;
&lt;br /&gt;
Cuando la ejecución llega a una determinada fase, Maven busca los plugins que estén adjuntados a la misma y ejecuta los goals correspondientes. Pueden existir ninguno o más plugins asociados a una fase.&lt;br /&gt;
&lt;br /&gt;
Las fases en sí sólo definen un concepto en forma vaga y no ejecutan código sino que son anclajes para adjuntar los goals de los plugins para que se ejecuten en el momento apropiado.&lt;br /&gt;
&lt;br /&gt;
Para pedirle a Maven que ejecute los goals asociados hasta un determinado punto en el ciclo de vida se ejecuta ''mvn phase'' donde phase es alguna de las fases del ciclo de vida en cuestión, por ejemplo ''mvn package'' ejecutará la secuencia de phases desde testing, pasando por compilación y terminando en el empaquetado de los artefactos. En esta secuencia pasa por una veintena de fases.&lt;br /&gt;
&lt;br /&gt;
===Arquetipo (Archetype)===&lt;br /&gt;
La descripción y administración de un proyecto con Maven requiere que el proyecto tenga una estructura determinada y que tenga los pom.xml correspondientes. Existe un plugin en Maven que permite generar la estructura y configuración inicial de un proyecto a partir de una plantilla. Estas plantillas con llamadas archetypes (arquetipos) y el plugin que permite la generación a partir de los arquitipos se llama también archetype.&lt;br /&gt;
&lt;br /&gt;
Un arquetipo consta de un directorio resources que contiene todos los archivos y directorios que contendrá el proyecto generado y un descriptor en xml.&lt;br /&gt;
&lt;br /&gt;
Los arquetipos pueden publicarse en un repositorio al igual que cualquier otro artefacto.&lt;br /&gt;
&lt;br /&gt;
===Perfiles (Profiles)===&lt;br /&gt;
Maven está diseñado para maximizar la portabilidad de los artefactos.&lt;br /&gt;
Es posible redefinir prácticamente cualquier parte de un POM definiendo un perfil. Pueden definirse varios perfiles. La activación de un perfil puede dispararse por uno o una combinación de las siguientes evaluaciones:&lt;br /&gt;
* Existencia o inexistencia de un archivo&lt;br /&gt;
* Sistema operativo&lt;br /&gt;
* Variables de entorno del sistema operativo&lt;br /&gt;
* Inexistencia de variables de entorno del sistema operativo&lt;br /&gt;
&lt;br /&gt;
Para más información, ver [[Perfiles en Maven]]&lt;br /&gt;
&lt;br /&gt;
===Propiedades (Properties)===&lt;br /&gt;
Las propiedades son valores que pueden ser accedidos en cualquier lugar del pom donde se espera un valor envolviendo la propiedad en ${}, ej: ${project.groupId}.&lt;br /&gt;
Existen algunas propiedades preestablecidas:&lt;br /&gt;
* ${project.*} para acceder a cualquier valor definido en el POM&lt;br /&gt;
* ${parent.*} para acceder a los valores de un POM ancestro&lt;br /&gt;
* ${settings.*} para acceder a valores definidos en ~/.m2/settings.xml&lt;br /&gt;
* ${env.*} variables de entorno&lt;br /&gt;
* ${x.y.z} para acceder a valores que desde Java se acceden con System.getProperty(&amp;quot;x.y.z&amp;quot;)&lt;br /&gt;
* ${x.y.z} para acceder a propiedades declaradas en el POM por el usuario en forma &amp;lt;properties&amp;gt;&amp;lt;x.y.z&amp;gt;value&amp;lt;/x.y.z&amp;gt;&amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Properties en Maven2[[http://docs.codehaus.org/display/MAVENUSER/MavenPropertiesGuide]]&lt;br /&gt;
&lt;br /&gt;
===Documentación===&lt;br /&gt;
&lt;br /&gt;
Maven puede generar un sitio con toda la documentación del proyecto, en la que se incluyen la información básica del proyecto y las dependencias del proyecto, además permite la integración con herramientas de Integración Continua, Gestión de problemas, listas de correo asi  como la utilización de reportes personalizados mediante la configuración de plugins. Entre esos reportes personalizados se puede incluir:&lt;br /&gt;
* Resultado de pruebas unitarias&lt;br /&gt;
* Reportes de Checkstyle&lt;br /&gt;
* Reportes de PMD&lt;br /&gt;
* Reportes de Cobertura&lt;br /&gt;
* Reportes de Macker&lt;br /&gt;
&lt;br /&gt;
Para crear dicho site hay que utilizar la siguiente sentencia&lt;br /&gt;
&lt;br /&gt;
  mvn site&lt;br /&gt;
&lt;br /&gt;
Nota: para los proyectos multimódulo hay un bug conocido que por no genera correctamente los hipervinculos a la documentación de los submodulos.&lt;br /&gt;
Sin embargo, existe el siguiente workaround&lt;br /&gt;
&lt;br /&gt;
  mvn site:stage -DstagingDirectory=&amp;lt;directorio destino&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Snippets==&lt;br /&gt;
===POM Mínimo===&lt;br /&gt;
Este es el mínimo posible POM. Verifica, testea, compila y empaqueta un proyecto Java.&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;project&amp;gt;&lt;br /&gt;
  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt;
  &amp;lt;groupId&amp;gt;com.blah.foo&amp;lt;/groupId&amp;gt;&lt;br /&gt;
  &amp;lt;artifactId&amp;gt;foobar&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
  &amp;lt;version&amp;gt;1&amp;lt;/version&amp;gt;&lt;br /&gt;
&amp;lt;/project&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===JUnit===&lt;br /&gt;
Para que se utilice JUnit durante los tests:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;dependencies&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;4.4&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/dependencies&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Módulos===&lt;br /&gt;
Para crear un proyecto con varios módulos es necesario crear un módulo a modo de raíz de los otros módulos que se quieren agrupar. Cada módulo, incluyendo el raíz, deben tener su propio POM.&lt;br /&gt;
&lt;br /&gt;
Módulo raíz:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;project&amp;gt;&lt;br /&gt;
    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;fooBar&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;fooBar&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;packaging&amp;gt;pom&amp;lt;/packaging&amp;gt;&lt;br /&gt;
    &amp;lt;name&amp;gt;project&amp;lt;/name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;modules&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;fooModule&amp;lt;/module&amp;gt;&lt;br /&gt;
    &amp;lt;/modules&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/project&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cualquier otro módulo agrupado por el módulo raíz:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;project&amp;gt;&lt;br /&gt;
   &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt;
   &amp;lt;groupId&amp;gt;fooBar&amp;lt;/groupId&amp;gt;&lt;br /&gt;
   &amp;lt;artifactId&amp;gt;fooModule&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
   &amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;&lt;br /&gt;
   &amp;lt;name&amp;gt;Foo Module&amp;lt;/name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;parent&amp;gt;&lt;br /&gt;
      &amp;lt;groupId&amp;gt;fooBar&amp;lt;/groupId&amp;gt;&lt;br /&gt;
      &amp;lt;artifactId&amp;gt;fooBar&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
      &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;
   &amp;lt;/parent&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura de los directorios debe ser la siguiente&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
+ fooBar&lt;br /&gt;
|&lt;br /&gt;
|-- pom.xml&lt;br /&gt;
|&lt;br /&gt;
'-- + fooModule&lt;br /&gt;
    |&lt;br /&gt;
    '-- pom.xml&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Cambiando la versión del compilador===&lt;br /&gt;
Para especificar la versión de código fuente y la versión del bytecode generado:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;project&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;build&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
        &amp;lt;plugins&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
            &amp;lt;plugin&amp;gt;&lt;br /&gt;
                &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
                &amp;lt;version&amp;gt;2.0.2&amp;lt;/version&amp;gt;&lt;br /&gt;
                &amp;lt;configuration&amp;gt;&lt;br /&gt;
                    &amp;lt;source&amp;gt;1.5&amp;lt;/source&amp;gt;&lt;br /&gt;
                    &amp;lt;target&amp;gt;1.5&amp;lt;/target&amp;gt;&lt;br /&gt;
                &amp;lt;/configuration&amp;gt;&lt;br /&gt;
            &amp;lt;/plugin&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/plugins&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
    &amp;lt;/build&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/project&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===EJB===&lt;br /&gt;
===servlets===&lt;br /&gt;
&lt;br /&gt;
==Plugins útiles==&lt;br /&gt;
===help===&lt;br /&gt;
help [http://maven.apache.org/plugins/maven-help-plugin/] es un plugin con 8 goals que asisten durante el uso de Maven:&lt;br /&gt;
* active-profiles&lt;br /&gt;
* all-profiles&lt;br /&gt;
* describe&lt;br /&gt;
* effective-pom&lt;br /&gt;
* effective-settings&lt;br /&gt;
* evaluate&lt;br /&gt;
* expressions&lt;br /&gt;
* system&lt;br /&gt;
&lt;br /&gt;
====help:active-profiles====&lt;br /&gt;
Lista los perfiles que se incluirán evaluando cuáles están activos de la misma manera que se evaluarán al momento de ejecutar alguno de los comandos de ciclo de vida.&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
mvn help:active-profiles&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====help:all-profiles====&lt;br /&gt;
Lista los perfiles disponibles en el proyecto.&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
mvn help:all-profiles&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====help:describe====&lt;br /&gt;
Describe un plugin o un MOJO.&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
mvn help:describe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====help:effective-pom====&lt;br /&gt;
Muestra el POM que se va a usar después de combinarlo con los defaults de Maven, unificar en el caso de múltiples POMs y seleccionando los perfiles que van a utilizarse.&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
mvn help:effective-pom&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====help:effective-settings====&lt;br /&gt;
Muestra los settings que realmente van a utilizarse &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
mvn help:effective-settings&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===archetype===&lt;br /&gt;
===install===&lt;br /&gt;
&lt;br /&gt;
==Plugins==&lt;br /&gt;
* Jar&lt;br /&gt;
* War&lt;br /&gt;
* Ear&lt;br /&gt;
* JUnit&lt;br /&gt;
* Distribution: permite meter en un fichero zip todos los archivos del proyecto&lt;br /&gt;
* PDF: genera la documentación del proyecto en PDF&lt;br /&gt;
* Checkstyle: control de convenciones de codificación Java&lt;br /&gt;
* PMD: verificación de reglas de codificación&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Información del build con Maven]]&lt;br /&gt;
* [[Automatizacion De Build]]&lt;br /&gt;
* [[Spring Roo]]&lt;br /&gt;
* [[Instalación de Maven]]&lt;br /&gt;
* [[Integración de Maven con IDEs]]&lt;br /&gt;
* [[Apache Archiva]]&lt;br /&gt;
* [[Plugins de Maven]]&lt;br /&gt;
* [[Plugin Maven para Weblogic]]&lt;br /&gt;
* [[Plugin Maven para Selenium]]&lt;br /&gt;
* [[Como organizar el uso de Maven según la cantidad de personas involucradas]]&lt;br /&gt;
* [[Creacion de Arquetipos Personalizados]]&lt;br /&gt;
* [http://maven.apache.org/ Web oficial de Maven]&lt;br /&gt;
* [http://www.sonatype.com/community/definitive_guide.html Libro en PDF sobre Maven]&lt;br /&gt;
* [http://maven.apache.org/guides/MavenQuickReferenceCard.pdf Maven Quick Card Reference]&lt;br /&gt;
* [http://maven.apache.org/ref/2.0.9/maven-model/maven.html Modelo de Maven]&lt;br /&gt;
* [http://abaddon-gtz.blogspot.com/2010/04/de-maven-ant.html Como hacer buid de Ant desde Maven]&lt;br /&gt;
* listado del repositorio central&lt;br /&gt;
* listado de plugins oficiales&lt;br /&gt;
* proyecto mojo&lt;br /&gt;
* plugin para eclipse&lt;br /&gt;
* plugin para netbeans&lt;br /&gt;
* mailing list de maven&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6569</id>
		<title>Mock de un WS mediante Spring WS</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6569"/>
				<updated>2012-03-29T17:50:48Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Introducción===&lt;br /&gt;
&lt;br /&gt;
En esta página explicaremos de qué forma podemos simular el entorno de un Web Service en memoria, de modo tal de poder realizar un test de componentes contra dicho entorno.&lt;br /&gt;
&lt;br /&gt;
===Requerimientos===&lt;br /&gt;
&lt;br /&gt;
Para mockear un Web Service mediante Spring WS, necesitaremos agregar a nuestro proyecto los siguientes jars:&lt;br /&gt;
* jaxb-api-2.0.jar&lt;br /&gt;
* jaxb-impl-2.0.3.jar&lt;br /&gt;
* xalan-2.7.1.jar (importante que sea esta versión o superior)&lt;br /&gt;
* xmlunit-1.1.jar&lt;br /&gt;
&lt;br /&gt;
===Ejemplo===&lt;br /&gt;
&lt;br /&gt;
Básicamente, el código para crear un test contra dicho entorno será como el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;
&lt;br /&gt;
// indicamos a Spring que levante los archivos de configuración que veremos más adelante&lt;br /&gt;
@ContextConfiguration(&amp;quot;spring-configuration.xml&amp;quot;)&lt;br /&gt;
public class ClienteIntegracionTest {&lt;br /&gt;
&lt;br /&gt;
// Creamos el request a enviarle al WS&lt;br /&gt;
private String request = &amp;quot;&amp;lt;ns2:UserProfileCreateRequest xmlns:ns2='http://shekhar.com/usermanagement/schemas'&amp;gt; Shekhar Gulati 27 &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Creamos el response que nos responderá el WS&lt;br /&gt;
private String response = &amp;quot;&amp;lt;ns2:UserProfileCreateResponse xmlns:ns2='http://shekhar.com/usermanagement/schemas'&amp;gt; user created successfully &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Inyectamos el WebServiceTemplate &lt;br /&gt;
@Autowired&lt;br /&gt;
private WebServiceTemplate webServiceTemplate;&lt;br /&gt;
&lt;br /&gt;
// Mockeamos el WebServiceServer&lt;br /&gt;
private MockWebServiceServer server;&lt;br /&gt;
&lt;br /&gt;
// Clase nuestra que lo consumirá&lt;br /&gt;
@Autowired&lt;br /&gt;
private Cliente cliente;&lt;br /&gt;
&lt;br /&gt;
// En el Before levantamos el server pasandole como parámetro al constructor &lt;br /&gt;
// el webServiceTemplate&lt;br /&gt;
@Before&lt;br /&gt;
public void setup() {&lt;br /&gt;
server = MockWebServiceServer.createServer(webServiceTemplate);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void testInvocacionWs() {&lt;br /&gt;
&lt;br /&gt;
// Le damos comportamiento a nuestro WS con el request y el response&lt;br /&gt;
// antes configurado&lt;br /&gt;
server.expect(RequestMatchers.payload(new StringSource(request))).andRespond(ResponseCreators.withPayload(new StringSource(response)));&lt;br /&gt;
&lt;br /&gt;
cliente.invocarMetodoQueLlamaAlWs();&lt;br /&gt;
&lt;br /&gt;
// Nos aseguramos que el servicio fue invocado&lt;br /&gt;
server.verify();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dentro de los archivos de configuración que levante Spring, tendremos que configurarle los siguientes beans:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;wsTemplate&amp;quot; class=&amp;quot;org.springframework.ws.client.core.WebServiceTemplate&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Url donde esta expuesto nuestro WS. En este test no irá a invocarlo, ya que se simula el entorno localmente --&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;defaultUri&amp;quot; value=&amp;quot;http://localhost:8080/&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;marshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;unmarshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;marshaller&amp;quot; class=&amp;quot;org.springframework.oxm.jaxb.Jaxb2Marshaller&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;classesToBeBound&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;list&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Listado de clases con las que esta mapeado cada Request y Response --&amp;gt;&lt;br /&gt;
    &amp;lt;value&amp;gt;com.dosideas.ejemplo.schemas.ClienteRequest&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;value&amp;gt;com.dosideas.ejemplo.schemas.ClienteResponse&amp;lt;/value&amp;gt;&lt;br /&gt;
   &amp;lt;/list&amp;gt;&lt;br /&gt;
  &amp;lt;/property&amp;gt;&lt;br /&gt;
 &amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, el método de nuestra clase cliente, deberá contener&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
public void invocarMetodoQueLlamaAlWs() {&lt;br /&gt;
...&lt;br /&gt;
ClienteRequest clienteRequest = new ClienteRequest();&lt;br /&gt;
...&lt;br /&gt;
ClienteResponse clienteResponse = (clienteResponse) webServiceTemplate&lt;br /&gt;
        .marshalSendAndReceive(clienteRequest);&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Fuente====&lt;br /&gt;
*[http://static.springsource.org/spring-ws/site/reference/html/client.html Spring MVC Test ]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6568</id>
		<title>Mock de un WS mediante Spring WS</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6568"/>
				<updated>2012-03-29T17:50:12Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Introducción */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Introducción===&lt;br /&gt;
&lt;br /&gt;
En esta página explicaremos de qué forma podemos simular el entorno de un Web Service en memoria, de modo tal de poder realizar un test de componentes contra dicho entorno.&lt;br /&gt;
&lt;br /&gt;
===Requerimientos===&lt;br /&gt;
&lt;br /&gt;
Para mockear un WS mediante Spring WS, necesitaremos agregar a nuestro proyecto los siguientes jars:&lt;br /&gt;
* jaxb-api-2.0.jar&lt;br /&gt;
* jaxb-impl-2.0.3.jar&lt;br /&gt;
* xalan-2.7.1.jar (importante que sea esta versión o superior)&lt;br /&gt;
* xmlunit-1.1.jar&lt;br /&gt;
&lt;br /&gt;
===Ejemplo===&lt;br /&gt;
&lt;br /&gt;
Básicamente, el código para crear un test contra dicho entorno será como el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;
&lt;br /&gt;
// indicamos a Spring que levante los archivos de configuración que veremos más adelante&lt;br /&gt;
@ContextConfiguration(&amp;quot;spring-configuration.xml&amp;quot;)&lt;br /&gt;
public class ClienteIntegracionTest {&lt;br /&gt;
&lt;br /&gt;
// Creamos el request a enviarle al WS&lt;br /&gt;
private String request = &amp;quot;&amp;lt;ns2:UserProfileCreateRequest xmlns:ns2='http://shekhar.com/usermanagement/schemas'&amp;gt; Shekhar Gulati 27 &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Creamos el response que nos responderá el WS&lt;br /&gt;
private String response = &amp;quot;&amp;lt;ns2:UserProfileCreateResponse xmlns:ns2='http://shekhar.com/usermanagement/schemas'&amp;gt; user created successfully &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Inyectamos el WebServiceTemplate &lt;br /&gt;
@Autowired&lt;br /&gt;
private WebServiceTemplate webServiceTemplate;&lt;br /&gt;
&lt;br /&gt;
// Mockeamos el WebServiceServer&lt;br /&gt;
private MockWebServiceServer server;&lt;br /&gt;
&lt;br /&gt;
// Clase nuestra que lo consumirá&lt;br /&gt;
@Autowired&lt;br /&gt;
private Cliente cliente;&lt;br /&gt;
&lt;br /&gt;
// En el Before levantamos el server pasandole como parámetro al constructor &lt;br /&gt;
// el webServiceTemplate&lt;br /&gt;
@Before&lt;br /&gt;
public void setup() {&lt;br /&gt;
server = MockWebServiceServer.createServer(webServiceTemplate);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void testInvocacionWs() {&lt;br /&gt;
&lt;br /&gt;
// Le damos comportamiento a nuestro WS con el request y el response&lt;br /&gt;
// antes configurado&lt;br /&gt;
server.expect(RequestMatchers.payload(new StringSource(request))).andRespond(ResponseCreators.withPayload(new StringSource(response)));&lt;br /&gt;
&lt;br /&gt;
cliente.invocarMetodoQueLlamaAlWs();&lt;br /&gt;
&lt;br /&gt;
// Nos aseguramos que el servicio fue invocado&lt;br /&gt;
server.verify();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dentro de los archivos de configuración que levante Spring, tendremos que configurarle los siguientes beans:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;wsTemplate&amp;quot; class=&amp;quot;org.springframework.ws.client.core.WebServiceTemplate&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Url donde esta expuesto nuestro WS. En este test no irá a invocarlo, ya que se simula el entorno localmente --&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;defaultUri&amp;quot; value=&amp;quot;http://localhost:8080/&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;marshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;unmarshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;marshaller&amp;quot; class=&amp;quot;org.springframework.oxm.jaxb.Jaxb2Marshaller&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;classesToBeBound&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;list&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Listado de clases con las que esta mapeado cada Request y Response --&amp;gt;&lt;br /&gt;
    &amp;lt;value&amp;gt;com.dosideas.ejemplo.schemas.ClienteRequest&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;value&amp;gt;com.dosideas.ejemplo.schemas.ClienteResponse&amp;lt;/value&amp;gt;&lt;br /&gt;
   &amp;lt;/list&amp;gt;&lt;br /&gt;
  &amp;lt;/property&amp;gt;&lt;br /&gt;
 &amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, el método de nuestra clase cliente, deberá contener&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
public void invocarMetodoQueLlamaAlWs() {&lt;br /&gt;
...&lt;br /&gt;
ClienteRequest clienteRequest = new ClienteRequest();&lt;br /&gt;
...&lt;br /&gt;
ClienteResponse clienteResponse = (clienteResponse) webServiceTemplate&lt;br /&gt;
        .marshalSendAndReceive(clienteRequest);&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Fuente====&lt;br /&gt;
*[http://static.springsource.org/spring-ws/site/reference/html/client.html Spring MVC Test ]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=The_Core&amp;diff=6535</id>
		<title>The Core</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=The_Core&amp;diff=6535"/>
				<updated>2012-03-14T19:19:58Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Revertidos los cambios de 84.235.45.242 (disc.) a la última edición de 186.18.30.145&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[The Core]] es un conjunto de protocolos y prácticas para la [[Conformación de equipos]] efectivos.&lt;br /&gt;
&lt;br /&gt;
Los protocolos de The Core son &amp;quot;mejores prácticas&amp;quot; para las personas, equipos de personas y organizaciones que quieren obtener grandes resultados - todo el tiempo. Son &amp;quot;Core&amp;quot; (núcleo) porque son fundacionales - pueden ser usados por todos los equipos, en todo lugar, incluso si ya tienen patrones organizaciones y mejores prácticas propias. Son &amp;quot;protocolos&amp;quot; porque nombran y prescriben formas de interacción entre las personas (comportamiento), que resultan predecibles, como los &amp;quot;protocolos&amp;quot; que se usan en la diplomacia. &lt;br /&gt;
&lt;br /&gt;
Entonces, los protocolos de The Core: &lt;br /&gt;
* son tácticas que las personas pueden usar para obtener mejores resultados&lt;br /&gt;
* los pueden usar individuos, equipos y organizaciones&lt;br /&gt;
* son de &amp;quot;[[Software Libre]]&amp;quot; y &amp;quot;versionados&amp;quot; (se mejoran con el tiempo), al igual que el software&lt;br /&gt;
&lt;br /&gt;
Suena interesante, ¿no?&lt;br /&gt;
&lt;br /&gt;
A continuación dejamos una traducción de [http://www.mccarthyshow.com/LearnForFree/BestPracticesTheCoreProtocols/tabid/65/Default.aspx The Core Protocolos v 3.02]. &lt;br /&gt;
Pueden leer más sobre [[The Core]] en el libro '''Software for your head''', de Jim y Michele McCarthy (ISBN 0-201-60456-6).&lt;br /&gt;
&lt;br /&gt;
== Los protocolos de The Core v 3.02 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;'''(The Core está distribuido bajo la [http://www.gnu.org/licenses/gpl.txt licencia GNU -PL]. The Core se considera como el código fuente bajo esa licencia. Son libres de usar, distribuir este trabajo o cualquier derivado que hagan, siempre y cuando también distribuyan este documento fuente en forma completa, incluyendo este párrafo).'''&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Los compromisos de The Core ===&lt;br /&gt;
# Me comprometo a estar involucrado cuando estoy presente.&lt;br /&gt;
#* A conocer e informar&lt;br /&gt;
#** lo que quiero,&lt;br /&gt;
#** lo que pienso, y &lt;br /&gt;
#** lo que siento.&lt;br /&gt;
#* A siempre buscar ayuda efectiva.&lt;br /&gt;
#* A no ofrecer y negarme a aceptar transmisiones emocionales incoherentes.&lt;br /&gt;
#* Cuando tengo o escucho una mejor idea que la actual, inmediantamente voy a&lt;br /&gt;
#** proponerla para una aceptación decisiva o rechazo, y/o&lt;br /&gt;
#** explícitamente voy a buscar que se mejore&lt;br /&gt;
#* Personalmente voy a apoyar la mejor idea&lt;br /&gt;
#** sin importar de quien venga, &lt;br /&gt;
#** sin importar cuánto desee que aparezca otra mejor idea más tarde, y&lt;br /&gt;
#** cuando no tengo una idea alternativa superior.&lt;br /&gt;
# Voy a buscar percibir más de lo que busco ser percibido.&lt;br /&gt;
# Voy a usar los equipos, en especial cuando llevo adelante tareas difíciles.&lt;br /&gt;
# Voy a hablar siempre y sólo cuando creo que voy a mejorar el ratio general resultado/esfuerzo.&lt;br /&gt;
# Voy a ofrecer y aceptar sólo comportamiento y comunicación racional y orientada a resultados.&lt;br /&gt;
# Me voy a desinvolucrar de situaciones menos productivas&lt;br /&gt;
#* cuando no pueda mantener este compromiso&lt;br /&gt;
#* cuando es más importante que me involucre en otro lugar.&lt;br /&gt;
# Voy a hacer ahora lo que debe hacerse eventualmente y puede hacerse efectivamente ahora.&lt;br /&gt;
# Voy a buscar avanzar hacia un objetivo en particular, llevando mi comportamiento hacia la acción.&lt;br /&gt;
# Voy a usar los Protocolos de The Core (o mejores) cuando sea aplicable.&lt;br /&gt;
#* Voy a ofrecer y aceptar a tiempo y usar adecuadamente el Protocolo de [[Check-In]]&lt;br /&gt;
# No voy a lastimar -ni tolerar que lastimen- a nadie por su fidelidad a estos compromisos.&lt;br /&gt;
# No voy a hacer nada tonto a propósito.&lt;br /&gt;
&lt;br /&gt;
=== Pasar (Despasar) ===&lt;br /&gt;
El protocolo [[Pasar]] es para declinar la participación en algo. Usalo cada vez que no quieras participar en una actividad. &lt;br /&gt;
&lt;br /&gt;
==== Pasos ====&lt;br /&gt;
# Cuando decidís no participar, decí &amp;quot;Paso&amp;quot;.&lt;br /&gt;
# Podés despasar en cualquier momento que quieras. Despasá ni bien sepas que querés participar otra vez, diciendo &amp;quot;Despaso&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Compromisos ====&lt;br /&gt;
* Mantener privados los motivos de pasar.&lt;br /&gt;
* Pasar en algo ni bien somos conscientes de que vamos a pasar. &lt;br /&gt;
* Respetar el decho de los demás a pasar sin explicación.&lt;br /&gt;
* No juzgar, avergonazar, molestar, interrogar ni castigar a alguien que pasa. &lt;br /&gt;
&lt;br /&gt;
==== Notas ====&lt;br /&gt;
* En general, no vas a estar bien parado frente a los Compromisos de The Core si pasás la mayor parte del tiempo.&lt;br /&gt;
* Podés pasar de cualquier actividad; sin embargo, si adoptás los Compromisos de The Core, no podés pasar en un voto de [[Decisión]] y tenés que decir &amp;quot;Estoy presente&amp;quot; al hacer el [[Check-In]].&lt;br /&gt;
* Podés pasar aunque ya hayas empezado algo. &lt;br /&gt;
&lt;br /&gt;
=== Check-In ===&lt;br /&gt;
Usá el [[Check-In]] para empezar reuniones o en cualquier momento que un Check-In individual o grupal agregue valor a las interacciones del equipo.&lt;br /&gt;
&lt;br /&gt;
==== Pasos ====&lt;br /&gt;
# La persona dice &amp;quot;Me siento [uno o más de ENOJADO, TRISTE, CONTENTO, ASUSTADO]&amp;quot;. La persona puede dar una breve explicación. O si otros ya hacieron su check-in, la persona puede decir &amp;quot;Paso&amp;quot;. (ver el protocolo [[Pasar]]).&lt;br /&gt;
# La persona dice &amp;quot;Estoy presente&amp;quot;. Esto significa que la persona se comportará de acuerdo a los Compromisos de The Core. &lt;br /&gt;
# El resto de las personas responden &amp;quot;Bienvenido&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
==== Compromisos ====&lt;br /&gt;
* Decir los sentimientos sin adjetivos.&lt;br /&gt;
* Decir los sentimientos sólo sin nos pertenecen.&lt;br /&gt;
* Estar callados durante el Check-In de otra persona.&lt;br /&gt;
* No referirse al Check-In de otra persona sin su permiso explícito para hacerlo.&lt;br /&gt;
&lt;br /&gt;
==== Notas ====&lt;br /&gt;
* En el contexto de los Protocolos de The Core, todas las emociones se expresan a través de una combinación de ENOJADO, TRISTE, CONTENTO o ASUSTADO. Por ejemplo, &amp;quot;ansioso&amp;quot; puede ser una combinación de CONTENTO y ASUSTADO.&lt;br /&gt;
* Hacer el Check-In lo más profundo posible. Lo normal es hacer el check-in con dos o más emociones. La profundidad del Check-In del grupo se traduce directamente en la calidad de los resultados del grupo.&lt;br /&gt;
* No hacer nada por disminuir el estado emocional. No describirnos como &amp;quot;un poquito&amp;quot; enojado, triste, contento o asustado, ni tampoco decir &amp;quot;Estoy enojado, PERO igual estoy contento&amp;quot;. &lt;br /&gt;
* Excepto en los grupos muy grandes, si más de una persona hace el check-in, es recomendable que todos lo hagan.&lt;br /&gt;
* FELIZ puede ser un sustito de CONTENTO, y CON MIEDO puede ser un sustitio de ASUSTADO.&lt;br /&gt;
&lt;br /&gt;
=== Check-Out ===&lt;br /&gt;
El [[Check-Out]] requiere que nuestra presencia física siempre signifique nuestro involucramiento. Debemos hacer un Check-Out cuando somos conscientes que no podemos mantener los Compromisos de The Core o cuando es mejor para nosotros estar en otro lugar. &lt;br /&gt;
&lt;br /&gt;
==== Pasos ====&lt;br /&gt;
# Decir &amp;quot;Hago un Check-Out&amp;quot;.&lt;br /&gt;
# Físicamente dejar al grupo hasta que estemos listos para hacer un nuevo Check-In.&lt;br /&gt;
# Opcionalmente, si lo sabemos y es relevante, podemos decir cuándo pensamos volver. &lt;br /&gt;
# Quienes están presentes al momento del Check-Out no deben seguir a la persona, preguntar o hablar sobre el Check-Out de la persona. &lt;br /&gt;
&lt;br /&gt;
==== Compromisos ====&lt;br /&gt;
* Retornar ni bien podamos seguir los Compromisos de The Core.&lt;br /&gt;
* Retonar y hacer un Check-In sin llamar la atención por nuestro retorno.&lt;br /&gt;
* No juzgar, avergonzar, molestar, interrogar o castigar a nadie que hace un Check-out. &lt;br /&gt;
&lt;br /&gt;
==== Notas ====&lt;br /&gt;
* Cuando hacemos un Check-Out hacerlo de la forma más calmada que sea posible, de manera de causar la menor interrupción posible a los demás.&lt;br /&gt;
* Hacer un Check-Out si nuestra estado emocional nos impide colaborar, si tenemos una recepción baja a nueva información, o si no sabemos lo que queremos.&lt;br /&gt;
* El Check-Out es admitir que no podemos contribuir en ese momento.&lt;br /&gt;
&lt;br /&gt;
=== Pedir ayuda ===&lt;br /&gt;
El protocolo de [[Pedir ayuda]] nos permite hacer un uso eficiente de las habilidades y conocimientos de otros. Pedir ayuda es el acto que cataliza la [[Conexión]] y uan [[Visión compartida]]. Debemos usarlo continuamente, antes y durante la búsqueda de cualquier resultado. &lt;br /&gt;
&lt;br /&gt;
==== Pasos ====&lt;br /&gt;
# Quien pide le pregunta a otro; &amp;quot;[Nombre de quien ayuda], ¿harías X?&amp;quot;.&lt;br /&gt;
# Quien pide expresa todas las cosas específicas o restricciones de la petición.&lt;br /&gt;
# Quien ayuda responde diciendo &amp;quot;Si&amp;quot; o &amp;quot;No&amp;quot;, u ofreciendo una forma alternativa de ayuda. &lt;br /&gt;
&lt;br /&gt;
==== Compromisos ====&lt;br /&gt;
* Siempre empezar el Protocolo de Pedir ayuda con la frase &amp;quot;¿harías....?&amp;quot;.&lt;br /&gt;
* Tener una comprensión clara de lo que queremos que haga quien nos ayuda, o si no tenemos en claro la ayuda que queremos, dejarlo en claro diciendo &amp;quot;No estoy seguro con qué necesito ayuda, ¿me ayudarías?&amp;quot;.&lt;br /&gt;
* Asumir que todos quienes ayudan están siempre disponibles, y confiar que cada uno de quienes ayudan aceptan la responsabilidad de decir &amp;quot;No&amp;quot;. &lt;br /&gt;
* Decir &amp;quot;No&amp;quot; cada vez que no querramos ayudar. &lt;br /&gt;
* Aceptar la respuesta &amp;quot;No&amp;quot; sin hacer preguntas ni un drama emocional.&lt;br /&gt;
* Ser receptivos de la ayuda ofrecida. &lt;br /&gt;
* Ofrecer nuestra mejor ayuda incluso aunque no sea lo que está esperando quien pide. &lt;br /&gt;
* Postponer el pedido de ayuda si no podemos estar completamente involucrados.&lt;br /&gt;
* Pedir más información si no tenemos en claro en qué consiste la ayuda que nos piden.&lt;br /&gt;
* No disculparse por pedir ayuda. &lt;br /&gt;
&lt;br /&gt;
==== Notas ====&lt;br /&gt;
* Es &amp;quot;barato&amp;quot; pedir ayuda. El peor resultado es un &amp;quot;No&amp;quot;, lo que nos deja ni más adelante ni más atrás de antes de pedir. En el mejor escenario, reducimos el tiempo para hacer una tarea y/o aprender. &lt;br /&gt;
* Quienes ayudan deben decir &amp;quot;No&amp;quot; si no están seguros de querer ayudar. No deben decir nada más después de negarse. &lt;br /&gt;
* No podemos &amp;quot;pedir demasiada ayuda&amp;quot; a una persona, a menos que explícitamente esa persona haya pedido que se respete un límite en particular. &lt;br /&gt;
* Si no comprendemos el valor de lo que se ofrece, o sentimos que no sería útil, o creemos que ya consideramos y rechazamos la idea anteriormente, usemos una postura curiosa en vez de rechazar automáticamente con un &amp;quot;pero...&amp;quot; (ver el protocolo [[Investigar]])&lt;br /&gt;
* Pedir cuando hay problemas quienes decir que esperamos demasiado tiempo para pedir ayuda. Debemos pedir ayuda cuando nos está yendo bien. &lt;br /&gt;
* El simple hecho de conectarnos con alguien, incluso cuando esta persona no sepa nada del tema, pueden ayudarnos a encontrar respuestas dentro de nosotros mismos, especialmente si le pedimos a esa persona que nos Investigue.&lt;br /&gt;
&lt;br /&gt;
=== Comprobación de protocolo ===&lt;br /&gt;
Usar la Comprobación de protocolo cuando creemos que se está usando un protocolo de forma incorrecta, o cuando se está rompiendo uno de los Compromisos de The Core. &lt;br /&gt;
&lt;br /&gt;
==== Pasos ====&lt;br /&gt;
# Decir &amp;quot;Comprobación de protocolo&amp;quot;.&lt;br /&gt;
# Si sabemos el uso correcto del protocolo, decirlo. Sino, [[Pedir ayuda]].&lt;br /&gt;
&lt;br /&gt;
==== Compromisos ====&lt;br /&gt;
* Decir &amp;quot;Comprobación de protocolo&amp;quot; ni bien seamos conscientes del uso incorrecto de un protocolo, o si se viola alguno de los Compromisos de The Core. Hacerlo sin importar la actividad que se esté llevando a cabo.&lt;br /&gt;
* Apoyar a cualquiera que use la Comprobación de protocolo.&lt;br /&gt;
* No avergonzar ni castigar a nadie que use la Comprobación de protocolo.&lt;br /&gt;
* [[Pedir ayuda]] ni bien nos demos cuenta que no sabemos el uso correcto de un protocolo.&lt;br /&gt;
&lt;br /&gt;
=== Comprobación de intención ===&lt;br /&gt;
Usar la [[Comprobación de intención]] para clarificar el propósito de nuestro comportamiento, o el de otros. Usarlo cuando no estamos esperando un resultado positvo del comportamiento actual. La [[Comprobación de intención]] verifica la integridad de la intención propia y de otros en un caso dado. &lt;br /&gt;
&lt;br /&gt;
==== Pasos ====&lt;br /&gt;
# Preguntar &amp;quot;¿Cuál es mi/tu intención con X?&amp;quot;, donde X es algún tipo de comportamiento actual o pendiente de la persona cuya intención queremos conocer. &lt;br /&gt;
# Si resulta útil, preguntar &amp;quot;¿Qué respuesta o comportamiento querés de alguien como consecuencia de X?&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Compromisos ====&lt;br /&gt;
* Ser consciente de nuestra propia intención antes de comprobar la intención de otros.&lt;br /&gt;
* Investigar lo suficiente para descubrir la intención de la persona o de sus acciones.&lt;br /&gt;
* Asegurarse de tener la intención de resolver cualquier conflicto de manera pacífica antes de comprobar la intención de otra persona. Si no tenemos una intención pacífica, hacer un [[Check-Out]].&lt;br /&gt;
* No ser defensivos cuando alguien nos pregunta cuál es nuestra intención. Si no podemos, hacer un [[Check-Out]].&lt;br /&gt;
&lt;br /&gt;
==== Notas ====&lt;br /&gt;
* Si aparece un conflicto que parece irresoluble, hacer un [[Check-Out]] o [[Pedir ayuda]].&lt;br /&gt;
&lt;br /&gt;
=== Decisión ===&lt;br /&gt;
Usar [[Decisión]] cada vez que querramos avanzar al equipo de forna inmediata y unánime hacia resultados.&lt;br /&gt;
&lt;br /&gt;
==== Pasos ====&lt;br /&gt;
# El proponente dice &amp;quot;Propongo [comportamiento consiso y accionable]&amp;quot;.&lt;br /&gt;
# El proponente dice &amp;quot;1-2-3&amp;quot;.&lt;br /&gt;
# Los votantes votan simultáneamente, usando un &amp;quot;Si&amp;quot; (pulgar arriba), &amp;quot;No&amp;quot; (pulgar abajo) o &amp;quot;Lo apoyo&amp;quot; (mano plana). &lt;br /&gt;
# Los votantes que no pueden aceptar la propuesta bajo ningún punto de vista deben expresarlo abiertamente diciendo &amp;quot;Mi voto es un no absoluto. No voy a apoyarlo&amp;quot;. Si esto ocurre, se retira la propuesta.&lt;br /&gt;
# El proponente cuenta los votos. &lt;br /&gt;
# El proponente retira la propuesta si la combinación de votos &amp;quot;No&amp;quot; y votos &amp;quot;Lo apoyo&amp;quot; es demasiado grande, o si el proponente no espera concluir con éxito la [[Resolución]] (ver a continuación). Podemos aproximar este &amp;quot;demasiado grande&amp;quot; usando la siguiente heurística: &lt;br /&gt;
#* aproximadamente el 50% (o más) de los votos son &amp;quot;Lo apoyo&amp;quot;, o&lt;br /&gt;
#* la ganancia esperada de la propuesta si fuera aprobada es menor que el costo por el esfuerzo de la [[Resolución]].&lt;br /&gt;
# El proponente usa el Protocolo de [[Resolución]] con cada votante &amp;quot;No&amp;quot; para acercarlo a la propuesta, preguntándole &amp;quot;¿Qué sería necesario para que aceptes?&amp;quot;.&lt;br /&gt;
# El proponente declara aceptada a la propuesta si todos los votos &amp;quot;No&amp;quot; cambian a &amp;quot;Si&amp;quot; o &amp;quot;Lo apoyo&amp;quot;. &lt;br /&gt;
# El equipo ahora está comprometido a la acción.&lt;br /&gt;
&lt;br /&gt;
==== Compromisos ====&lt;br /&gt;
* Proponer no más de un elemento por propuesta.&lt;br /&gt;
* Mantenerse presente hasta que esté terminado el protocolo de [[Decisión]]; siempre estar conscientes de cómo nuestro comportamiento afecta al equipo, haciendolo avanzar o poniendo obstáculos.&lt;br /&gt;
* Dar nuestra máxima atención a la propuesta por sobre cualquier otra actividad. &lt;br /&gt;
* Hablar sólo cuando se es el proponente, o cuando el proponente nos pide hablar. &lt;br /&gt;
* Durante el protocolo, no expresar los motivos por los cuales votamos como lo hicimos.&lt;br /&gt;
* Revelar inmediatamente cuando somos un votante &amp;quot;No absoluto&amp;quot;, y estar listos a proponer una mejor idea. &lt;br /&gt;
* Ser personalmente responsable por lograr los resultados del compromiso de la Decisión, incluso aunque haya sido hecha en nuestra ausencia. &lt;br /&gt;
* Mantenerse informados sobre los compromisos de una Decisión hechos en nuestra ausencia. &lt;br /&gt;
* No discutir con un votante &amp;quot;No absoluto&amp;quot;. Siempre pedirle una idea mejor.&lt;br /&gt;
* Apoyar activamente las decisiones tomadas. &lt;br /&gt;
* Usar la capacidad de &amp;quot;parar el carro&amp;quot; al decir &amp;quot;no me van a convencer sin importar qué pase&amp;quot; con mucha discresión y lo más infrecuentemente posible.&lt;br /&gt;
* Insitir todo el tiempo que se sigan los protocolos de [[Decisión]] y [[Resolución]] tal cual están prescriptos, sin importar cuántas veces nos encontremos insistiendo en esto. &lt;br /&gt;
* No [[Pasar]] durante una [[Decisión]].&lt;br /&gt;
* Trabajar incesantemente para avanzar; estar enfocados a la acción.&lt;br /&gt;
* No mirar cómo votan los demás para elegir nuestro voto.&lt;br /&gt;
* Evitar usar el protocolo de [[Decisión]] en grupos grandes. Dividir al grupo grande en pequeños subgrupos para tomar decisiones, y usar el grupo grande para informar el estado.&lt;br /&gt;
&lt;br /&gt;
==== Notas ====&lt;br /&gt;
* Votar &amp;quot;No&amp;quot; sólo cuando realmente creemos que nuestra contribución para hacer avanzar al equipo después de detenerlo con nuestro voto supera ampliamente el (en general alto) costo que agregamos por votar &amp;quot;No&amp;quot;. &lt;br /&gt;
* Si no estamos seguros o confusos por la propuesta, apoyarla y buscar clarificación luego de que la propuesta esté resuelta. Si tenemos una propuesta alternativa después de recibir más información, podemos estar seguros que nuestro equipo apoyará la mejor idea (recordar los Compromisos de The Core). &lt;br /&gt;
* Votar &amp;quot;No&amp;quot; para hacer cambios menores a lo que de otra manera es una propuesta aceptable sólo detiene el avance del equipo y debería evitarse. En cambio, ofrecer una propuesta adicional después de aprobar la actual o, mejor aún, involucrarse en la implementación para asegurarnos que nuestra idea se lleva adelante. &lt;br /&gt;
* Retirar las propuestas débiles. Si una propuesta recibe menos del 70% (aproximado) de votos &amp;quot;Si&amp;quot;, es una propuesta débiles y el proponente debería retirarla. Sin embargo, esta decisión queda a criterio del proponente. &lt;br /&gt;
* Cada vez que votemos &amp;quot;No&amp;quot; pensar como si fueramos el único votante no. &lt;br /&gt;
* Votar &amp;quot;No absoluto&amp;quot; sólo cuando estemos convencidos de tener una contribución importante para hacer a la dirección o liderazgo del equipo, o cuando la integridad lo requiere absolutamente.&lt;br /&gt;
&lt;br /&gt;
=== Resolución ===&lt;br /&gt;
Cuando un voto por [[Decisión]] resulta en una pequeña minoria de disidentes, el proponente lleva rápidamente al equipo, de manera estructurada, a negociar con los disientes. El protocolo de [[Resolución]] promueve que el equipo avance al enfcarse en traer a los disidentes al menor costo.&lt;br /&gt;
&lt;br /&gt;
==== Pasos ====&lt;br /&gt;
# El proponente pregunta al disidente &amp;quot;¿Qué sería necesario para que aceptes?&amp;quot;&lt;br /&gt;
# El disidente dice la modificación que él requiere, usando una oración única, corta y declarativa. &lt;br /&gt;
# El proponente ofrece adoptar los cambios del disidente o descarta la propuesta. &lt;br /&gt;
&lt;br /&gt;
==== Notas ====&lt;br /&gt;
* Si los cambios del disidente son simples, basta con realizar un chequeo visual para determinar si todos siguen aceptando la propuesta.&lt;br /&gt;
* Si los cambios del disidente son complejos, el proponente debe retirar la propuesta actual y luego crear una nueva propuesta que incluya los cambios del disidente. &lt;br /&gt;
* Si el disidente comienza a explicar porqué votó &amp;quot;No&amp;quot; o a explicar cualquier otra cosa que no sea lo necesaria para que acepte, el proponente lo debe interrumpir con &amp;quot;¿Qué sería necesario para que aceptes?&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Juego de perfección ===&lt;br /&gt;
El protocolo del [[Juego de perfección]] nos apoyará en nuestro deseo de agregar las mejores ideas. Usarlo cada vez que deseamos mejorar algo que creamos. &lt;br /&gt;
&lt;br /&gt;
==== Pasos ====&lt;br /&gt;
# El Perfeccionista realiza un acto o presenta un objeto para perfeccionar, opcionalmente diciendo &amp;quot;Empiezo&amp;quot; y &amp;quot;Terminó&amp;quot; para notificar al Perfeccionador el final de la actuación.&lt;br /&gt;
# El Perfeccionador califica el valor de la actuación o del objeto en un escala de 1 al 10, basándose en cuánto valor el Perfeccionador cree poder agregar. &lt;br /&gt;
# El Perfeccionador dice &amp;quot;Lo que me gusta de la actuación o del objeto X es...&amp;quot; y procede a listar las cualidades del objeto que el Perfeccionador cree que son de alto valor y que deberían amplificarse. &lt;br /&gt;
# El Perfeccionador ofrece las mejoras a las actuación o al objeto para obtener la calificación &amp;quot;10&amp;quot; diciendo &amp;quot;Para obtener un diez, deberías hacer X&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
==== Compromisos ====&lt;br /&gt;
* Aceptar la perfección sin cuestionar. &lt;br /&gt;
* Dar sólo comentarios positivos: lo que nos gusta y lo que debería hacerse para &amp;quot;lograr el 10&amp;quot;. &lt;br /&gt;
* Abstenerse de mencionar lo que no nos gusta, o ser negativo en cualquier otra forma. &lt;br /&gt;
* Quitar puntos sólo si podemos pensar en alguna mejora. &lt;br /&gt;
* Usar calificaciones que reflejen la escala de mejora en vez de una escala de cuánto nos gustó el objeto. &lt;br /&gt;
* Si no podés decir algo de lo que te gustó del objeto o no podés especificar cómo hacer mejor al objeto, tenés que calificar con un &amp;quot;10&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
==== Notas ====&lt;br /&gt;
* La calificación de &amp;quot;10&amp;quot; significa que no podemos agregar valor, y una calificación de &amp;quot;5&amp;quot; significa que vamos a describir cómo hacer que el objeto sea el doble de bueno.&lt;br /&gt;
* La información importante para transmitir en el protocolo del [[Juego de perfección]] mejora a la actuación o al objeto. Por ejemplo, &amp;quot;El sonido idea de un chasquido de dedos para mi es claro, tiene suficiente volumen, y me sorprende. Para obtener un 10, deberías mejorar la claridad&amp;quot;. &lt;br /&gt;
* Como Perfeccionista, sólo podemos hacer preguntas para clarificar o recolectar más información para mejorar. Si no estás de acuerdo con las ideas que te ofrecen, simplemente no las incluyas.&lt;br /&gt;
&lt;br /&gt;
=== Alineamiento personal ===&lt;br /&gt;
El protocolo de [[Alineamiento personal]] ayuda a entrar con profunidad en los deseos y encontrar lo que nos bloquea en obtener lo que queremos. Usarlo para descubrir, articular, y lograr lo que queremos. La calidad del alineamiento será igual a la calidad de nuestros resultados. &lt;br /&gt;
&lt;br /&gt;
==== Pasos ====&lt;br /&gt;
# Deseo. Responder a la pregunta: &amp;quot;¿Qué quiero específicamente?&amp;quot;.&lt;br /&gt;
# Bloqueo. Preguntarnos, &amp;quot;¿Qué me está bloqueando en obtener lo que quiero?&amp;quot;.&lt;br /&gt;
# Virtud. Averiguar qué podría quitar este bloqueo respondiendo la pregunta &amp;quot;¿Qué virtud -si la tuviera- podría destruir este bloqueo mio?&amp;quot;.&lt;br /&gt;
# Cambio. Fingir que la virtud que identificamos es en realidad lo que queremos.&lt;br /&gt;
# Otra vez. Repetir los pasos 2-4 hasta que este proceso descubra una virtud que sea lo suficientemente poderosa como para destruir los bloqueos y nos obtenga lo que originalmente creíamos querer. &lt;br /&gt;
# Listo. Ahora escribí una oración de alineamiento personal de la forma &amp;quot;Quiero [virtud]&amp;quot;. Por ejemplo, &amp;quot;Quiero coraje&amp;quot;. &lt;br /&gt;
# Señal / Respuesta / Asignación. Crear una señal para que otros sepan que estás practicando tu alineamiento, y brindá una respuesta que los demás puedan darte para demostrar su apoyo. Por ejemplo, &amp;quot;Cuando digo/hago X, ¿ustedes podrían decir/hacer Y?&amp;quot;. Opcionalmente, convertilo en una asignación al decir que haremos X una cierta cantidad de veces al día, donde X es una actividad que requiere que vivamos nuestro alineamiento. &lt;br /&gt;
# Evidencia. Escribí, en términos específicos y medibles, la evidencia a largo plazo de practicar este alineamiento. &lt;br /&gt;
# Ayuda. Pedile ayuda a cada miembro del equipo. Ellos ayudan al dar la respuesta que te gustaría cuando des la señal de estar practicando tu alineamiento. &lt;br /&gt;
&lt;br /&gt;
==== Compromisos ====&lt;br /&gt;
* Identificar un alineamiento que resultarán en un cambio personal y que no requiere ningún cambio en otra personal. &lt;br /&gt;
* Identificar bloqueos y deseos que son específicos y personales. &lt;br /&gt;
* Identificar bloqueos que, si se resuelven, radicalmente van a incrementar tu efectividad en la vida, el trabajo y el ocio. &lt;br /&gt;
* Elegir una virtud que trata sobre vos y que sea, preferentemente, de una sola palabra. Por ejemplo: integridad, pasión, cuidado personal, paz, diversión. &lt;br /&gt;
* Pedir ayuda a las personas que te conozcan y/o conozcan tu alineamiento. &lt;br /&gt;
* Identificar evidencia que es medible por una tercera persona, objetiva. &lt;br /&gt;
&lt;br /&gt;
==== Notas ====&lt;br /&gt;
* Los alineamientos personales más comunes son &amp;quot;Quiero (integridad, coraje, pasión, paz, cuidado personal, conocimiento personal). &lt;br /&gt;
* Si te cuesta averiguar lo que querés, adoptá el alineamiento &amp;quot;conocimiento personal&amp;quot;. No hay ningún caso en el que aumentar el conocimiento personal no sea benéfico. &lt;br /&gt;
* Un bloqueo personal es algo que encontramos dentro nuestro. No se refiere a circunstancias ni a otras personas. Asumir que ya podríamos haber tenido lo que queremos, que nuestro bloqueo es un mito que de alguna manera nos está privando de nuestro potencial máximo.&lt;br /&gt;
* Idealmente, identificá evidencia inmediata y a largo plazo para tu alineamiento. Escribí los resultados que empiezan ahora (o muy pronto) y también los resultados que veremos en cinco o más años en el futuro.&lt;br /&gt;
* Como señal predeterminada, decile a tus compañeros u otras personas cercanas que estás trabajando en tu alineamiento cuando lo estás practicando. Si no conocen el protocolo, simplemente contales en qué virtud estás trabajando y pediles ayuda. &lt;br /&gt;
* Cuando los miembros del equipo están completando su alineamiento juntos (se piden ayuda entre ellos), el paso final del proceso es más poderoso si se hace como una ceremonia.&lt;br /&gt;
&lt;br /&gt;
=== Investigar ===&lt;br /&gt;
[[Investigar]] permite aprender sobre cierto fenónemo que ocurre en alguien. Usalo cuando la idea o comportamiento que alguien presenta parece ser pobre, confuso o simplemente interesante.&lt;br /&gt;
&lt;br /&gt;
==== Pasos ====&lt;br /&gt;
# Actuá como si fueras un investigador independiente, pero fascinado, haciendo preguntas hasta que tu curiosidad este satisfecha o hasta que no quieras hacer más preguntas.&lt;br /&gt;
&lt;br /&gt;
==== Compromisos ====&lt;br /&gt;
* Realizar preguntas bien formadas.&lt;br /&gt;
* Realizar únicamente preguntas que aumentarán tu comprensión.&lt;br /&gt;
* Realizar preguntas sólo si el interrogado está comprometido y parece estar listo para responder más.&lt;br /&gt;
* Abstenerse de emitir opiniones.&lt;br /&gt;
* No realizar preguntas donde crees saber qué es lo que responderá.&lt;br /&gt;
* Si no puedes mantenerte como un investigador curioso e independiente, no siguas utilizando el protocolo hasta que puedas volver y mantener estos compromisos.&lt;br /&gt;
 &lt;br /&gt;
==== Notas ====&lt;br /&gt;
* No sacar teorias sobre el investigado ni dar diagnóstico alguno.&lt;br /&gt;
* Considerá utilizar los siguientes tipos de preguntas:&lt;br /&gt;
** ¿Que aspecto de X te generan Y Z?&lt;br /&gt;
** ¿Puedes darme un ejemplo específico?&lt;br /&gt;
** ¿Qué es lo que mas quieres de resolver X?&lt;br /&gt;
** ¿Cuál es el problema más grande que ves de X ahora?&lt;br /&gt;
** ¿Cuál es la cosa más importante que podés hacer ahora para ayudar con X?&lt;br /&gt;
* Las preguntas ineficientes incluyen las siguientes:&lt;br /&gt;
** Preguntas que lleven a una agenda de preguntas.&lt;br /&gt;
** Preguntas que intenten esconder una respuesta que tu crees verdadera.&lt;br /&gt;
** Preguntas que inviten a contar historias.&lt;br /&gt;
** Preguntas que comiencen con &amp;quot;Por qué&amp;quot;.&lt;br /&gt;
* Mantenerse en la intención de obtener mas información.&lt;br /&gt;
* Si sientes que vas a explotar si no podés decir lo que tenés en mente, no deberías hablar. Considerá utilizar [[Comprobación de intención]] o [[Check-Out]].&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Conformación de equipos]]&lt;br /&gt;
* [http://www.mccarthyshow.com/LearnForFree/BestPracticesTheCoreProtocols/tabid/65/Default.aspx Descargar The Core Protocols en PDF (inglés)]&lt;br /&gt;
* [http://ebookee.org/Software-for-Your-Head-Core-Protocols-for-Creating-and-Maintaining-Shared-Vision_768975.html Descargar Software for your head: Core Protocols for Creating and Maintaining Shared Vision]&lt;br /&gt;
&lt;br /&gt;
[[Category: The Core]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=JUnit_con_bases_de_datos&amp;diff=6507</id>
		<title>JUnit con bases de datos</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=JUnit_con_bases_de_datos&amp;diff=6507"/>
				<updated>2012-02-24T12:34:04Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* La regla de JUnit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es muy común tener que integrar [[JUnit]] para ejecutar tests contra una base de datos. Vamos a ver algunas facilidades que nos provee [[JUnit]] y [[Spring Framework]] para hacer más facil la ejecución de tests contra datos siempre limpios. &lt;br /&gt;
&lt;br /&gt;
== embedded-database de Spring ==&lt;br /&gt;
[[Spring Framework]] contiene una utilidad para levantar bases de datos en memoria al momento que se inicializa el factory. De esta forma, podemos inicializar una base y a la vez decirle que ejecute varios scripts, para dejarla preparada y lista para usar. &lt;br /&gt;
&lt;br /&gt;
Un archivo de configuración de ejemplo: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;br /&gt;
       xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
       xmlns:jdbc=&amp;quot;http://www.springframework.org/schema/jdbc&amp;quot;&lt;br /&gt;
       xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;jdbc:embedded-database id=&amp;quot;dataSource&amp;quot; type=&amp;quot;HSQL&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;jdbc:initialize-database data-source=&amp;quot;dataSource&amp;quot; ignore-failures=&amp;quot;NONE&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jdbc:script location=&amp;quot;classpath:tablas.sql&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;jdbc:script location=&amp;quot;classpath:datos.sql &amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/jdbc:initialize-database&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/beans&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta configuración crea un bean llamada &amp;quot;dataSource&amp;quot; que es un DataSource común, listo para inyectar en nuestra aplicación (y reemplazar así un DataSource real). Este DataSource apunta a una base en memoria HSQLDB, y ejecutarán 2 scripts al momento de inicialización: tablas.sql y datos.sql&lt;br /&gt;
&lt;br /&gt;
== Limpieza del contexto de Spring en los tests ==&lt;br /&gt;
Es posible que algún método de test &amp;quot;ensucie&amp;quot; (cambie) el valor de algún bean del factory, lo cual ocasione problemas en tests posteriores. Podemos usar la anotación @DirtiesContext para indicarle a Spring que vuelva a crear un nuevo factory luego de la ejecución del método anotado con esta anotación. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;
@ContextConfiguration(locations = {&lt;br /&gt;
    &amp;quot;classpath:datasource-test.xml&amp;quot;,&lt;br /&gt;
    &amp;quot;classpath:applicationContext.xml&amp;quot;&lt;br /&gt;
})&lt;br /&gt;
public class MiTest {&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void fooTest() { ... }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    @DirtiesContext&lt;br /&gt;
    public void barTest() { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este ejemplo, al terminar la ejecución del método barTest() se volverá a crear el factory de Spring (y por lo tanto, se creará una nueva base en memoria). De esta manera el resto de los métodos contarán con un entorno limpio. &lt;br /&gt;
&lt;br /&gt;
== Limpieza de la base de datos con Rules de JUnit ==&lt;br /&gt;
&lt;br /&gt;
En la mayoría de las ocasiones, los métodos @Test no ensucian el contexto de beans de Spring, sino que ensucian los datos de la base de datos (realizando inserts, updates, deletes sobre los mismos). Los métodos posteriores de tests podrían verse afectados por no contar con los datos tal cual se los esperaba. &lt;br /&gt;
&lt;br /&gt;
Una solución es anotar a estos tests que ensucian la base de datos con @DirtiesContext. Esto forzará la creación de un nuevo contexto de Spring, y se recreará la correspondiente base de datos en memoria. Sin embargo, esta solución es relativamente costosa por la continua destrucción/construcción del factory de Spring. &lt;br /&gt;
&lt;br /&gt;
Una solución alternativa será usar un @DirtiesDatabase que sólo recree la base de datos en memoria... sin embargo, Spring no tiene esta utilidad. Por suerte, es muy simple agregarla. &lt;br /&gt;
&lt;br /&gt;
=== @DirtiesDatabase ===&lt;br /&gt;
Crearemos una anotación de método que nos permita indicar que un método de @Test ensucia la base de datos, y luego usaremos una Regla de [[JUnit]] para leer esta anotación y hacer la limpiaza necesaria. &lt;br /&gt;
&lt;br /&gt;
==== La anotación ====&lt;br /&gt;
La anotación es común: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@Retention(RetentionPolicy.RUNTIME)&lt;br /&gt;
public @interface DirtiesDatabase { }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DatabaseRebuilder para reconstruir la base de datos ====&lt;br /&gt;
Primero vamos a crear una interfaz para una clase que se encargue de reconstruir la base de datos: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
public interface DatabaseRebuilder {&lt;br /&gt;
    void rebuildDatabase();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una posible implementación de esta interfaz podría ser invocar a los scripts de inicialización de la base en memoria. &lt;br /&gt;
&lt;br /&gt;
==== La regla de JUnit ====&lt;br /&gt;
Luego, crearemos una regla de [[JUnit]] que buscará esta anotación, y si la encuentra, reconstruye la base de datos. Esta regla usa una instancia de DatabaseRebuilder para hacer la reconstrucción de la base de datos: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
public class DirtiesDatabaseRule implements TestRule {&lt;br /&gt;
&lt;br /&gt;
    private DatabaseRebuilder rebuilder;&lt;br /&gt;
&lt;br /&gt;
    public DirtiesDatabaseRule(DatabaseRebuilder rebuilder) {&lt;br /&gt;
        this.rebuilder = rebuilder;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public Statement apply(final Statement base, final Description description) {&lt;br /&gt;
        return new Statement() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void evaluate() throws Throwable {&lt;br /&gt;
                try {&lt;br /&gt;
                    base.evaluate();&lt;br /&gt;
                } finally {&lt;br /&gt;
                    DirtiesDatabase dirtiesDatabase = description.getAnnotation(DirtiesDatabase.class);&lt;br /&gt;
                    if (dirtiesDatabase != null) {&lt;br /&gt;
                        rebuilder.rebuildDatabase();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Usando @DirtiesDatabase ====&lt;br /&gt;
Listo! Nos queda agregar la regla a la clase de test, y la anotación correspondiente. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;
@ContextConfiguration(locations = {&lt;br /&gt;
    &amp;quot;classpath:datasource-test.xml&amp;quot;,&lt;br /&gt;
    &amp;quot;classpath:applicationContext.xml&amp;quot;&lt;br /&gt;
})&lt;br /&gt;
public class MiTest {&lt;br /&gt;
&lt;br /&gt;
    @Rule&lt;br /&gt;
    public DirtiesDatabaseRule dirtiesDatabaseRule = new DirtiesDatabaseRule(new DatabaseRebuilderImpl());&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void fooTest() { ... }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    @DirtiesDatabase&lt;br /&gt;
    public void barTest() { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=JUnit_con_bases_de_datos&amp;diff=6506</id>
		<title>JUnit con bases de datos</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=JUnit_con_bases_de_datos&amp;diff=6506"/>
				<updated>2012-02-23T20:50:14Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* La regla de JUnit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es muy común tener que integrar [[JUnit]] para ejecutar tests contra una base de datos. Vamos a ver algunas facilidades que nos provee [[JUnit]] y [[Spring Framework]] para hacer más facil la ejecución de tests contra datos siempre limpios. &lt;br /&gt;
&lt;br /&gt;
== embedded-database de Spring ==&lt;br /&gt;
[[Spring Framework]] contiene una utilidad para levantar bases de datos en memoria al momento que se inicializa el factory. De esta forma, podemos inicializar una base y a la vez decirle que ejecute varios scripts, para dejarla preparada y lista para usar. &lt;br /&gt;
&lt;br /&gt;
Un archivo de configuración de ejemplo: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;br /&gt;
       xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
       xmlns:jdbc=&amp;quot;http://www.springframework.org/schema/jdbc&amp;quot;&lt;br /&gt;
       xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;jdbc:embedded-database id=&amp;quot;dataSource&amp;quot; type=&amp;quot;HSQL&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;jdbc:initialize-database data-source=&amp;quot;dataSource&amp;quot; ignore-failures=&amp;quot;NONE&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jdbc:script location=&amp;quot;classpath:tablas.sql&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;jdbc:script location=&amp;quot;classpath:datos.sql &amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/jdbc:initialize-database&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/beans&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta configuración crea un bean llamada &amp;quot;dataSource&amp;quot; que es un DataSource común, listo para inyectar en nuestra aplicación (y reemplazar así un DataSource real). Este DataSource apunta a una base en memoria HSQLDB, y ejecutarán 2 scripts al momento de inicialización: tablas.sql y datos.sql&lt;br /&gt;
&lt;br /&gt;
== Limpieza del contexto de Spring en los tests ==&lt;br /&gt;
Es posible que algún método de test &amp;quot;ensucie&amp;quot; (cambie) el valor de algún bean del factory, lo cual ocasione problemas en tests posteriores. Podemos usar la anotación @DirtiesContext para indicarle a Spring que vuelva a crear un nuevo factory luego de la ejecución del método anotado con esta anotación. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;
@ContextConfiguration(locations = {&lt;br /&gt;
    &amp;quot;classpath:datasource-test.xml&amp;quot;,&lt;br /&gt;
    &amp;quot;classpath:applicationContext.xml&amp;quot;&lt;br /&gt;
})&lt;br /&gt;
public class MiTest {&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void fooTest() { ... }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    @DirtiesContext&lt;br /&gt;
    public void barTest() { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este ejemplo, al terminar la ejecución del método barTest() se volverá a crear el factory de Spring (y por lo tanto, se creará una nueva base en memoria). De esta manera el resto de los métodos contarán con un entorno limpio. &lt;br /&gt;
&lt;br /&gt;
== Limpieza de la base de datos con Rules de JUnit ==&lt;br /&gt;
&lt;br /&gt;
En la mayoría de las ocasiones, los métodos @Test no ensucian el contexto de beans de Spring, sino que ensucian los datos de la base de datos (realizando inserts, updates, deletes sobre los mismos). Los métodos posteriores de tests podrían verse afectados por no contar con los datos tal cual se los esperaba. &lt;br /&gt;
&lt;br /&gt;
Una solución es anotar a estos tests que ensucian la base de datos con @DirtiesContext. Esto forzará la creación de un nuevo contexto de Spring, y se recreará la correspondiente base de datos en memoria. Sin embargo, esta solución es relativamente costosa por la continua destrucción/construcción del factory de Spring. &lt;br /&gt;
&lt;br /&gt;
Una solución alternativa será usar un @DirtiesDatabase que sólo recree la base de datos en memoria... sin embargo, Spring no tiene esta utilidad. Por suerte, es muy simple agregarla. &lt;br /&gt;
&lt;br /&gt;
=== @DirtiesDatabase ===&lt;br /&gt;
Crearemos una anotación de método que nos permita indicar que un método de @Test ensucia la base de datos, y luego usaremos una Regla de [[JUnit]] para leer esta anotación y hacer la limpiaza necesaria. &lt;br /&gt;
&lt;br /&gt;
==== La anotación ====&lt;br /&gt;
La anotación es común: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@Retention(RetentionPolicy.RUNTIME)&lt;br /&gt;
public @interface DirtiesDatabase { }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DatabaseRebuilder para reconstruir la base de datos ====&lt;br /&gt;
Primero vamos a crear una interfaz para una clase que se encargue de reconstruir la base de datos: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
public interface DatabaseRebuilder {&lt;br /&gt;
    void rebuildDatabase();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una posible implementación de esta interfaz podría ser invocar a los scripts de inicialización de la base en memoria. &lt;br /&gt;
&lt;br /&gt;
==== La regla de JUnit ====&lt;br /&gt;
Luego, crearemos una regla de [[JUnit]] que buscará esta anotación, y si la encuentra, limpiará la base de datos: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
public class DirtiesDatabaseRule implements TestRule {&lt;br /&gt;
&lt;br /&gt;
    private DatabaseRebuilder rebuilder;&lt;br /&gt;
&lt;br /&gt;
    public DirtiesDatabaseRule(DatabaseRebuilder rebuilder) {&lt;br /&gt;
        this.rebuilder = rebuilder;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public Statement apply(final Statement base, final Description description) {&lt;br /&gt;
        return new Statement() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void evaluate() throws Throwable {&lt;br /&gt;
                try {&lt;br /&gt;
                    base.evaluate();&lt;br /&gt;
                } finally {&lt;br /&gt;
                    DirtiesDatabase dirtiesDatabase = description.getAnnotation(DirtiesDatabase.class);&lt;br /&gt;
                    if (dirtiesDatabase != null) {&lt;br /&gt;
                        rebuilder.rebuildDatabase();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Usando @DirtiesDatabase ====&lt;br /&gt;
Listo! Nos queda agregar la regla a la clase de test, y la anotación correspondiente. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;
@ContextConfiguration(locations = {&lt;br /&gt;
    &amp;quot;classpath:datasource-test.xml&amp;quot;,&lt;br /&gt;
    &amp;quot;classpath:applicationContext.xml&amp;quot;&lt;br /&gt;
})&lt;br /&gt;
public class MiTest {&lt;br /&gt;
&lt;br /&gt;
    @Rule&lt;br /&gt;
    public DirtiesDatabaseRule dirtiesDatabaseRule = new DirtiesDatabaseRule(new DatabaseRebuilderImpl());&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void fooTest() { ... }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    @DirtiesDatabase&lt;br /&gt;
    public void barTest() { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=JUnit_con_bases_de_datos&amp;diff=6505</id>
		<title>JUnit con bases de datos</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=JUnit_con_bases_de_datos&amp;diff=6505"/>
				<updated>2012-02-23T20:16:04Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Página creada con 'Es muy común tener que integrar JUnit para ejecutar tests contra una base de datos. Vamos a ver algunas facilidades que nos provee JUnit y Spring Framework para hac…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es muy común tener que integrar [[JUnit]] para ejecutar tests contra una base de datos. Vamos a ver algunas facilidades que nos provee [[JUnit]] y [[Spring Framework]] para hacer más facil la ejecución de tests contra datos siempre limpios. &lt;br /&gt;
&lt;br /&gt;
== embedded-database de Spring ==&lt;br /&gt;
[[Spring Framework]] contiene una utilidad para levantar bases de datos en memoria al momento que se inicializa el factory. De esta forma, podemos inicializar una base y a la vez decirle que ejecute varios scripts, para dejarla preparada y lista para usar. &lt;br /&gt;
&lt;br /&gt;
Un archivo de configuración de ejemplo: &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;br /&gt;
       xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
       xmlns:jdbc=&amp;quot;http://www.springframework.org/schema/jdbc&amp;quot;&lt;br /&gt;
       xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;jdbc:embedded-database id=&amp;quot;dataSource&amp;quot; type=&amp;quot;HSQL&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;jdbc:initialize-database data-source=&amp;quot;dataSource&amp;quot; ignore-failures=&amp;quot;NONE&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jdbc:script location=&amp;quot;classpath:tablas.sql&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;jdbc:script location=&amp;quot;classpath:datos.sql &amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/jdbc:initialize-database&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/beans&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta configuración crea un bean llamada &amp;quot;dataSource&amp;quot; que es un DataSource común, listo para inyectar en nuestra aplicación (y reemplazar así un DataSource real). Este DataSource apunta a una base en memoria HSQLDB, y ejecutarán 2 scripts al momento de inicialización: tablas.sql y datos.sql&lt;br /&gt;
&lt;br /&gt;
== Limpieza del contexto de Spring en los tests ==&lt;br /&gt;
Es posible que algún método de test &amp;quot;ensucie&amp;quot; (cambie) el valor de algún bean del factory, lo cual ocasione problemas en tests posteriores. Podemos usar la anotación @DirtiesContext para indicarle a Spring que vuelva a crear un nuevo factory luego de la ejecución del método anotado con esta anotación. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;
@ContextConfiguration(locations = {&lt;br /&gt;
    &amp;quot;classpath:datasource-test.xml&amp;quot;,&lt;br /&gt;
    &amp;quot;classpath:applicationContext.xml&amp;quot;&lt;br /&gt;
})&lt;br /&gt;
public class MiTest {&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void fooTest() { ... }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    @DirtiesContext&lt;br /&gt;
    public void barTest() { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este ejemplo, al terminar la ejecución del método barTest() se volverá a crear el factory de Spring (y por lo tanto, se creará una nueva base en memoria). De esta manera el resto de los métodos contarán con un entorno limpio. &lt;br /&gt;
&lt;br /&gt;
== Limpieza de la base de datos con Rules de JUnit ==&lt;br /&gt;
&lt;br /&gt;
En la mayoría de las ocasiones, los métodos @Test no ensucian el contexto de beans de Spring, sino que ensucian los datos de la base de datos (realizando inserts, updates, deletes sobre los mismos). Los métodos posteriores de tests podrían verse afectados por no contar con los datos tal cual se los esperaba. &lt;br /&gt;
&lt;br /&gt;
Una solución es anotar a estos tests que ensucian la base de datos con @DirtiesContext. Esto forzará la creación de un nuevo contexto de Spring, y se recreará la correspondiente base de datos en memoria. Sin embargo, esta solución es relativamente costosa por la continua destrucción/construcción del factory de Spring. &lt;br /&gt;
&lt;br /&gt;
Una solución alternativa será usar un @DirtiesDatabase que sólo recree la base de datos en memoria... sin embargo, Spring no tiene esta utilidad. Por suerte, es muy simple agregarla. &lt;br /&gt;
&lt;br /&gt;
=== @DirtiesDatabase ===&lt;br /&gt;
Crearemos una anotación de método que nos permita indicar que un método de @Test ensucia la base de datos, y luego usaremos una Regla de [[JUnit]] para leer esta anotación y hacer la limpiaza necesaria. &lt;br /&gt;
&lt;br /&gt;
==== La anotación ====&lt;br /&gt;
La anotación es común: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@Retention(RetentionPolicy.RUNTIME)&lt;br /&gt;
public @interface DirtiesDatabase { }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La regla de JUnit ====&lt;br /&gt;
Primera vamos a crear una interfaz para una clase que se encargue de reconstruir la base de datos: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
public interface DatabaseRebuilder {&lt;br /&gt;
    void rebuildDatabase();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego, crearemos una regla de [[JUnit]] que buscará esta anotación, y si la encuentra, limpiará la base de datos: &lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
public class DirtiesDatabaseRule implements TestRule {&lt;br /&gt;
&lt;br /&gt;
    private DatabaseRebuilder rebuilder;&lt;br /&gt;
&lt;br /&gt;
    public DirtiesDatabaseRule(DatabaseRebuilder rebuilder) {&lt;br /&gt;
        this.rebuilder = rebuilder;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public Statement apply(final Statement base, final Description description) {&lt;br /&gt;
        return new Statement() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void evaluate() throws Throwable {&lt;br /&gt;
                try {&lt;br /&gt;
                    base.evaluate();&lt;br /&gt;
                } finally {&lt;br /&gt;
                    DirtiesDatabase dirtiesDatabase = description.getAnnotation(DirtiesDatabase.class);&lt;br /&gt;
                    if (dirtiesDatabase != null) {&lt;br /&gt;
                        rebuilder.rebuildDatabase();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Usando @DirtiesDatabase ====&lt;br /&gt;
Listo! Nos queda agregar la regla a la clase de test, y la anotación correspondiente. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;
@ContextConfiguration(locations = {&lt;br /&gt;
    &amp;quot;classpath:datasource-test.xml&amp;quot;,&lt;br /&gt;
    &amp;quot;classpath:applicationContext.xml&amp;quot;&lt;br /&gt;
})&lt;br /&gt;
public class MiTest {&lt;br /&gt;
&lt;br /&gt;
    @Rule&lt;br /&gt;
    public DirtiesDatabaseRule dirtiesDatabaseRule = new DirtiesDatabaseRule(new DatabaseRebuilderImpl());&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void fooTest() { ... }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    @DirtiesDatabase&lt;br /&gt;
    public void barTest() { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=JUnit&amp;diff=6504</id>
		<title>JUnit</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=JUnit&amp;diff=6504"/>
				<updated>2012-02-23T19:56:02Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[JUnit]] es un framework de código abierto desarrollado especialmente para crear, ejecutar y hacer reportes de estado de conjuntos de [[Prueba Unitaria]] automatizadas hechos en lenguaje Java.&lt;br /&gt;
&lt;br /&gt;
[[JUnit]] es uno de los frameworks más populares en Java para realizar pruebas unitarias y llevar un desarrollo utilizando la práctica de [[Test Driven Development]].&lt;br /&gt;
&lt;br /&gt;
===Ciclo de vida===&lt;br /&gt;
Al momento de ejecutar los tests, [[JUnit]] ejecuta los siguientes métodos propios de cada clase de test:&lt;br /&gt;
&lt;br /&gt;
* Método '''@BeforeClass''' (método estático, antes de la construcción de la clase)&lt;br /&gt;
* Por cada método anotado con @Test&lt;br /&gt;
** Constructor de la clase de test&lt;br /&gt;
** Método anotado con '''@Before'''&lt;br /&gt;
** Método anotado con '''@Test'''&lt;br /&gt;
** Método anotado con '''@After'''&lt;br /&gt;
* Al finalizar todos los @Test, se ejecuta '''@AfterClass'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ejemplo===&lt;br /&gt;
La siguiente clase contiene 2 tests, y sirve para ver el ciclo de vida de [[JUnit]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 public class HolaMundoTest {&lt;br /&gt;
&lt;br /&gt;
    public HolaMundoTest() {&lt;br /&gt;
        System.out.println(&amp;quot;  Constructor de HolaMundoTest&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @BeforeClass&lt;br /&gt;
    public static void setUpClass() throws Exception {&lt;br /&gt;
        System.out.println(&amp;quot;@BeforeClass&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @AfterClass&lt;br /&gt;
    public static void tearDownClass() throws Exception {&lt;br /&gt;
        System.out.println(&amp;quot;@AfterClass&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Before&lt;br /&gt;
    public void setUp() {&lt;br /&gt;
        System.out.println(&amp;quot;    @Before&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @After&lt;br /&gt;
    public void tearDown() {&lt;br /&gt;
        System.out.println(&amp;quot;    @After&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void decirHola() {&lt;br /&gt;
        System.out.println(&amp;quot;    TEST decirHola&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void decirChau() {&lt;br /&gt;
        System.out.println(&amp;quot;    TEST decirChau&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La salida por consola de esta ejecución es:&lt;br /&gt;
 @BeforeClass&lt;br /&gt;
   Constructor de HolaMundoTest&lt;br /&gt;
     @Before&lt;br /&gt;
     TEST decirHola&lt;br /&gt;
     @After&lt;br /&gt;
   Constructor de HolaMundoTest&lt;br /&gt;
     @Before&lt;br /&gt;
     TEST decirChau&lt;br /&gt;
     @After&lt;br /&gt;
 @AfterClass&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Prueba Unitaria]]&lt;br /&gt;
* [[Spring Test]]&lt;br /&gt;
* [[Tests De JUnit Parametrizados]]&lt;br /&gt;
* [[Tests De JUnit Multihilo]]&lt;br /&gt;
* [[Test de Metodos y Atributos Privados]]&lt;br /&gt;
* [http://www.junit.org Web oficial de JUnit]&lt;br /&gt;
* [http://javaboutique.internet.com/tutorials/UnitTesting/ Unit testing Java programs]&lt;br /&gt;
* [[Configuración de ejecución selectiva de tests]]&lt;br /&gt;
* [[Junit con SoapUI]]&lt;br /&gt;
* [[JUnit con bases de datos]]&lt;br /&gt;
&lt;br /&gt;
[[Category:JUnit]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=JUnit&amp;diff=6503</id>
		<title>JUnit</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=JUnit&amp;diff=6503"/>
				<updated>2012-02-23T19:51:16Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Revertidos los cambios de 94.23.249.158 (disc.) a la última edición de Parivero&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[JUnit]] es un framework de código abierto desarrollado especialmente para crear, ejecutar y hacer reportes de estado de conjuntos de [[Prueba Unitaria]] automatizadas hechos en lenguaje Java.&lt;br /&gt;
&lt;br /&gt;
[[JUnit]] es uno de los frameworks más populares en Java para realizar pruebas unitarias y llevar un desarrollo utilizando la práctica de [[Test Driven Development]].&lt;br /&gt;
&lt;br /&gt;
===Ciclo de vida===&lt;br /&gt;
Al momento de ejecutar los tests, [[JUnit]] ejecuta los siguientes métodos propios de cada clase de test:&lt;br /&gt;
&lt;br /&gt;
* Método '''@BeforeClass''' (método estático, antes de la construcción de la clase)&lt;br /&gt;
* Por cada método anotado con @Test&lt;br /&gt;
** Constructor de la clase de test&lt;br /&gt;
** Método anotado con '''@Before'''&lt;br /&gt;
** Método anotado con '''@Test'''&lt;br /&gt;
** Método anotado con '''@After'''&lt;br /&gt;
* Al finalizar todos los @Test, se ejecuta '''@AfterClass'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ejemplo===&lt;br /&gt;
La siguiente clase contiene 2 tests, y sirve para ver el ciclo de vida de [[JUnit]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 public class HolaMundoTest {&lt;br /&gt;
&lt;br /&gt;
    public HolaMundoTest() {&lt;br /&gt;
        System.out.println(&amp;quot;  Constructor de HolaMundoTest&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @BeforeClass&lt;br /&gt;
    public static void setUpClass() throws Exception {&lt;br /&gt;
        System.out.println(&amp;quot;@BeforeClass&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @AfterClass&lt;br /&gt;
    public static void tearDownClass() throws Exception {&lt;br /&gt;
        System.out.println(&amp;quot;@AfterClass&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Before&lt;br /&gt;
    public void setUp() {&lt;br /&gt;
        System.out.println(&amp;quot;    @Before&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @After&lt;br /&gt;
    public void tearDown() {&lt;br /&gt;
        System.out.println(&amp;quot;    @After&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void decirHola() {&lt;br /&gt;
        System.out.println(&amp;quot;    TEST decirHola&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void decirChau() {&lt;br /&gt;
        System.out.println(&amp;quot;    TEST decirChau&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La salida por consola de esta ejecución es:&lt;br /&gt;
 @BeforeClass&lt;br /&gt;
   Constructor de HolaMundoTest&lt;br /&gt;
     @Before&lt;br /&gt;
     TEST decirHola&lt;br /&gt;
     @After&lt;br /&gt;
   Constructor de HolaMundoTest&lt;br /&gt;
     @Before&lt;br /&gt;
     TEST decirChau&lt;br /&gt;
     @After&lt;br /&gt;
 @AfterClass&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Prueba Unitaria]]&lt;br /&gt;
* [[Spring Test]]&lt;br /&gt;
* [[Tests De JUnit Parametrizados]]&lt;br /&gt;
* [[Tests De JUnit Multihilo]]&lt;br /&gt;
* [[Test de Metodos y Atributos Privados]]&lt;br /&gt;
* [http://www.junit.org Web oficial de JUnit]&lt;br /&gt;
* [http://javaboutique.internet.com/tutorials/UnitTesting/ Unit testing Java programs]&lt;br /&gt;
* [[Configuración de ejecución selectiva de tests]]&lt;br /&gt;
* [[Junit con SoapUI]]&lt;br /&gt;
&lt;br /&gt;
[[Category:JUnit]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Jawr&amp;diff=6501</id>
		<title>Jawr</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Jawr&amp;diff=6501"/>
				<updated>2012-02-23T12:18:45Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Jawr]] es una solución de empaquetado para Javascript y CSS, que permite un rápido desarrollo de los recursos en módulos separados.&lt;br /&gt;
&lt;br /&gt;
Mediante el uso de una biblioteca de etiquetas, Jawr permite el uso de las mismas páginas, sin cambios para el desarrollo y la producción. Jawr también minimiza y comprime los archivos, lo que resulta en una reducción de los tiempos de carga.&lt;br /&gt;
Jawr se configura mediante un archivo de properties.&lt;br /&gt;
&lt;br /&gt;
== Características ==&lt;br /&gt;
Entre otras cosas, [[Jawr]] permite: &lt;br /&gt;
* crear &amp;quot;bundles&amp;quot; de varios archivos [[JavaScript]] o [[CSS]]. Es decir, agrupar muchos archivos en uno único. &lt;br /&gt;
* minificar archivos [[JavaScript]] o [[CSS]], quitando espacios, comentarios y otras técnicas para minimizar el tamaño. &lt;br /&gt;
* comprimir los archivos usando gzip y enviar el resultado comprimido al navegador.&lt;br /&gt;
* leer automáticamente los archivos de un directorio (y subdirectorios), sin necesidad de especificar manualmente cada archivo.&lt;br /&gt;
* crear sprites de múltiples imágenes y compactarlas en una única imágen. &lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
&lt;br /&gt;
A continuación se muestra la esencia de jawr&lt;br /&gt;
[[Archivo:jawr.png]]&lt;br /&gt;
&lt;br /&gt;
ejemplo de jawr.properties&lt;br /&gt;
 # Common properties&lt;br /&gt;
 jawr.debug.on=false&lt;br /&gt;
 jawr.gzip.on=false&lt;br /&gt;
 jawr.gzip.ie6.on=false&lt;br /&gt;
 jawr.charset.name=UTF-8 &lt;br /&gt;
 &lt;br /&gt;
 # Javascript properties and mappings&lt;br /&gt;
 jawr.js.bundle.basedir=/js &lt;br /&gt;
 &lt;br /&gt;
 # All files within /js/lib will be together in a bundle. &lt;br /&gt;
 # The remaining scripts will be served sepparately. &lt;br /&gt;
 jawr.js.bundle.jquery.id=/jquery.js&lt;br /&gt;
 jawr.js.bundle.jquery.mappings=/js/jquery/**&lt;br /&gt;
 &lt;br /&gt;
 jawr.js.bundle.jquery-json.id=/jquery-json.js&lt;br /&gt;
 jawr.js.bundle.jquery-json.mappings=/js/jquery-json/** &lt;br /&gt;
 &lt;br /&gt;
 # The /bundles/lib.js bundle is global &lt;br /&gt;
 # (always imported before other scripts to pages using the taglib)&lt;br /&gt;
 jawr.js.bundle.lib.global=true &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 # CSS properties and mappings&lt;br /&gt;
 jawr.css.bundle.basedir=/css&lt;br /&gt;
 &lt;br /&gt;
 # CSS files will be all bundled together automatically&lt;br /&gt;
 jawr.css.factory.use.singlebundle=true&lt;br /&gt;
 jawr.css.factory.singlebundle.bundlename=/default.css&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
web.xml&lt;br /&gt;
        &amp;lt;servlet&amp;gt;&lt;br /&gt;
 		&amp;lt;servlet-name&amp;gt;JavascriptServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
 		&amp;lt;servlet-class&amp;gt;net.jawr.web.servlet.JawrServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 		&amp;lt;!-- Location in classpath of the config file --&amp;gt;&lt;br /&gt;
 		&amp;lt;init-param&amp;gt;&lt;br /&gt;
 			&amp;lt;param-name&amp;gt;configLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;
 			&amp;lt;param-value&amp;gt;/jawr.properties&amp;lt;/param-value&amp;gt;&lt;br /&gt;
 		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
 		&amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;
 	&amp;lt;/servlet&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 	&amp;lt;servlet&amp;gt;&lt;br /&gt;
 		&amp;lt;servlet-name&amp;gt;CSSServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
 		&amp;lt;servlet-class&amp;gt;net.jawr.web.servlet.JawrServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 		&amp;lt;!-- Location in classpath of the config file --&amp;gt;&lt;br /&gt;
 		&amp;lt;init-param&amp;gt;&lt;br /&gt;
 			&amp;lt;param-name&amp;gt;configLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;
 			&amp;lt;param-value&amp;gt;/jawr.properties&amp;lt;/param-value&amp;gt;&lt;br /&gt;
 		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
 		&amp;lt;init-param&amp;gt;&lt;br /&gt;
 			&amp;lt;param-name&amp;gt;type&amp;lt;/param-name&amp;gt;&lt;br /&gt;
 			&amp;lt;param-value&amp;gt;css&amp;lt;/param-value&amp;gt;&lt;br /&gt;
 		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
 		&amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;
 	&amp;lt;/servlet&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 	&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
 		&amp;lt;servlet-name&amp;gt;JavascriptServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
 		&amp;lt;url-pattern&amp;gt;*.js&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
 	&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 	&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
 		&amp;lt;servlet-name&amp;gt;CSSServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
 		&amp;lt;url-pattern&amp;gt;*.css&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
 	&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
 	&lt;br /&gt;
	&lt;br /&gt;
ejemplo de un jsp&lt;br /&gt;
 &amp;lt;%@ taglib uri=&amp;quot;http://jawr.net/tags&amp;quot; prefix=&amp;quot;jwr&amp;quot;%&amp;gt;&lt;br /&gt;
 &amp;lt;%@ page contentType=&amp;quot;text/html;charset=UTF-8&amp;quot;%&amp;gt;&lt;br /&gt;
 &amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
       &amp;lt;jwr:script src=&amp;quot;/jquery.js&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;jwr:script src=&amp;quot;/jquery-json.js&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;jwr:style src=&amp;quot;/default.css&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  	&amp;lt;h 2&amp;gt;Hello World!&amp;lt;/h 2&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://jawr.java.net/ Web oficial de Jawr]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Node.js&amp;diff=6497</id>
		<title>Node.js</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Node.js&amp;diff=6497"/>
				<updated>2012-02-10T14:26:15Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Configuración de NPM detrás de un proxy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Node.js]] es una plataforma para crear aplicaciones de internet, especialmente servidores web. Los programas se escriben en [[JavaScript]], usan I/O asincrónico por eventos para minizar el overhead y maximizar la escalabildiad. [[Node.js]] utiliza el motor JavaScript V8 de Google, y varias librerías propias. &lt;br /&gt;
&lt;br /&gt;
== Configuración de NPM detrás de un proxy ==&lt;br /&gt;
NPM (el gestor de paquetes de Node) puede funcionar detrás de un proxy. Para esto es necesario configurar los datos del proxy. Toda la configuración de NPM se guarda en el archivo '''.npmrc''' en la raíz del directorio del usuario. Este archivo puede editarse manualmente, o ejecutando ''npm config set key value''.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para utilizar el proxy &amp;quot;proxy.dominio.com&amp;quot; en el puerto 8080, con el usuario &amp;quot;user&amp;quot; y el password &amp;quot;pass&amp;quot;: &lt;br /&gt;
 npm config set proxy http://user:pass@proxy.dominio.com:8080/&lt;br /&gt;
&lt;br /&gt;
En Windows es común que el usuario esté asociado a un dominio. En ese caso, anteponemos el dominio antes del nombre de usuario separando con la contrabarra (\). Por ejemplo, si el usuario &amp;quot;user&amp;quot; está en el dominio &amp;quot;MIDOMINIO&amp;quot;: &lt;br /&gt;
 npm config set proxy http://MIDOMINIO\user:pass@proxy.dominio.com:8080/&lt;br /&gt;
&lt;br /&gt;
Si el proxy tiene problemas con HTTPS, es posible decirle a NPM que utilice sólo el protocolo HTTP para conectarse: &lt;br /&gt;
 npm config set registry http://registry.npmjs.org/&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Node.js&amp;diff=6496</id>
		<title>Node.js</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Node.js&amp;diff=6496"/>
				<updated>2012-02-10T14:21:56Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Página creada con 'Node.js es una plataforma para crear aplicaciones de internet, especialmente servidores web. Los programas se escriben en JavaScript, usan I/O asincrónico por eventos p…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Node.js]] es una plataforma para crear aplicaciones de internet, especialmente servidores web. Los programas se escriben en [[JavaScript]], usan I/O asincrónico por eventos para minizar el overhead y maximizar la escalabildiad. [[Node.js]] utiliza el motor JavaScript V8 de Google, y varias librerías propias. &lt;br /&gt;
&lt;br /&gt;
== Configuración de NPM detrás de un proxy ==&lt;br /&gt;
NPM (el gestor de paquetes de Node) puede funcionar detrás de un proxy. Para esto es necesario configurar los datos del proxy. Toda la configuración de NPM se guarda en el archivo '''.npmrc''' en la raíz del directorio del usuario. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para utilizar el proxy &amp;quot;proxy.dominio.com&amp;quot; en el puerto 8080, con el usuario &amp;quot;user&amp;quot; y el password &amp;quot;pass&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
Ejemplo: &lt;br /&gt;
 proxy = http://user:pass@proxy.dominio.com:8080/&lt;br /&gt;
&lt;br /&gt;
En Windows es común que el usuario esté asociado a un dominio. En ese caso, anteponemos el dominio antes del nombre de usuario separando con la contrabarra (\). Por ejemplo, si el usuario &amp;quot;user&amp;quot; está en el dominio &amp;quot;MIDOMINIO&amp;quot;: &lt;br /&gt;
 proxy = http://MIDOMINIO\user:pass@proxy.dominio.com:8080/&lt;br /&gt;
&lt;br /&gt;
Si el proxy tiene problemas con HTTPS, es posible decirle a NPM que utilice sólo el protocolo HTTP para conectarse: &lt;br /&gt;
 registry = http://registry.npmjs.org/&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>