<?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=Emiliano.tebes</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=Emiliano.tebes"/>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/Especial:Contribuciones/Emiliano.tebes"/>
		<updated>2026-06-09T19:28:33Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Templates_en_Liferay&amp;diff=6910</id>
		<title>Templates en Liferay</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Templates_en_Liferay&amp;diff=6910"/>
				<updated>2013-08-13T11:44:02Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Acceder al valor de una property desde un template */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Los templates nos indican cómo se va a renderizar una determinada estructura. Liferay soporta varias formas de definirlos, y en este caso usaremos [http://velocity.apache.org/ Apache Velocity]. &lt;br /&gt;
&lt;br /&gt;
==Acceder al valor de una property desde un template==&lt;br /&gt;
&lt;br /&gt;
Liferay nos define ciertas variables a las cuales podemos acceder desde un template. Podemos encontrar un listado en la [http://www.liferay.com/es/community/wiki/-/wiki/Main/Access+Objects+from+Velocity documentación oficial]. Una de ellas es propsUtil, que nos dará acceso a las properties que necesitamos:&lt;br /&gt;
 #set($nuestraVariable= $propsUtil.get(&amp;quot;nombre.de.la.property&amp;quot;))&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Templates_en_Liferay&amp;diff=6909</id>
		<title>Templates en Liferay</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Templates_en_Liferay&amp;diff=6909"/>
				<updated>2013-08-13T11:42:40Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Acceder al valor de una property desde un template */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Los templates nos indican cómo se va a renderizar una determinada estructura. Liferay soporta varias formas de definirlos, y en este caso usaremos [http://velocity.apache.org/ Apache Velocity]. &lt;br /&gt;
&lt;br /&gt;
==Acceder al valor de una property desde un template==&lt;br /&gt;
&lt;br /&gt;
Liferay nos define ciertas variables a las cuales podemos acceder desde un template. La documentación oficial nos brinda un [http://www.liferay.com/es/community/wiki/-/wiki/Main/Access+Objects+from+Velocity listado]. Una de ellas es propsUtil, que nos dará acceso a las properties que necesitamos:&lt;br /&gt;
 #set($nuestraVariable= $propsUtil.get(&amp;quot;nombre.de.la.property&amp;quot;))&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Templates_en_Liferay&amp;diff=6908</id>
		<title>Templates en Liferay</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Templates_en_Liferay&amp;diff=6908"/>
				<updated>2013-08-13T11:40:00Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Los templates nos indican cómo se va a renderizar una determinada estructura. Liferay soporta varias formas de definirlos, y en este caso usaremos [http://velocity.apache.org/ Apache Velocity]. &lt;br /&gt;
&lt;br /&gt;
==Acceder al valor de una property desde un template==&lt;br /&gt;
&lt;br /&gt;
Liferay nos define ciertas variables a las cuales podemos acceder desde un template. Una de ellas es propsUtil, que nos dará acceso a las properties que necesitamos:&lt;br /&gt;
 #set($nuestraVariable= $propsUtil.get(&amp;quot;nombre.de.la.property&amp;quot;))&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Templates_en_Liferay&amp;diff=6907</id>
		<title>Templates en Liferay</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Templates_en_Liferay&amp;diff=6907"/>
				<updated>2013-08-13T11:38:57Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: Página creada con 'Los templates nos indican cómo se va a renderizar una determinada estructura. Liferay soporta varias formas de definirlos, y en este caso usaremos [http://velocity.apache.org/ …'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Los templates nos indican cómo se va a renderizar una determinada estructura. Liferay soporta varias formas de definirlos, y en este caso usaremos [http://velocity.apache.org/ Apache Velocity]. &lt;br /&gt;
&lt;br /&gt;
Acceder al valor de una property desde un template:&lt;br /&gt;
&lt;br /&gt;
Liferay nos define ciertas variables a las cuales podemos acceder desde un template. Una de ellas es propsUtil, que nos dará acceso a las properties que necesitamos:&lt;br /&gt;
 #set($nuestraVariable= $propsUtil.get(&amp;quot;nombre.de.la.property&amp;quot;))&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Liferay_Portal&amp;diff=6906</id>
		<title>Liferay Portal</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Liferay_Portal&amp;diff=6906"/>
				<updated>2013-08-13T11:31:56Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Ver también */&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;
* [[Dynamic Query en Liferay]]&lt;br /&gt;
* [[Ejecuciones automaticas en Liferay]]&lt;br /&gt;
* [[Maven en Liferay]]&lt;br /&gt;
* [[Hooks en Liferay]]&lt;br /&gt;
* [[Internacionalizar un texto dentro de un theme en Liferay]]&lt;br /&gt;
* [[Hacer un layout responsive con bootstrap en Liferay]]&lt;br /&gt;
* [[Configurar el editor de texto html (CKEditor) en Liferay]]&lt;br /&gt;
* [[Custom Fields en Liferay]]&lt;br /&gt;
* [[Compatibilidades CSS en Internet Explorer]]&lt;br /&gt;
* [[Botones Redes Sociales]]&lt;br /&gt;
* [[JSON Service API en Liferay]]&lt;br /&gt;
* [[Templates en Liferay]]&lt;br /&gt;
&lt;br /&gt;
== Componentes ==&lt;br /&gt;
* [[Carrusel con limite en Liferay]]&lt;br /&gt;
* [[Encuesta con estilos propios en Liferay]]&lt;br /&gt;
* [[Embeber un portlet dentro de un theme en Liferay]]&lt;br /&gt;
* [[Tooltip de ayuda para un componente en Liferay]]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Liferay_Portal&amp;diff=6905</id>
		<title>Liferay Portal</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Liferay_Portal&amp;diff=6905"/>
				<updated>2013-08-13T11:19:19Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Ver también */&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;
* [[Dynamic Query en Liferay]]&lt;br /&gt;
* [[Ejecuciones automaticas en Liferay]]&lt;br /&gt;
* [[Maven en Liferay]]&lt;br /&gt;
* [[Hooks en Liferay]]&lt;br /&gt;
* [[Internacionalizar un texto dentro de un theme en Liferay]]&lt;br /&gt;
* [[Hacer un layout responsive con bootstrap en Liferay]]&lt;br /&gt;
* [[Configurar el editor de texto html (CKEditor) en Liferay]]&lt;br /&gt;
* [[Custom Fields en Liferay]]&lt;br /&gt;
* [[Compatibilidades CSS en Internet Explorer]]&lt;br /&gt;
* [[Botones Redes Sociales]]&lt;br /&gt;
* [[JSON Service API en Liferay]]&lt;br /&gt;
* [[Acceder a properties desde un template en Liferay]]&lt;br /&gt;
&lt;br /&gt;
== Componentes ==&lt;br /&gt;
* [[Carrusel con limite en Liferay]]&lt;br /&gt;
* [[Encuesta con estilos propios en Liferay]]&lt;br /&gt;
* [[Embeber un portlet dentro de un theme en Liferay]]&lt;br /&gt;
* [[Tooltip de ayuda para un componente en Liferay]]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Liferay_Portal&amp;diff=6903</id>
		<title>Liferay Portal</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Liferay_Portal&amp;diff=6903"/>
				<updated>2013-08-12T19:33:10Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Ver también */&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;
* [[Dynamic Query en Liferay]]&lt;br /&gt;
* [[Ejecuciones automaticas en Liferay]]&lt;br /&gt;
* [[Maven en Liferay]]&lt;br /&gt;
* [[Hooks en Liferay]]&lt;br /&gt;
* [[Internacionalizar un texto dentro de un theme en Liferay]]&lt;br /&gt;
* [[Hacer un layout responsive con bootstrap en Liferay]]&lt;br /&gt;
* [[Configurar el editor de texto html (CKEditor) en Liferay]]&lt;br /&gt;
* [[Custom Fields en Liferay]]&lt;br /&gt;
* [[Compatibilidades CSS en Internet Explorer]]&lt;br /&gt;
* [[Botones Redes Sociales]]&lt;br /&gt;
* [[JSON Service API en Liferay]]&lt;br /&gt;
* [[Acceder a properies desde un template en Liferay]]&lt;br /&gt;
&lt;br /&gt;
== Componentes ==&lt;br /&gt;
* [[Carrusel con limite en Liferay]]&lt;br /&gt;
* [[Encuesta con estilos propios en Liferay]]&lt;br /&gt;
* [[Embeber un portlet dentro de un theme en Liferay]]&lt;br /&gt;
* [[Tooltip de ayuda para un componente en Liferay]]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Hooks_en_Liferay&amp;diff=6863</id>
		<title>Hooks en Liferay</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Hooks_en_Liferay&amp;diff=6863"/>
				<updated>2013-07-23T19:56:38Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Hook de Asset Publisher */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Qué es un Hook? ==&lt;br /&gt;
Es una extensión de un componente de Liferay, es decir, tomar un componente que ya posee y sobreescribir ciertas cosas para adecuarlo a nuestras necesidades.&lt;br /&gt;
&lt;br /&gt;
== ¿Cómo creo un Hook? ==&lt;br /&gt;
Para crear un hook podemos utilizar el arquetipo de maven '''liferay-hook-archetype'''&lt;br /&gt;
&lt;br /&gt;
==Hook de Asset Publisher==&lt;br /&gt;
Un asset publisher nos muestra publicaciones que va recolectando de distintas páginas del sitio. Tiene por default 4 formas de mostrarse:&lt;br /&gt;
* table&lt;br /&gt;
* title-list&lt;br /&gt;
* abstracts&lt;br /&gt;
* full-content&lt;br /&gt;
&lt;br /&gt;
En este caso, supongamos que ninguna de estas formas nos resultan adecuadas, y que queremos mostrarlo de alguna otra manera. Para esto, debemos realizar lo siguiente:&lt;br /&gt;
&lt;br /&gt;
* Crear el hook con el arquetipo de Maven.&lt;br /&gt;
* En la estructura del proyecto, crear un nuevo JSP en  WEB-INF/jsp/html/portlet/asset_publisher/display/nuestraVista.jsp&lt;br /&gt;
&lt;br /&gt;
* Esta implementación utiliza clases de Liferay para obtener los valores a mostrar (en este caso título, descripción y un link):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;%@ include file=&amp;quot;/html/portlet/asset_publisher/init.jsp&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;%&lt;br /&gt;
    List results = (List) request.getAttribute(&amp;quot;view.jsp-results&amp;quot;);&lt;br /&gt;
    int assetEntryIndex = ((Integer) request.getAttribute(&amp;quot;view.jsp-assetEntryIndex&amp;quot;)).intValue();&lt;br /&gt;
    AssetEntry assetEntry = (AssetEntry) request.getAttribute(&amp;quot;view.jsp-assetEntry&amp;quot;);&lt;br /&gt;
    AssetRendererFactory assetRendererFactory = (AssetRendererFactory) request.getAttribute(&amp;quot;view.jsp-assetRendererFactory&amp;quot;);&lt;br /&gt;
    AssetRenderer assetRenderer = (AssetRenderer) request.getAttribute(&amp;quot;view.jsp-assetRenderer&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    boolean show = ((Boolean) request.getAttribute(&amp;quot;view.jsp-show&amp;quot;)).booleanValue();&lt;br /&gt;
&lt;br /&gt;
    request.setAttribute(&amp;quot;view.jsp-showIconLabel&amp;quot;, true);&lt;br /&gt;
&lt;br /&gt;
    String title = (String) request.getAttribute(&amp;quot;view.jsp-title&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if (Validator.isNull(title)) {&lt;br /&gt;
        title = assetRenderer.getTitle(locale);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    PortletURL viewFullContentURL = renderResponse.createRenderURL();&lt;br /&gt;
&lt;br /&gt;
    viewFullContentURL.setParameter(&amp;quot;struts_action&amp;quot;, &amp;quot;/asset_publisher/view_content&amp;quot;);&lt;br /&gt;
    viewFullContentURL.setParameter(&amp;quot;assetEntryId&amp;quot;, String.valueOf(assetEntry.getEntryId()));&lt;br /&gt;
    viewFullContentURL.setParameter(&amp;quot;type&amp;quot;, assetRendererFactory.getType());&lt;br /&gt;
&lt;br /&gt;
    if (Validator.isNotNull(assetRenderer.getUrlTitle())) {&lt;br /&gt;
        if (assetRenderer.getGroupId() != scopeGroupId) {&lt;br /&gt;
            viewFullContentURL.setParameter(&amp;quot;groupId&amp;quot;, String.valueOf(assetRenderer.getGroupId()));&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        viewFullContentURL.setParameter(&amp;quot;urlTitle&amp;quot;, assetRenderer.getUrlTitle());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    String summary = StringUtil.shorten(assetRenderer.getSummary(locale), abstractLength);&lt;br /&gt;
&lt;br /&gt;
    String viewURL = null;&lt;br /&gt;
&lt;br /&gt;
    if (viewInContext) {&lt;br /&gt;
        String viewFullContentURLString = viewFullContentURL.toString();&lt;br /&gt;
&lt;br /&gt;
        viewFullContentURLString = HttpUtil.setParameter(viewFullContentURLString, &amp;quot;redirect&amp;quot;, currentURL);&lt;br /&gt;
&lt;br /&gt;
        viewURL = assetRenderer.getURLViewInContext(liferayPortletRequest, liferayPortletResponse, viewFullContentURLString);&lt;br /&gt;
&lt;br /&gt;
        viewURL = HttpUtil.setParameter(viewURL, &amp;quot;redirect&amp;quot;, currentURL);&lt;br /&gt;
    } else {&lt;br /&gt;
        viewURL = viewFullContentURL.toString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (Validator.isNull(viewURL)) {&lt;br /&gt;
        viewURL = viewFullContentURL.toString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    String viewURLMessage = viewInContext ? assetRenderer.getViewInContextMessage() : &amp;quot;read-more-x-about-x&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    viewURL = _checkViewURL(viewURL, currentURL, themeDisplay);&lt;br /&gt;
%&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;%if (assetEntryIndex == 0) {%&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;noticias&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;ul id=&amp;quot;aui_3_4_0_1_522&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;%}%&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&lt;br /&gt;
					&amp;lt;span&amp;gt;&amp;lt;%= title%&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
					&amp;lt;div&amp;gt;&lt;br /&gt;
						&amp;lt;p&amp;gt;&amp;lt;%= summary%&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
						&amp;lt;a href='&amp;lt;%=viewURL%&amp;gt;'&amp;gt;Leer mas&amp;lt;/a&amp;gt;&lt;br /&gt;
					&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;/li&amp;gt;&lt;br /&gt;
				&amp;lt;%if (assetEntryIndex == results.size()-1) {%&amp;gt;&lt;br /&gt;
			&amp;lt;/ul&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;%}%&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Hooks_en_Liferay&amp;diff=6862</id>
		<title>Hooks en Liferay</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Hooks_en_Liferay&amp;diff=6862"/>
				<updated>2013-07-23T19:38:28Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: Página creada con '==Qué es un Hook? == Es una extensión de un componente de Liferay, es decir, tomar un componente que ya posee y sobreescribir ciertas cosas para adecuarlo a nuestras necesidad…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Qué es un Hook? ==&lt;br /&gt;
Es una extensión de un componente de Liferay, es decir, tomar un componente que ya posee y sobreescribir ciertas cosas para adecuarlo a nuestras necesidades.&lt;br /&gt;
&lt;br /&gt;
== ¿Cómo creo un Hook? ==&lt;br /&gt;
Para crear un hook podemos utilizar el arquetipo de maven '''liferay-hook-archetype'''&lt;br /&gt;
&lt;br /&gt;
==Hook de Asset Publisher==&lt;br /&gt;
Un asset publisher nos muestra publicaciones que va recolectando de distintas páginas del sitio. Tiene por default 4 formas de mostrarse:&lt;br /&gt;
* table&lt;br /&gt;
* title-list&lt;br /&gt;
* abstracts&lt;br /&gt;
* full-content&lt;br /&gt;
&lt;br /&gt;
En este caso, supongamos que ninguna de estas formas nos resultan adecuadas, y que queremos mostrarlo de alguna otra manera. Para esto, debemos realizar lo siguiente:&lt;br /&gt;
&lt;br /&gt;
* Crear el hook con el arquetipo de Maven.&lt;br /&gt;
* En la estructura del proyecto, crear un nuevo JSP en  WEB-INF/jsp/html/portlet/asset_publisher/display/nuestraVista.jsp&lt;br /&gt;
&lt;br /&gt;
* Una posible implementación de dicho jsp es esta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;%@ include file=&amp;quot;/html/portlet/asset_publisher/init.jsp&amp;quot; %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;%&lt;br /&gt;
    List results = (List) request.getAttribute(&amp;quot;view.jsp-results&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    int assetEntryIndex = ((Integer) request.getAttribute(&amp;quot;view.jsp-assetEntryIndex&amp;quot;)).intValue();&lt;br /&gt;
&lt;br /&gt;
    AssetEntry assetEntry = (AssetEntry) request.getAttribute(&amp;quot;view.jsp-assetEntry&amp;quot;);&lt;br /&gt;
    AssetRendererFactory assetRendererFactory = (AssetRendererFactory) request.getAttribute(&amp;quot;view.jsp-assetRendererFactory&amp;quot;);&lt;br /&gt;
    AssetRenderer assetRenderer = (AssetRenderer) request.getAttribute(&amp;quot;view.jsp-assetRenderer&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    boolean show = ((Boolean) request.getAttribute(&amp;quot;view.jsp-show&amp;quot;)).booleanValue();&lt;br /&gt;
&lt;br /&gt;
    request.setAttribute(&amp;quot;view.jsp-showIconLabel&amp;quot;, true);&lt;br /&gt;
&lt;br /&gt;
    String title = (String) request.getAttribute(&amp;quot;view.jsp-title&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if (Validator.isNull(title)) {&lt;br /&gt;
        title = assetRenderer.getTitle(locale);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    PortletURL viewFullContentURL = renderResponse.createRenderURL();&lt;br /&gt;
&lt;br /&gt;
    viewFullContentURL.setParameter(&amp;quot;struts_action&amp;quot;, &amp;quot;/asset_publisher/view_content&amp;quot;);&lt;br /&gt;
    viewFullContentURL.setParameter(&amp;quot;assetEntryId&amp;quot;, String.valueOf(assetEntry.getEntryId()));&lt;br /&gt;
    viewFullContentURL.setParameter(&amp;quot;type&amp;quot;, assetRendererFactory.getType());&lt;br /&gt;
&lt;br /&gt;
    if (Validator.isNotNull(assetRenderer.getUrlTitle())) {&lt;br /&gt;
        if (assetRenderer.getGroupId() != scopeGroupId) {&lt;br /&gt;
            viewFullContentURL.setParameter(&amp;quot;groupId&amp;quot;, String.valueOf(assetRenderer.getGroupId()));&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        viewFullContentURL.setParameter(&amp;quot;urlTitle&amp;quot;, assetRenderer.getUrlTitle());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    String summary = StringUtil.shorten(assetRenderer.getSummary(locale), abstractLength);&lt;br /&gt;
&lt;br /&gt;
    String viewURL = null;&lt;br /&gt;
&lt;br /&gt;
    if (viewInContext) {&lt;br /&gt;
        String viewFullContentURLString = viewFullContentURL.toString();&lt;br /&gt;
&lt;br /&gt;
        viewFullContentURLString = HttpUtil.setParameter(viewFullContentURLString, &amp;quot;redirect&amp;quot;, currentURL);&lt;br /&gt;
&lt;br /&gt;
        viewURL = assetRenderer.getURLViewInContext(liferayPortletRequest, liferayPortletResponse, viewFullContentURLString);&lt;br /&gt;
&lt;br /&gt;
        viewURL = HttpUtil.setParameter(viewURL, &amp;quot;redirect&amp;quot;, currentURL);&lt;br /&gt;
    } else {&lt;br /&gt;
        viewURL = viewFullContentURL.toString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (Validator.isNull(viewURL)) {&lt;br /&gt;
        viewURL = viewFullContentURL.toString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    String viewURLMessage = viewInContext ? assetRenderer.getViewInContextMessage() : &amp;quot;read-more-x-about-x&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    viewURL = _checkViewURL(viewURL, currentURL, themeDisplay);&lt;br /&gt;
%&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;%if (assetEntryIndex == 0) {%&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;div class=&amp;quot;noticias&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;ul id=&amp;quot;aui_3_4_0_1_522&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
				&amp;lt;%}%&amp;gt;&lt;br /&gt;
&lt;br /&gt;
				&amp;lt;li&amp;gt;&lt;br /&gt;
					&amp;lt;span&amp;gt;&amp;lt;%= title%&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
					&amp;lt;div&amp;gt;&lt;br /&gt;
						&amp;lt;p&amp;gt;&amp;lt;%= summary%&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
						&amp;lt;a href='&amp;lt;%=viewURL%&amp;gt;'&amp;gt;Leer mas&amp;lt;/a&amp;gt;&lt;br /&gt;
					&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				&amp;lt;%if (assetEntryIndex == results.size()-1) {%&amp;gt;&lt;br /&gt;
			&amp;lt;/ul&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;%}%&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Esta implementación utiliza clases de Liferay para obtener los valores a mostrar (en este caso título, descripción y un link)&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Liferay_Portal&amp;diff=6850</id>
		<title>Liferay Portal</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Liferay_Portal&amp;diff=6850"/>
				<updated>2013-07-23T14:30:39Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Ver también */&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;
* [[Dynamic Query en Liferay]]&lt;br /&gt;
* [[Ejecuciones automaticas en Liferay]]&lt;br /&gt;
* [[Maven en Liferay]]&lt;br /&gt;
* [[Hooks en Liferay]]&lt;br /&gt;
&lt;br /&gt;
== Componentes ==&lt;br /&gt;
* [[Carrusel con limite en Liferay]]&lt;br /&gt;
* [[Encuesta con estilos propios en Liferay]]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Maven_en_Liferay&amp;diff=6849</id>
		<title>Maven en Liferay</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Maven_en_Liferay&amp;diff=6849"/>
				<updated>2013-07-23T13:34:15Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: Página creada con 'Para crear un nuevo proyecto para Liferay usando Maven podemos utilizar ciertos arquetipos predefinidos:  -liferay-ext-archetype  -liferay-hook-archetype  -liferay-layouttpl-arc…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Para crear un nuevo proyecto para Liferay usando Maven podemos utilizar ciertos arquetipos predefinidos:&lt;br /&gt;
&lt;br /&gt;
-liferay-ext-archetype&lt;br /&gt;
&lt;br /&gt;
-liferay-hook-archetype&lt;br /&gt;
&lt;br /&gt;
-liferay-layouttpl-archetype&lt;br /&gt;
&lt;br /&gt;
-liferay-portlet-archetype&lt;br /&gt;
&lt;br /&gt;
-liferay-portlet-icefaces-archetype&lt;br /&gt;
&lt;br /&gt;
-liferay-portlet-jsf-archetype&lt;br /&gt;
&lt;br /&gt;
-liferay-portlet-liferay-faces-alloy-archetype&lt;br /&gt;
&lt;br /&gt;
-liferay-portlet-primefaces-archetype&lt;br /&gt;
&lt;br /&gt;
-liferay-portlet-richfaces-archetype&lt;br /&gt;
&lt;br /&gt;
-liferay-servicebuilder-archetype&lt;br /&gt;
&lt;br /&gt;
-liferay-theme-archetype&lt;br /&gt;
&lt;br /&gt;
-liferay-web-archetype &lt;br /&gt;
&lt;br /&gt;
Una vez que generamos el proyecto, debemos agregar al pom.xml la siguiente property:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;properties&amp;gt;&lt;br /&gt;
 &amp;lt;liferay.version&amp;gt;$version&amp;lt;/liferay.version&amp;gt;&lt;br /&gt;
 &amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donde $version es la version de liferay. Ej. 6.1.1&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Liferay_Portal&amp;diff=6848</id>
		<title>Liferay Portal</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Liferay_Portal&amp;diff=6848"/>
				<updated>2013-07-23T13:28:45Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Ver también */&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;
* [[Dynamic Query en Liferay]]&lt;br /&gt;
* [[Ejecuciones automaticas en Liferay]]&lt;br /&gt;
* [[Maven en Liferay]]&lt;br /&gt;
&lt;br /&gt;
== Componentes ==&lt;br /&gt;
* [[Carrusel con limite en Liferay]]&lt;br /&gt;
* [[Encuesta con estilos propios en Liferay]]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Ejecuciones_automaticas_en_Liferay&amp;diff=6847</id>
		<title>Ejecuciones automaticas en Liferay</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Ejecuciones_automaticas_en_Liferay&amp;diff=6847"/>
				<updated>2013-07-23T13:06:00Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Crear una tarea automática (CRON) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Crear una tarea automática (CRON)===&lt;br /&gt;
&lt;br /&gt;
Para crear una tarea que se ejecute automáticamente vamos a valernos de un portlet que vamos a desplegar en el portal. &lt;br /&gt;
&lt;br /&gt;
*1- Configurar el CRON en el archivo liferay-portlet.xml que se encuentra en la carpeta WEB-INF de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;portlet&amp;gt;&lt;br /&gt;
   &amp;lt;portlet-name&amp;gt;NombreDelPortlet&amp;lt;/portlet-name&amp;gt;&lt;br /&gt;
   &amp;lt;icon&amp;gt;/icon.png&amp;lt;/icon&amp;gt;&lt;br /&gt;
   &amp;lt;scheduler-entry&amp;gt;&lt;br /&gt;
     &amp;lt;scheduler-description&amp;gt;descripcion&amp;lt;/scheduler-description&amp;gt;&lt;br /&gt;
     &amp;lt;scheduler-event-listener-class&amp;gt;com.MiClaseCron&amp;lt;/scheduler-event-listener-class&amp;gt; &amp;lt;!- Aca va la clase que contiene el CRON en el proyecto(con la lógica que ejecuta) -&amp;gt;&lt;br /&gt;
     &amp;lt;trigger&amp;gt; &amp;lt;!- Configuración del tiempo para que corra el CRON -&amp;gt;&lt;br /&gt;
       &amp;lt;simple-trigger-value&amp;gt;15&amp;lt;/simple-trigger-value&amp;gt; &lt;br /&gt;
       &amp;lt;time-unit&amp;gt;minute&amp;lt;/time-unit&amp;gt;&lt;br /&gt;
     &amp;lt;/trigger&amp;gt;&lt;br /&gt;
   &amp;lt;/scheduler-entry&amp;gt; &lt;br /&gt;
 &amp;lt;/portlet&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2- Creamos la clase CRON con la lógica que ejecutará (es necesario que implemente la interfaz [http://docs.liferay.com/portal/6.0/javadocs/com/liferay/portal/kernel/messaging/MessageListener.html MessageListener] de Liferay):&lt;br /&gt;
&lt;br /&gt;
 package com.MiClaseCron;&lt;br /&gt;
 import com.liferay.portal.kernel.messaging.Message;&lt;br /&gt;
 import com.liferay.portal.kernel.messaging.MessageListener;&lt;br /&gt;
 import com.liferay.portal.kernel.messaging.MessageListenerException;&lt;br /&gt;
 public class NotificacionCron implements MessageListener {&lt;br /&gt;
 public void receive(Message arg0) throws MessageListenerException {&lt;br /&gt;
 //Aca va la logica que se ejecutará.&lt;br /&gt;
 }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
''' En caso de usar Spring, tener en cuenta que el CRON al momento en que corre deberá levantar el contexto, lo cual podría traernos algún dolor de cabeza.'''.&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Ejecuciones_automaticas_en_Liferay&amp;diff=6846</id>
		<title>Ejecuciones automaticas en Liferay</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Ejecuciones_automaticas_en_Liferay&amp;diff=6846"/>
				<updated>2013-07-23T13:00:08Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: Página creada con '=== Crear una tarea automática (CRON)===  *1- Configurar el CRON en el archivo liferay-portlet.xml que se encuentra en la carpeta WEB-INF de nuestro proyecto:   &amp;lt;portlet&amp;gt;    &amp;lt;p…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Crear una tarea automática (CRON)===&lt;br /&gt;
&lt;br /&gt;
*1- Configurar el CRON en el archivo liferay-portlet.xml que se encuentra en la carpeta WEB-INF de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;portlet&amp;gt;&lt;br /&gt;
   &amp;lt;portlet-name&amp;gt;NombreDelPortlet&amp;lt;/portlet-name&amp;gt;&lt;br /&gt;
   &amp;lt;icon&amp;gt;/icon.png&amp;lt;/icon&amp;gt;&lt;br /&gt;
   &amp;lt;scheduler-entry&amp;gt;&lt;br /&gt;
     &amp;lt;scheduler-description&amp;gt;descripcion&amp;lt;/scheduler-description&amp;gt;&lt;br /&gt;
     &amp;lt;scheduler-event-listener-class&amp;gt;com.connectis.tucu.cron.NotificacionCron&amp;lt;/scheduler-event-listener-class&amp;gt; &amp;lt;!- Aca va la clase que contiene el CRON en el proyecto(con la lógica que ejecuta) -&amp;gt;&lt;br /&gt;
     &amp;lt;trigger&amp;gt; &amp;lt;!- Configuración del tiempo para que corra el CRON -&amp;gt;&lt;br /&gt;
       &amp;lt;simple-trigger-value&amp;gt;15&amp;lt;/simple-trigger-value&amp;gt; &lt;br /&gt;
       &amp;lt;time-unit&amp;gt;minute&amp;lt;/time-unit&amp;gt;&lt;br /&gt;
     &amp;lt;/trigger&amp;gt;&lt;br /&gt;
   &amp;lt;/scheduler-entry&amp;gt; &lt;br /&gt;
 &amp;lt;/portlet&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2- Creamos la clase CRON con la lógica que ejecutará (es necesario que implemente la interfaz [http://docs.liferay.com/portal/6.0/javadocs/com/liferay/portal/kernel/messaging/MessageListener.html MessageListener] de Liferay):&lt;br /&gt;
&lt;br /&gt;
 package com.connectis.tucu.cron;&lt;br /&gt;
 import com.liferay.portal.kernel.messaging.Message;&lt;br /&gt;
 import com.liferay.portal.kernel.messaging.MessageListener;&lt;br /&gt;
 import com.liferay.portal.kernel.messaging.MessageListenerException;&lt;br /&gt;
 public class NotificacionCron implements MessageListener {&lt;br /&gt;
 public void receive(Message arg0) throws MessageListenerException {&lt;br /&gt;
 //Aca va la logica que se ejecutará.&lt;br /&gt;
 }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
''' Tener en cuenta que el CRON al momento en que corre deberá levantar el contexto, esto puede traer inconvenientes al igual que las conexiones a la base de datos (nosotros optamos por cerrar la conexión cada vez que finalizamos una transacción con el CRON)'''.&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Liferay_Portal&amp;diff=6845</id>
		<title>Liferay Portal</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Liferay_Portal&amp;diff=6845"/>
				<updated>2013-07-23T12:46:59Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Ver también */&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;
* [[Dynamic Query en Liferay]]&lt;br /&gt;
* [[Ejecuciones automaticas en Liferay]]&lt;br /&gt;
&lt;br /&gt;
== Componentes ==&lt;br /&gt;
* [[Carrusel con limite en Liferay]]&lt;br /&gt;
* [[Encuesta con estilos propios en Liferay]]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=JavaScript&amp;diff=6811</id>
		<title>JavaScript</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=JavaScript&amp;diff=6811"/>
				<updated>2013-03-14T18:03:26Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Ver también */&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;br /&gt;
* [[JasmineJs]]&lt;br /&gt;
* [[Integrando JasmineJS con Ant]]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=JasmineJs&amp;diff=6810</id>
		<title>JasmineJs</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=JasmineJs&amp;diff=6810"/>
				<updated>2013-03-14T18:00:18Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Jasmine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introducción ==&lt;br /&gt;
&lt;br /&gt;
=== Objetivo: ===&lt;br /&gt;
&lt;br /&gt;
* Testear el código Javascript de nuestra aplicación web.&lt;br /&gt;
&lt;br /&gt;
=== Herramientas a usar ===&lt;br /&gt;
&lt;br /&gt;
* jasmine&lt;br /&gt;
* jasmine-fakeAjax&lt;br /&gt;
* jasmine-jQuery&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Jasmine ==&lt;br /&gt;
Es un framework de desarrollo para testear código Javascript.  La configuración mínima necesaria es:&lt;br /&gt;
&lt;br /&gt;
* Dependencias de Jasmine&lt;br /&gt;
* Un archivo html donde correrán los test&lt;br /&gt;
* Archivos JS productivos&lt;br /&gt;
* Archivos JS con nuestros tests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de las dependencias de jasmine, encontramos los archivos:&lt;br /&gt;
* jasmine.css&lt;br /&gt;
* jasmine.js&lt;br /&gt;
* jasmine-html.js&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En el html se visualizarán los resultados de los test desarrollados. A continuación, la estructura de dicho html:&lt;br /&gt;
&amp;lt;code lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;!DOCTYPE HTML PUBLIC &amp;quot;-//W3C//DTD HTML 4.01 Transitional//EN&amp;quot;&lt;br /&gt;
    &amp;quot;http://www.w3.org/TR/html4/loose.dtd&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;/title&amp;gt;&lt;br /&gt;
        &amp;lt;!--        dependencias de jasmine--&amp;gt;&lt;br /&gt;
        &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;lib/jasmine/jasmine.css&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jasmine/jasmine.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jasmine/jasmine-html.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--        dependencias de nuestros tests--&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jquery-1.9.0.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/underscore-1.1.7-min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jasmine-jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;view/preLoadFixtures.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jasmine-fake-ajax.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--        dependencias de nuestro codigo productivo--&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;bienvenido.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--        nuestros archivos con los specs--&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;bienvenidoTest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
            //            agregamos el reporte de tests y lo ejecutamos&lt;br /&gt;
            jasmine.getEnv().addReporter( new jasmine.TrivialReporter());&lt;br /&gt;
            jasmine.getEnv().execute();&lt;br /&gt;
        &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podemos visualizar que el html además de contener las configuración básica para correr test con jasmine, contiene librerias que nos ayudan a desarrollar test de mayor calidad. Estas las podemos visualizar dentro del bloque &amp;quot;dependencias de nuestros tests&amp;quot; y se explicarán luego.&lt;br /&gt;
&lt;br /&gt;
En Jasmine los tests tienen la siguiente estructura:&lt;br /&gt;
&lt;br /&gt;
* '''Describe''': es una función que recibe como parámetros un string con un nombre que identifica a un conjunto de casos de test, y una función, que contiene 1 o más sentencias “it”&lt;br /&gt;
** '''it''': es cada caso posible para nuestro test. También conserva la misma forma de un describe: una función que recibe dos parámetros: un string con su descripción, y una función con nuestro caso de test, que contiene 1 o más “expect”&lt;br /&gt;
*** '''expect''': es una función que recibe como parámetro un valor “real”; y se encadena a una función “matcher”, la cual lleva como parámetro el valor esperado. Para ser más concretos, quedaría: expect(valorReal).toBe(valorEsperado);  donde “toBe” es una de las posibles funciones matcher.&lt;br /&gt;
**** '''matcher''': es una comparación entre un valor real y uno esperado. Se los puede negar encadenando la función “not” delante de ellos. Tenemos matchers incluidos por Jasmine, y también podemos definir más nosotros.&lt;br /&gt;
&lt;br /&gt;
Vamos a ejemplificar con un test dummy:&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
describe(&amp;quot;este es un test dummy&amp;quot;, function() {&lt;br /&gt;
it(&amp;quot;y este es un caso de test&amp;quot;, function() {&lt;br /&gt;
  expect(true).toBe(true);&lt;br /&gt;
  expect(false).not.toBe(true);&lt;br /&gt;
});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observen que en el caso anterior la función '''expect''' nos retorna un objeto, del cual utilizamos el atributo '''not''' y de él, su  matcher '''toBe''', para negar el resultado de este último.&lt;br /&gt;
&lt;br /&gt;
Vamos con un ejemplo en el cual yo quiero tener un objeto &amp;quot;persona&amp;quot;, que tenga un atributo &amp;quot;saludar&amp;quot;, el cual al invocarlo me retorne &amp;quot;hola&amp;quot;. El test nos quedaría así:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
describe(&amp;quot;persona.saludar&amp;quot;,function(){&lt;br /&gt;
	&lt;br /&gt;
	it(&amp;quot;deberia retornar hola&amp;quot;, function(){&lt;br /&gt;
		var saludo = persona.saludar();&lt;br /&gt;
		expect(saludo).toEqual(&amp;quot;hola&amp;quot;);&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les propongo que antes de leer las líneas siguientes, ejecuten los tests e intenten interpretar los errores que nos lanza Jasmine.  Pueden descargar este [https://frameworks-test-javascript.googlecode.com/svn/trunk/jasmine-minConfig  proyecto de prueba] donde encontrarán un holaMundo.&lt;br /&gt;
&lt;br /&gt;
¿Qué pasa si quiero hacer algo antes de cada Test?&lt;br /&gt;
Bueno, para eso usamos ''beforeEach'' y ''afterEach''. El código que pongamos dentro de estas funciones, serán llamados antes y después de cada ''it'', respectivamente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
describe('beforeEach', function(){&lt;br /&gt;
   beforeEach(function(){&lt;br /&gt;
       // Antes de cada caso de prueba se carga un archivo html.&lt;br /&gt;
       jasmine.getFixtures().load(&amp;quot;persona/prueba.html&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
   it('Caso prueba', function(){&lt;br /&gt;
       // Test&lt;br /&gt;
   });    &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Fake Ajax ==&lt;br /&gt;
Jasmine-fakeAjax nos permite crear interceptores de urls, y enviar datos dummy en las mismas cuando son ejecutadas desde JQuery.ajax();&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
describe('Test FakeAjax', function() {&lt;br /&gt;
   it('La data que devolvio la llamada ajax es igual al del fake', function() {&lt;br /&gt;
       var mensaje;&lt;br /&gt;
       // Registramos el fake ajax.&lt;br /&gt;
       registerFakeAjax({url: '/prueba', successData: 'Prueba exitosa'});&lt;br /&gt;
       // Hacemos la llamada ajax.&lt;br /&gt;
       $.get('/prueba', function(data) {&lt;br /&gt;
           mensaje= data&lt;br /&gt;
       });&lt;br /&gt;
       // Comprobamos que nos hay llegado lo que definimos en el fake&lt;br /&gt;
       expect(mensaje).toEqual('Prueba exitosa')&lt;br /&gt;
   })&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Fixtures ==&lt;br /&gt;
Usamos la libreria Jasmine-jQuery para testear los JS que interactúan con nuestro html, la misma nos provee matchers de jquery, y nos permite manejar: CSS, HTML y JSON en nuestros specs. También nos permite armar un &amp;quot;esqueleto&amp;quot; de la página en la que va a ejecutar nuestro código JS. Esto lo logra mediante un elemento que buscaremos mediante el id &amp;quot;sandbox&amp;quot;, y al cual le agregaremos nuestro código html, estilos, etc. &lt;br /&gt;
Ahora bien, cuando hay varios casos de test en los que debemos utilizar el mismo html, se vuelve tedioso tener que copiar este código a lo largo de todos los archivos. Para solucionar este problema, el módulo fixture de esta librería nos permite cargar archivos HTML en nuestros test.&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo''':&lt;br /&gt;
Tenemos un archivo llamado pruebaFixture.html que contiene:&lt;br /&gt;
&amp;lt;code lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;prueba&amp;quot; style=&amp;quot;display:none;&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se setea el path en donde estaran los fixtures, por defecto es “spec/javascripts/fixtures”&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
jasmine.getFixtures().fixturesPath = './fixtures';&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se levanta el HTML con la función load.&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
jasmine.getFixtures().load(&amp;quot;pruebaFixture.html&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El test que comprueba que el div este oculto.&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
it(&amp;quot;El input id debe estar oculto&amp;quot;,function(){&lt;br /&gt;
      var div = $(&amp;quot;#prueba&amp;quot;);&lt;br /&gt;
      expect(div).toBeHidden();&lt;br /&gt;
    });  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este test comprueba que el elemento #prueba sea un div.&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
it(&amp;quot;El elemento es un div&amp;quot;,function(){&lt;br /&gt;
      var div = $(&amp;quot;#prueba&amp;quot;);&lt;br /&gt;
      expect(div).toBe('div');&lt;br /&gt;
    });  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Algo para tener en cuenta es que debemos cargar los fixtures en memoria antes de cargar la librería fake ajax por un conflicto entre las librerías. Es decir, deberá existir un archivo que precargue los fixtures antes de cargar la librería fake ajax, como se muestra en el archivo preLoadFixtures.js&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
jasmine.getFixtures().fixturesPath = './fixtures';&lt;br /&gt;
jasmine.getFixtures().preload(&amp;quot;fixture1.html&amp;quot;,&amp;quot;fixture2.html&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y luego, al cargar el archivo html, se deberá cargar el archivo preLoadFixtures.js antes del archivo de la librería de fake ajax. &lt;br /&gt;
Una vez cargados los fixtures en memoria, los mismos se cargarán de la misma manera mencionada al comienzo de la sección mediante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
jasmine.getFixtures().load(&amp;quot;fixture1.html&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fuentes / Más info en &lt;br /&gt;
&lt;br /&gt;
[http://pivotal.github.com/jasmine/ Jasmine]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/velesin/jasmine-jquery Repositorio de jasmine-jquery]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mileskin/jasmine-fake-ajax Repositorio de jasmine-fake-ajax]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=JasmineJs&amp;diff=6809</id>
		<title>JasmineJs</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=JasmineJs&amp;diff=6809"/>
				<updated>2013-03-14T17:59:16Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introducción ==&lt;br /&gt;
&lt;br /&gt;
=== Objetivo: ===&lt;br /&gt;
&lt;br /&gt;
* Testear el código Javascript de nuestra aplicación web.&lt;br /&gt;
&lt;br /&gt;
=== Herramientas a usar ===&lt;br /&gt;
&lt;br /&gt;
* jasmine&lt;br /&gt;
* jasmine-fakeAjax&lt;br /&gt;
* jasmine-jQuery&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Jasmine ==&lt;br /&gt;
Es un framework de desarrollo para testear código Javascript.  La configuración mínima necesaria es:&lt;br /&gt;
&lt;br /&gt;
* Dependencias de Jasmine&lt;br /&gt;
* Un archivo html donde correrán los test&lt;br /&gt;
* Archivos JS productivos&lt;br /&gt;
* Archivos JS con nuestros tests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de las dependencias de jasmine, encontramos los archivos:&lt;br /&gt;
* jasmine.css&lt;br /&gt;
* jasmine.js&lt;br /&gt;
* jasmine-html.js&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Descargar las [http://pivotal.github.com/jasmine/ dependencias de jasmine]&lt;br /&gt;
&lt;br /&gt;
En el html se visualizarán los resultados de los test desarrollados. A continuación, la estructura de dicho html:&lt;br /&gt;
&amp;lt;code lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;!DOCTYPE HTML PUBLIC &amp;quot;-//W3C//DTD HTML 4.01 Transitional//EN&amp;quot;&lt;br /&gt;
    &amp;quot;http://www.w3.org/TR/html4/loose.dtd&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;/title&amp;gt;&lt;br /&gt;
        &amp;lt;!--        dependencias de jasmine--&amp;gt;&lt;br /&gt;
        &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;lib/jasmine/jasmine.css&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jasmine/jasmine.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jasmine/jasmine-html.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--        dependencias de nuestros tests--&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jquery-1.9.0.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/underscore-1.1.7-min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jasmine-jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;view/preLoadFixtures.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jasmine-fake-ajax.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--        dependencias de nuestro codigo productivo--&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;bienvenido.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--        nuestros archivos con los specs--&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;bienvenidoTest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
            //            agregamos el reporte de tests y lo ejecutamos&lt;br /&gt;
            jasmine.getEnv().addReporter( new jasmine.TrivialReporter());&lt;br /&gt;
            jasmine.getEnv().execute();&lt;br /&gt;
        &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podemos visualizar que el html además de contener las configuración básica para correr test con jasmine, contiene librerias que nos ayudan a desarrollar test de mayor calidad. Estas las podemos visualizar dentro del bloque &amp;quot;dependencias de nuestros tests&amp;quot; y se explicarán luego.&lt;br /&gt;
&lt;br /&gt;
En Jasmine los tests tienen la siguiente estructura:&lt;br /&gt;
&lt;br /&gt;
* '''Describe''': es una función que recibe como parámetros un string con un nombre que identifica a un conjunto de casos de test, y una función, que contiene 1 o más sentencias “it”&lt;br /&gt;
** '''it''': es cada caso posible para nuestro test. También conserva la misma forma de un describe: una función que recibe dos parámetros: un string con su descripción, y una función con nuestro caso de test, que contiene 1 o más “expect”&lt;br /&gt;
*** '''expect''': es una función que recibe como parámetro un valor “real”; y se encadena a una función “matcher”, la cual lleva como parámetro el valor esperado. Para ser más concretos, quedaría: expect(valorReal).toBe(valorEsperado);  donde “toBe” es una de las posibles funciones matcher.&lt;br /&gt;
**** '''matcher''': es una comparación entre un valor real y uno esperado. Se los puede negar encadenando la función “not” delante de ellos. Tenemos matchers incluidos por Jasmine, y también podemos definir más nosotros.&lt;br /&gt;
&lt;br /&gt;
Vamos a ejemplificar con un test dummy:&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
describe(&amp;quot;este es un test dummy&amp;quot;, function() {&lt;br /&gt;
it(&amp;quot;y este es un caso de test&amp;quot;, function() {&lt;br /&gt;
  expect(true).toBe(true);&lt;br /&gt;
  expect(false).not.toBe(true);&lt;br /&gt;
});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observen que en el caso anterior la función '''expect''' nos retorna un objeto, del cual utilizamos el atributo '''not''' y de él, su  matcher '''toBe''', para negar el resultado de este último.&lt;br /&gt;
&lt;br /&gt;
Vamos con un ejemplo en el cual yo quiero tener un objeto &amp;quot;persona&amp;quot;, que tenga un atributo &amp;quot;saludar&amp;quot;, el cual al invocarlo me retorne &amp;quot;hola&amp;quot;. El test nos quedaría así:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
describe(&amp;quot;persona.saludar&amp;quot;,function(){&lt;br /&gt;
	&lt;br /&gt;
	it(&amp;quot;deberia retornar hola&amp;quot;, function(){&lt;br /&gt;
		var saludo = persona.saludar();&lt;br /&gt;
		expect(saludo).toEqual(&amp;quot;hola&amp;quot;);&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les propongo que antes de leer las líneas siguientes, ejecuten los tests e intenten interpretar los errores que nos lanza Jasmine.  Pueden descargar este [https://frameworks-test-javascript.googlecode.com/svn/trunk/jasmine-minConfig  proyecto de prueba] donde encontrarán un holaMundo.&lt;br /&gt;
&lt;br /&gt;
¿Qué pasa si quiero hacer algo antes de cada Test?&lt;br /&gt;
Bueno, para eso usamos ''beforeEach'' y ''afterEach''. El código que pongamos dentro de estas funciones, serán llamados antes y después de cada ''it'', respectivamente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
describe('beforeEach', function(){&lt;br /&gt;
   beforeEach(function(){&lt;br /&gt;
       // Antes de cada caso de prueba se carga un archivo html.&lt;br /&gt;
       jasmine.getFixtures().load(&amp;quot;persona/prueba.html&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
   it('Caso prueba', function(){&lt;br /&gt;
       // Test&lt;br /&gt;
   });    &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Fake Ajax ==&lt;br /&gt;
Jasmine-fakeAjax nos permite crear interceptores de urls, y enviar datos dummy en las mismas cuando son ejecutadas desde JQuery.ajax();&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
describe('Test FakeAjax', function() {&lt;br /&gt;
   it('La data que devolvio la llamada ajax es igual al del fake', function() {&lt;br /&gt;
       var mensaje;&lt;br /&gt;
       // Registramos el fake ajax.&lt;br /&gt;
       registerFakeAjax({url: '/prueba', successData: 'Prueba exitosa'});&lt;br /&gt;
       // Hacemos la llamada ajax.&lt;br /&gt;
       $.get('/prueba', function(data) {&lt;br /&gt;
           mensaje= data&lt;br /&gt;
       });&lt;br /&gt;
       // Comprobamos que nos hay llegado lo que definimos en el fake&lt;br /&gt;
       expect(mensaje).toEqual('Prueba exitosa')&lt;br /&gt;
   })&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Fixtures ==&lt;br /&gt;
Usamos la libreria Jasmine-jQuery para testear los JS que interactúan con nuestro html, la misma nos provee matchers de jquery, y nos permite manejar: CSS, HTML y JSON en nuestros specs. También nos permite armar un &amp;quot;esqueleto&amp;quot; de la página en la que va a ejecutar nuestro código JS. Esto lo logra mediante un elemento que buscaremos mediante el id &amp;quot;sandbox&amp;quot;, y al cual le agregaremos nuestro código html, estilos, etc. &lt;br /&gt;
Ahora bien, cuando hay varios casos de test en los que debemos utilizar el mismo html, se vuelve tedioso tener que copiar este código a lo largo de todos los archivos. Para solucionar este problema, el módulo fixture de esta librería nos permite cargar archivos HTML en nuestros test.&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo''':&lt;br /&gt;
Tenemos un archivo llamado pruebaFixture.html que contiene:&lt;br /&gt;
&amp;lt;code lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;prueba&amp;quot; style=&amp;quot;display:none;&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se setea el path en donde estaran los fixtures, por defecto es “spec/javascripts/fixtures”&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
jasmine.getFixtures().fixturesPath = './fixtures';&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se levanta el HTML con la función load.&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
jasmine.getFixtures().load(&amp;quot;pruebaFixture.html&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El test que comprueba que el div este oculto.&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
it(&amp;quot;El input id debe estar oculto&amp;quot;,function(){&lt;br /&gt;
      var div = $(&amp;quot;#prueba&amp;quot;);&lt;br /&gt;
      expect(div).toBeHidden();&lt;br /&gt;
    });  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este test comprueba que el elemento #prueba sea un div.&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
it(&amp;quot;El elemento es un div&amp;quot;,function(){&lt;br /&gt;
      var div = $(&amp;quot;#prueba&amp;quot;);&lt;br /&gt;
      expect(div).toBe('div');&lt;br /&gt;
    });  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Algo para tener en cuenta es que debemos cargar los fixtures en memoria antes de cargar la librería fake ajax por un conflicto entre las librerías. Es decir, deberá existir un archivo que precargue los fixtures antes de cargar la librería fake ajax, como se muestra en el archivo preLoadFixtures.js&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
jasmine.getFixtures().fixturesPath = './fixtures';&lt;br /&gt;
jasmine.getFixtures().preload(&amp;quot;fixture1.html&amp;quot;,&amp;quot;fixture2.html&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y luego, al cargar el archivo html, se deberá cargar el archivo preLoadFixtures.js antes del archivo de la librería de fake ajax. &lt;br /&gt;
Una vez cargados los fixtures en memoria, los mismos se cargarán de la misma manera mencionada al comienzo de la sección mediante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
jasmine.getFixtures().load(&amp;quot;fixture1.html&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fuentes / Más info en &lt;br /&gt;
&lt;br /&gt;
[http://pivotal.github.com/jasmine/ Jasmine]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/velesin/jasmine-jquery Repositorio de jasmine-jquery]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mileskin/jasmine-fake-ajax Repositorio de jasmine-fake-ajax]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=JasmineJs&amp;diff=6808</id>
		<title>JasmineJs</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=JasmineJs&amp;diff=6808"/>
				<updated>2013-03-14T17:58:34Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Fixtures */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introducción ==&lt;br /&gt;
&lt;br /&gt;
=== Objetivo: ===&lt;br /&gt;
&lt;br /&gt;
* Testear el código Javascript de nuestra aplicación web.&lt;br /&gt;
&lt;br /&gt;
=== Herramientas a usar ===&lt;br /&gt;
&lt;br /&gt;
* jasmine&lt;br /&gt;
* jasmine-fakeAjax&lt;br /&gt;
* jasmine-jQuery&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Jasmine ==&lt;br /&gt;
Es un framework de desarrollo para testear código Javascript.  La configuración mínima necesaria es:&lt;br /&gt;
&lt;br /&gt;
* Dependencias de Jasmine&lt;br /&gt;
* Un archivo html donde correrán los test&lt;br /&gt;
* Archivos JS productivos&lt;br /&gt;
* Archivos JS con nuestros tests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de las dependencias de jasmine, encontramos los archivos:&lt;br /&gt;
* jasmine.css&lt;br /&gt;
* jasmine.js&lt;br /&gt;
* jasmine-html.js&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Descargar las [http://pivotal.github.com/jasmine/ dependencias de jasmine]&lt;br /&gt;
&lt;br /&gt;
En el html se visualizarán los resultados de los test desarrollados. A continuación, la estructura de dicho html:&lt;br /&gt;
&amp;lt;code lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;!DOCTYPE HTML PUBLIC &amp;quot;-//W3C//DTD HTML 4.01 Transitional//EN&amp;quot;&lt;br /&gt;
    &amp;quot;http://www.w3.org/TR/html4/loose.dtd&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;/title&amp;gt;&lt;br /&gt;
        &amp;lt;!--        dependencias de jasmine--&amp;gt;&lt;br /&gt;
        &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;lib/jasmine/jasmine.css&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jasmine/jasmine.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jasmine/jasmine-html.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--        dependencias de nuestros tests--&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jquery-1.9.0.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/underscore-1.1.7-min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jasmine-jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;view/preLoadFixtures.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jasmine-fake-ajax.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--        dependencias de nuestro codigo productivo--&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;bienvenido.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--        nuestros archivos con los specs--&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;bienvenidoTest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
            //            agregamos el reporte de tests y lo ejecutamos&lt;br /&gt;
            jasmine.getEnv().addReporter( new jasmine.TrivialReporter());&lt;br /&gt;
            jasmine.getEnv().execute();&lt;br /&gt;
        &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podemos visualizar que el html además de contener las configuración básica para correr test con jasmine, contiene librerias que nos ayudan a desarrollar test de mayor calidad. Estas las podemos visualizar dentro del bloque &amp;quot;dependencias de nuestros tests&amp;quot; y se explicarán luego.&lt;br /&gt;
&lt;br /&gt;
En Jasmine los tests tienen la siguiente estructura:&lt;br /&gt;
&lt;br /&gt;
* '''Describe''': es una función que recibe como parámetros un string con un nombre que identifica a un conjunto de casos de test, y una función, que contiene 1 o más sentencias “it”&lt;br /&gt;
** '''it''': es cada caso posible para nuestro test. También conserva la misma forma de un describe: una función que recibe dos parámetros: un string con su descripción, y una función con nuestro caso de test, que contiene 1 o más “expect”&lt;br /&gt;
*** '''expect''': es una función que recibe como parámetro un valor “real”; y se encadena a una función “matcher”, la cual lleva como parámetro el valor esperado. Para ser más concretos, quedaría: expect(valorReal).toBe(valorEsperado);  donde “toBe” es una de las posibles funciones matcher.&lt;br /&gt;
**** '''matcher''': es una comparación entre un valor real y uno esperado. Se los puede negar encadenando la función “not” delante de ellos. Tenemos matchers incluidos por Jasmine, y también podemos definir más nosotros.&lt;br /&gt;
&lt;br /&gt;
Vamos a ejemplificar con un test dummy:&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
describe(&amp;quot;este es un test dummy&amp;quot;, function() {&lt;br /&gt;
it(&amp;quot;y este es un caso de test&amp;quot;, function() {&lt;br /&gt;
  expect(true).toBe(true);&lt;br /&gt;
  expect(false).not.toBe(true);&lt;br /&gt;
});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observen que en el caso anterior la función '''expect''' nos retorna un objeto, del cual utilizamos el atributo '''not''' y de él, su  matcher '''toBe''', para negar el resultado de este último.&lt;br /&gt;
&lt;br /&gt;
Vamos con un ejemplo en el cual yo quiero tener un objeto &amp;quot;persona&amp;quot;, que tenga un atributo &amp;quot;saludar&amp;quot;, el cual al invocarlo me retorne &amp;quot;hola&amp;quot;. El test nos quedaría así:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
describe(&amp;quot;persona.saludar&amp;quot;,function(){&lt;br /&gt;
	&lt;br /&gt;
	it(&amp;quot;deberia retornar hola&amp;quot;, function(){&lt;br /&gt;
		var saludo = persona.saludar();&lt;br /&gt;
		expect(saludo).toEqual(&amp;quot;hola&amp;quot;);&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les propongo que antes de leer las líneas siguientes, ejecuten los tests e intenten interpretar los errores que nos lanza Jasmine.  Pueden descargar este [https://frameworks-test-javascript.googlecode.com/svn/trunk/jasmine-minConfig  proyecto de prueba] donde encontrarán un holaMundo.&lt;br /&gt;
&lt;br /&gt;
¿Qué pasa si quiero hacer algo antes de cada Test?&lt;br /&gt;
Bueno, para eso usamos ''beforeEach'' y ''afterEach''. El código que pongamos dentro de estas funciones, serán llamados antes y después de cada ''it'', respectivamente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
describe('beforeEach', function(){&lt;br /&gt;
   beforeEach(function(){&lt;br /&gt;
       // Antes de cada caso de prueba se carga un archivo html.&lt;br /&gt;
       jasmine.getFixtures().load(&amp;quot;persona/prueba.html&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
   it('Caso prueba', function(){&lt;br /&gt;
       // Test&lt;br /&gt;
   });    &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Fake Ajax ==&lt;br /&gt;
Jasmine-fakeAjax nos permite crear interceptores de urls, y enviar datos dummy en las mismas cuando son ejecutadas desde JQuery.ajax();&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
describe('Test FakeAjax', function() {&lt;br /&gt;
   it('La data que devolvio la llamada ajax es igual al del fake', function() {&lt;br /&gt;
       var mensaje;&lt;br /&gt;
       // Registramos el fake ajax.&lt;br /&gt;
       registerFakeAjax({url: '/prueba', successData: 'Prueba exitosa'});&lt;br /&gt;
       // Hacemos la llamada ajax.&lt;br /&gt;
       $.get('/prueba', function(data) {&lt;br /&gt;
           mensaje= data&lt;br /&gt;
       });&lt;br /&gt;
       // Comprobamos que nos hay llegado lo que definimos en el fake&lt;br /&gt;
       expect(mensaje).toEqual('Prueba exitosa')&lt;br /&gt;
   })&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Más info en el [https://github.com/mileskin/jasmine-fake-ajax repositorio de jasmine-fake-ajax] &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Fixtures ==&lt;br /&gt;
Usamos la libreria Jasmine-jQuery para testear los JS que interactúan con nuestro html, la misma nos provee matchers de jquery, y nos permite manejar: CSS, HTML y JSON en nuestros specs. También nos permite armar un &amp;quot;esqueleto&amp;quot; de la página en la que va a ejecutar nuestro código JS. Esto lo logra mediante un elemento que buscaremos mediante el id &amp;quot;sandbox&amp;quot;, y al cual le agregaremos nuestro código html, estilos, etc. &lt;br /&gt;
Ahora bien, cuando hay varios casos de test en los que debemos utilizar el mismo html, se vuelve tedioso tener que copiar este código a lo largo de todos los archivos. Para solucionar este problema, el módulo fixture de esta librería nos permite cargar archivos HTML en nuestros test.&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo''':&lt;br /&gt;
Tenemos un archivo llamado pruebaFixture.html que contiene:&lt;br /&gt;
&amp;lt;code lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;prueba&amp;quot; style=&amp;quot;display:none;&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se setea el path en donde estaran los fixtures, por defecto es “spec/javascripts/fixtures”&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
jasmine.getFixtures().fixturesPath = './fixtures';&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se levanta el HTML con la función load.&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
jasmine.getFixtures().load(&amp;quot;pruebaFixture.html&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El test que comprueba que el div este oculto.&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
it(&amp;quot;El input id debe estar oculto&amp;quot;,function(){&lt;br /&gt;
      var div = $(&amp;quot;#prueba&amp;quot;);&lt;br /&gt;
      expect(div).toBeHidden();&lt;br /&gt;
    });  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este test comprueba que el elemento #prueba sea un div.&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
it(&amp;quot;El elemento es un div&amp;quot;,function(){&lt;br /&gt;
      var div = $(&amp;quot;#prueba&amp;quot;);&lt;br /&gt;
      expect(div).toBe('div');&lt;br /&gt;
    });  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Algo para tener en cuenta es que debemos cargar los fixtures en memoria antes de cargar la librería fake ajax por un conflicto entre las librerías. Es decir, deberá existir un archivo que precargue los fixtures antes de cargar la librería fake ajax, como se muestra en el archivo preLoadFixtures.js&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
jasmine.getFixtures().fixturesPath = './fixtures';&lt;br /&gt;
jasmine.getFixtures().preload(&amp;quot;fixture1.html&amp;quot;,&amp;quot;fixture2.html&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y luego, al cargar el archivo html, se deberá cargar el archivo preLoadFixtures.js antes del archivo de la librería de fake ajax. &lt;br /&gt;
Una vez cargados los fixtures en memoria, los mismos se cargarán de la misma manera mencionada al comienzo de la sección mediante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
jasmine.getFixtures().load(&amp;quot;fixture1.html&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fuentes / Más info en &lt;br /&gt;
&lt;br /&gt;
[http://pivotal.github.com/jasmine/ Jasmine]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/velesin/jasmine-jquery repositorio de jasmine-jquery]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Integrando_JasmineJS_con_Ant&amp;diff=6807</id>
		<title>Integrando JasmineJS con Ant</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Integrando_JasmineJS_con_Ant&amp;diff=6807"/>
				<updated>2013-03-14T17:56:49Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Integración de Jasmine con Ant */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Vamos a suponer que tenemos un proyecto web que usa [http://ant.apache.org/ ant], y queremos agregar tests para nuestro código escrito en Javascript. Para lograr esto, vamos a valernos de [http://phantomjs.org/ PhantomJs]. Esto es un ejecutable que simula ser un navegador web sin la parte visual, que nos brindará un entorno en el cual correremos nuestras pruebas.&lt;br /&gt;
&lt;br /&gt;
Lo que haremos en primera instancia es agregar los ejecutables y dependencias de Phantom a nuestro proyecto. Luego tenemos que agregar una tarea ant a nuestro archivo xml, invocando a dicho ejecutable:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Build.xml'''''&lt;br /&gt;
&amp;lt;code lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;target name=&amp;quot;testJavascript&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;echo&amp;gt;Ejecutando tests de javascript...&amp;lt;/echo&amp;gt;&lt;br /&gt;
      &amp;lt;exec executable=&amp;quot;Path del archivo ejecutable de phantom&amp;quot; failonerror=&amp;quot;true&amp;quot; &amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;Path del runner para jasmine” /&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;Path del html que contiene los archivos js, y sus respectivos tests&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;500&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/exec&amp;gt;&lt;br /&gt;
      &amp;lt;echo&amp;gt;La ejecución de los test ha finalizado.&amp;lt;/echo&amp;gt;&lt;br /&gt;
&amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Al invocar al ejecutable de Phantom, notemos que debemos agregar 3 parámetros:&lt;br /&gt;
* la ruta de un runner para Jasmine.&lt;br /&gt;
* la ruta del archivo html que contiene las inclusiones de los Js productivos y de tests&lt;br /&gt;
* Un timeout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Fuentes''':&lt;br /&gt;
&lt;br /&gt;
[http://phantomjs.org/ PhantomJs]&lt;br /&gt;
&lt;br /&gt;
[http://creynders.wordpress.com/2012/03/14/automating-javascript-builds/ Jasmine + Ant]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Integrando_JasmineJS_con_Ant&amp;diff=6806</id>
		<title>Integrando JasmineJS con Ant</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Integrando_JasmineJS_con_Ant&amp;diff=6806"/>
				<updated>2013-03-14T17:56:36Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: Página creada con '== Integración de Jasmine con Ant ==  Vamos a suponer que tenemos un proyecto web que usa [http://ant.apache.org/ ant], y queremos agregar tests para nuestro código escrito en…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Integración de Jasmine con Ant ==&lt;br /&gt;
&lt;br /&gt;
Vamos a suponer que tenemos un proyecto web que usa [http://ant.apache.org/ ant], y queremos agregar tests para nuestro código escrito en Javascript. Para lograr esto, vamos a valernos de [http://phantomjs.org/ PhantomJs]. Esto es un ejecutable que simula ser un navegador web sin la parte visual, que nos brindará un entorno en el cual correremos nuestras pruebas.&lt;br /&gt;
&lt;br /&gt;
Lo que haremos en primera instancia es agregar los ejecutables y dependencias de Phantom a nuestro proyecto. Luego tenemos que agregar una tarea ant a nuestro archivo xml, invocando a dicho ejecutable:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Build.xml'''''&lt;br /&gt;
&amp;lt;code lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;target name=&amp;quot;testJavascript&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;echo&amp;gt;Ejecutando tests de javascript...&amp;lt;/echo&amp;gt;&lt;br /&gt;
      &amp;lt;exec executable=&amp;quot;Path del archivo ejecutable de phantom&amp;quot; failonerror=&amp;quot;true&amp;quot; &amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;Path del runner para jasmine” /&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;Path del html que contiene los archivos js, y sus respectivos tests&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;500&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/exec&amp;gt;&lt;br /&gt;
      &amp;lt;echo&amp;gt;La ejecución de los test ha finalizado.&amp;lt;/echo&amp;gt;&lt;br /&gt;
&amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Al invocar al ejecutable de Phantom, notemos que debemos agregar 3 parámetros:&lt;br /&gt;
* la ruta de un runner para Jasmine.&lt;br /&gt;
* la ruta del archivo html que contiene las inclusiones de los Js productivos y de tests&lt;br /&gt;
* Un timeout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Fuentes''':&lt;br /&gt;
&lt;br /&gt;
[http://phantomjs.org/ PhantomJs]&lt;br /&gt;
&lt;br /&gt;
[http://creynders.wordpress.com/2012/03/14/automating-javascript-builds/ Jasmine + Ant]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=JavaScript&amp;diff=6805</id>
		<title>JavaScript</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=JavaScript&amp;diff=6805"/>
				<updated>2013-03-14T17:52:56Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Ver también */&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;br /&gt;
* [[Test en Javascript con JasmineJs, PhantomJs y Ant]]&lt;br /&gt;
* [[JasmineJs]]&lt;br /&gt;
* [[Integrando JasmineJS con Ant]]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=JasmineJs&amp;diff=6804</id>
		<title>JasmineJs</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=JasmineJs&amp;diff=6804"/>
				<updated>2013-03-14T17:46:38Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: Página creada con '== Introducción ==  === Objetivo: ===  * Testear el código Javascript de nuestra aplicación web.  === Herramientas a usar ===  * jasmine * jasmine-fakeAjax * jasmine-jQuery  …'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introducción ==&lt;br /&gt;
&lt;br /&gt;
=== Objetivo: ===&lt;br /&gt;
&lt;br /&gt;
* Testear el código Javascript de nuestra aplicación web.&lt;br /&gt;
&lt;br /&gt;
=== Herramientas a usar ===&lt;br /&gt;
&lt;br /&gt;
* jasmine&lt;br /&gt;
* jasmine-fakeAjax&lt;br /&gt;
* jasmine-jQuery&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Jasmine ==&lt;br /&gt;
Es un framework de desarrollo para testear código Javascript.  La configuración mínima necesaria es:&lt;br /&gt;
&lt;br /&gt;
* Dependencias de Jasmine&lt;br /&gt;
* Un archivo html donde correrán los test&lt;br /&gt;
* Archivos JS productivos&lt;br /&gt;
* Archivos JS con nuestros tests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de las dependencias de jasmine, encontramos los archivos:&lt;br /&gt;
* jasmine.css&lt;br /&gt;
* jasmine.js&lt;br /&gt;
* jasmine-html.js&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Descargar las [http://pivotal.github.com/jasmine/ dependencias de jasmine]&lt;br /&gt;
&lt;br /&gt;
En el html se visualizarán los resultados de los test desarrollados. A continuación, la estructura de dicho html:&lt;br /&gt;
&amp;lt;code lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;!DOCTYPE HTML PUBLIC &amp;quot;-//W3C//DTD HTML 4.01 Transitional//EN&amp;quot;&lt;br /&gt;
    &amp;quot;http://www.w3.org/TR/html4/loose.dtd&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;/title&amp;gt;&lt;br /&gt;
        &amp;lt;!--        dependencias de jasmine--&amp;gt;&lt;br /&gt;
        &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;lib/jasmine/jasmine.css&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jasmine/jasmine.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jasmine/jasmine-html.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--        dependencias de nuestros tests--&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jquery-1.9.0.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/underscore-1.1.7-min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jasmine-jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;view/preLoadFixtures.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jasmine-fake-ajax.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--        dependencias de nuestro codigo productivo--&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;bienvenido.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--        nuestros archivos con los specs--&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;bienvenidoTest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
            //            agregamos el reporte de tests y lo ejecutamos&lt;br /&gt;
            jasmine.getEnv().addReporter( new jasmine.TrivialReporter());&lt;br /&gt;
            jasmine.getEnv().execute();&lt;br /&gt;
        &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podemos visualizar que el html además de contener las configuración básica para correr test con jasmine, contiene librerias que nos ayudan a desarrollar test de mayor calidad. Estas las podemos visualizar dentro del bloque &amp;quot;dependencias de nuestros tests&amp;quot; y se explicarán luego.&lt;br /&gt;
&lt;br /&gt;
En Jasmine los tests tienen la siguiente estructura:&lt;br /&gt;
&lt;br /&gt;
* '''Describe''': es una función que recibe como parámetros un string con un nombre que identifica a un conjunto de casos de test, y una función, que contiene 1 o más sentencias “it”&lt;br /&gt;
** '''it''': es cada caso posible para nuestro test. También conserva la misma forma de un describe: una función que recibe dos parámetros: un string con su descripción, y una función con nuestro caso de test, que contiene 1 o más “expect”&lt;br /&gt;
*** '''expect''': es una función que recibe como parámetro un valor “real”; y se encadena a una función “matcher”, la cual lleva como parámetro el valor esperado. Para ser más concretos, quedaría: expect(valorReal).toBe(valorEsperado);  donde “toBe” es una de las posibles funciones matcher.&lt;br /&gt;
**** '''matcher''': es una comparación entre un valor real y uno esperado. Se los puede negar encadenando la función “not” delante de ellos. Tenemos matchers incluidos por Jasmine, y también podemos definir más nosotros.&lt;br /&gt;
&lt;br /&gt;
Vamos a ejemplificar con un test dummy:&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
describe(&amp;quot;este es un test dummy&amp;quot;, function() {&lt;br /&gt;
it(&amp;quot;y este es un caso de test&amp;quot;, function() {&lt;br /&gt;
  expect(true).toBe(true);&lt;br /&gt;
  expect(false).not.toBe(true);&lt;br /&gt;
});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observen que en el caso anterior la función '''expect''' nos retorna un objeto, del cual utilizamos el atributo '''not''' y de él, su  matcher '''toBe''', para negar el resultado de este último.&lt;br /&gt;
&lt;br /&gt;
Vamos con un ejemplo en el cual yo quiero tener un objeto &amp;quot;persona&amp;quot;, que tenga un atributo &amp;quot;saludar&amp;quot;, el cual al invocarlo me retorne &amp;quot;hola&amp;quot;. El test nos quedaría así:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
describe(&amp;quot;persona.saludar&amp;quot;,function(){&lt;br /&gt;
	&lt;br /&gt;
	it(&amp;quot;deberia retornar hola&amp;quot;, function(){&lt;br /&gt;
		var saludo = persona.saludar();&lt;br /&gt;
		expect(saludo).toEqual(&amp;quot;hola&amp;quot;);&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les propongo que antes de leer las líneas siguientes, ejecuten los tests e intenten interpretar los errores que nos lanza Jasmine.  Pueden descargar este [https://frameworks-test-javascript.googlecode.com/svn/trunk/jasmine-minConfig  proyecto de prueba] donde encontrarán un holaMundo.&lt;br /&gt;
&lt;br /&gt;
¿Qué pasa si quiero hacer algo antes de cada Test?&lt;br /&gt;
Bueno, para eso usamos ''beforeEach'' y ''afterEach''. El código que pongamos dentro de estas funciones, serán llamados antes y después de cada ''it'', respectivamente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
describe('beforeEach', function(){&lt;br /&gt;
   beforeEach(function(){&lt;br /&gt;
       // Antes de cada caso de prueba se carga un archivo html.&lt;br /&gt;
       jasmine.getFixtures().load(&amp;quot;persona/prueba.html&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
   it('Caso prueba', function(){&lt;br /&gt;
       // Test&lt;br /&gt;
   });    &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Fake Ajax ==&lt;br /&gt;
Jasmine-fakeAjax nos permite crear interceptores de urls, y enviar datos dummy en las mismas cuando son ejecutadas desde JQuery.ajax();&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
describe('Test FakeAjax', function() {&lt;br /&gt;
   it('La data que devolvio la llamada ajax es igual al del fake', function() {&lt;br /&gt;
       var mensaje;&lt;br /&gt;
       // Registramos el fake ajax.&lt;br /&gt;
       registerFakeAjax({url: '/prueba', successData: 'Prueba exitosa'});&lt;br /&gt;
       // Hacemos la llamada ajax.&lt;br /&gt;
       $.get('/prueba', function(data) {&lt;br /&gt;
           mensaje= data&lt;br /&gt;
       });&lt;br /&gt;
       // Comprobamos que nos hay llegado lo que definimos en el fake&lt;br /&gt;
       expect(mensaje).toEqual('Prueba exitosa')&lt;br /&gt;
   })&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Más info en el [https://github.com/mileskin/jasmine-fake-ajax repositorio de jasmine-fake-ajax] &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Fixtures ==&lt;br /&gt;
Usamos la libreria Jasmine-jQuery para testear los JS que interactúan con nuestro html, la misma nos provee matchers de jquery, y nos permite manejar: CSS, HTML y JSON en nuestros specs. También nos permite armar un &amp;quot;esqueleto&amp;quot; de la página en la que va a ejecutar nuestro código JS. Esto lo logra mediante un elemento que buscaremos mediante el id &amp;quot;sandbox&amp;quot;, y al cual le agregaremos nuestro código html, estilos, etc. &lt;br /&gt;
Ahora bien, cuando hay varios casos de test en los que debemos utilizar el mismo html, se vuelve tedioso tener que copiar este código a lo largo de todos los archivos. Para solucionar este problema, el módulo fixture de esta librería nos permite cargar archivos HTML en nuestros test.&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo''':&lt;br /&gt;
Tenemos un archivo llamado pruebaFixture.html que contiene:&lt;br /&gt;
&amp;lt;code lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;prueba&amp;quot; style=&amp;quot;display:none;&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se setea el path en donde estaran los fixtures, por defecto es “spec/javascripts/fixtures”&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
jasmine.getFixtures().fixturesPath = './fixtures';&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se levanta el HTML con la función load.&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
jasmine.getFixtures().load(&amp;quot;pruebaFixture.html&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El test que comprueba que el div este oculto.&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
it(&amp;quot;El input id debe estar oculto&amp;quot;,function(){&lt;br /&gt;
      var div = $(&amp;quot;#prueba&amp;quot;);&lt;br /&gt;
      expect(div).toBeHidden();&lt;br /&gt;
    });  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este test comprueba que el elemento #prueba sea un div.&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
it(&amp;quot;El elemento es un div&amp;quot;,function(){&lt;br /&gt;
      var div = $(&amp;quot;#prueba&amp;quot;);&lt;br /&gt;
      expect(div).toBe('div');&lt;br /&gt;
    });  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Algo para tener en cuenta es que debemos cargar los fixtures en memoria antes de cargar la librería fake ajax por un conflicto entre las librerías. Es decir, deberá existir un archivo que precargue los fixtures antes de cargar la librería fake ajax, como se muestra en el archivo preLoadFixtures.js&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
jasmine.getFixtures().fixturesPath = './fixtures';&lt;br /&gt;
jasmine.getFixtures().preload(&amp;quot;fixture1.html&amp;quot;,&amp;quot;fixture2.html&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y luego, al cargar el archivo html, se deberá cargar el archivo preLoadFixtures.js antes del archivo de la librería de fake ajax. &lt;br /&gt;
Una vez cargados los fixtures en memoria, los mismos se cargarán de la misma manera mencionada al comienzo de la sección mediante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
jasmine.getFixtures().load(&amp;quot;fixture1.html&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Más info en el [https://github.com/velesin/jasmine-jquery repositorio de jasmine-jquery]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=JavaScript&amp;diff=6803</id>
		<title>JavaScript</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=JavaScript&amp;diff=6803"/>
				<updated>2013-03-14T17:41:49Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Ver también */&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;br /&gt;
* [[Test en Javascript con JasmineJs, PhantomJs y Ant]]&lt;br /&gt;
* [[JasmineJs]]&lt;br /&gt;
* [[PhantomJS]]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=JavaScript&amp;diff=6802</id>
		<title>JavaScript</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=JavaScript&amp;diff=6802"/>
				<updated>2013-03-14T17:40:49Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Ver también */&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;br /&gt;
* [[Test en Javascript con JasmineJs, PhantomJs y Ant]]&lt;br /&gt;
* [[JasmineJs]]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Validaciones_de_XML_contra_XSD_En_Java&amp;diff=6752</id>
		<title>Validaciones de XML contra XSD En Java</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Validaciones_de_XML_contra_XSD_En_Java&amp;diff=6752"/>
				<updated>2012-12-05T12:24:24Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Java]]&lt;br /&gt;
'''Necesidad'''&lt;br /&gt;
validar que un XML está formado de acuerdo a las reglas de un XSD.&lt;br /&gt;
&lt;br /&gt;
'''Solución'''&lt;br /&gt;
Para validar un xml, podemos aplicar lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 import javax.xml.XMLConstants;&lt;br /&gt;
 import javax.xml.transform.Source;&lt;br /&gt;
 import javax.xml.transform.stream.StreamSource;&lt;br /&gt;
 import javax.xml.validation.Schema;&lt;br /&gt;
 import javax.xml.validation.SchemaFactory;&lt;br /&gt;
 import javax.xml.validation.Validator;&lt;br /&gt;
 import java.io.IOException;&lt;br /&gt;
 import java.net.URL;&lt;br /&gt;
 &lt;br /&gt;
 import org.apache.xmlbeans.XmlObject;&lt;br /&gt;
 import org.xml.sax.SAXException;&lt;br /&gt;
 &lt;br /&gt;
 public class ValidadorXml {&lt;br /&gt;
    /**&lt;br /&gt;
     * Para crear un Schema a partir de un XSD.&lt;br /&gt;
     */&lt;br /&gt;
    private static SchemaFactory schemaFactory;&lt;br /&gt;
    static {&lt;br /&gt;
        schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);&lt;br /&gt;
    }&lt;br /&gt;
    public static void validarXml(String pathXsd, XmlObject xml) throws IOException, SAXException {&lt;br /&gt;
        Schema schema = schemaFactory.newSchema(new URL(pathXsd));&lt;br /&gt;
        Validator validator = schema.newValidator();&lt;br /&gt;
        Source source = new StreamSource(xml.newInputStream());&lt;br /&gt;
        validator.validate(source);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el código anterior utilizamos la clase '''XmlObject'''. Podemos obtener una instancia de dicho elemento utilizando: &lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
String mensaje = &amp;quot;&amp;lt;hola&amp;gt;&amp;lt;/hola&amp;gt;&amp;quot;; //cadena que representa el contenido xml.&lt;br /&gt;
XmlObject.Factory.parse(mensaje);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este método constructor de XmlObject acepta varias formas de pasarle el xml a parsear. Es cuestión de buscar la manera que más se adapte a como nosotros recibimos el xml (por un String, archivo, url, etc).&lt;br /&gt;
&lt;br /&gt;
Finalmente, al invocar '''validator.validate(source);''' obtendremos la validación del documento. Si no conformara alguna de las condiciones del XSD, arrojará la excepción '''SAXException''', y si no se logra encontrar el xsd, arroja '''IOException'''.&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Validaciones_de_XML_contra_XSD_En_Java&amp;diff=6751</id>
		<title>Validaciones de XML contra XSD En Java</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Validaciones_de_XML_contra_XSD_En_Java&amp;diff=6751"/>
				<updated>2012-12-05T12:20:05Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Java]]&lt;br /&gt;
Necesidad:&lt;br /&gt;
validar que un XML está formado de acuerdo a las reglas de un XSD.&lt;br /&gt;
&lt;br /&gt;
Solución:&lt;br /&gt;
Para validar un xml, podemos aplicar lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 import javax.xml.XMLConstants;&lt;br /&gt;
 import javax.xml.transform.Source;&lt;br /&gt;
 import javax.xml.transform.stream.StreamSource;&lt;br /&gt;
 import javax.xml.validation.Schema;&lt;br /&gt;
 import javax.xml.validation.SchemaFactory;&lt;br /&gt;
 import javax.xml.validation.Validator;&lt;br /&gt;
 import java.io.IOException;&lt;br /&gt;
 import java.net.URL;&lt;br /&gt;
 &lt;br /&gt;
 import org.apache.xmlbeans.XmlObject;&lt;br /&gt;
 import org.xml.sax.SAXException;&lt;br /&gt;
 &lt;br /&gt;
 public class ValidadorXml {&lt;br /&gt;
    /**&lt;br /&gt;
     * Para crear un Schema a partir de un XSD.&lt;br /&gt;
     */&lt;br /&gt;
    private static SchemaFactory schemaFactory;&lt;br /&gt;
    static {&lt;br /&gt;
        schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);&lt;br /&gt;
    }&lt;br /&gt;
    public static void validarXml(String pathXsd, XmlObject xml) throws IOException, SAXException {&lt;br /&gt;
        Schema schema = schemaFactory.newSchema(new URL(pathXsd));&lt;br /&gt;
        Validator validator = schema.newValidator();&lt;br /&gt;
        Source source = new StreamSource(xml.newInputStream());&lt;br /&gt;
        validator.validate(source);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el código anterior utilizamos la clase '''XmlObject'''. Podemos obtener una instancia de dicho elemento utilizando: &lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
String mensaje = &amp;quot;&amp;lt;hola&amp;gt;&amp;lt;/hola&amp;gt;&amp;quot;; //cadena que representa el contenido xml.&lt;br /&gt;
XmlObject.Factory.parse(mensaje);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este método constructor de XmlObject acepta varias formas de pasarle el xml a parsear. Es cuestión de buscar la manera que más se adapte a como nosotros recibimos el xml (por un String, archivo, url, etc).&lt;br /&gt;
&lt;br /&gt;
Finalmente, al invocar '''validator.validate(source);''' obtendremos la validación del documento. Si no conformara alguna de las condiciones del XSD, arrojará la excepción '''SAXException''', y si no se logra encontrar el xsd, arroja '''IOException'''.&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Validaciones_de_XML_contra_XSD_En_Java&amp;diff=6750</id>
		<title>Validaciones de XML contra XSD En Java</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Validaciones_de_XML_contra_XSD_En_Java&amp;diff=6750"/>
				<updated>2012-12-05T12:19:36Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Java]]&lt;br /&gt;
Necesidad:&lt;br /&gt;
validar que un XML está formado de acuerdo a las reglas de un XSD.&lt;br /&gt;
&lt;br /&gt;
Solución:&lt;br /&gt;
Para validar un xml, podemos aplicar lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 import javax.xml.XMLConstants;&lt;br /&gt;
 import javax.xml.transform.Source;&lt;br /&gt;
 import javax.xml.transform.stream.StreamSource;&lt;br /&gt;
 import javax.xml.validation.Schema;&lt;br /&gt;
 import javax.xml.validation.SchemaFactory;&lt;br /&gt;
 import javax.xml.validation.Validator;&lt;br /&gt;
 import java.io.IOException;&lt;br /&gt;
 import java.net.URL;&lt;br /&gt;
 &lt;br /&gt;
 import org.apache.xmlbeans.XmlObject;&lt;br /&gt;
 import org.xml.sax.SAXException;&lt;br /&gt;
 &lt;br /&gt;
 public class ValidadorXml {&lt;br /&gt;
    /**&lt;br /&gt;
     * Para crear un Schema a partir de un XSD.&lt;br /&gt;
     */&lt;br /&gt;
    private static SchemaFactory schemaFactory;&lt;br /&gt;
    static {&lt;br /&gt;
        schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);&lt;br /&gt;
    }&lt;br /&gt;
    public static void validarXml(String pathXsd, XmlObject xml) throws IOException, SAXException {&lt;br /&gt;
        Schema schema = schemaFactory.newSchema(new URL(pathXsd));&lt;br /&gt;
        Validator validator = schema.newValidator();&lt;br /&gt;
        Source source = new StreamSource(xml.newInputStream());&lt;br /&gt;
        validator.validate(source);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el código anterior utilizamos la clase '''XmlObject'''. Podemos obtener una instancia de dicho elemento utilizando: &lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
String mensaje = &amp;quot;&amp;lt;hola&amp;gt;&amp;lt;/hola&amp;gt;&amp;quot; //cadena que representa el contenido xml.&lt;br /&gt;
XmlObject.Factory.parse(mensaje);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este método constructor de XmlObject acepta varias formas de pasarle el xml a parsear. Es cuestión de buscar la manera que más se adapte a como nosotros recibimos el xml (por un String, archivo, url, etc).&lt;br /&gt;
&lt;br /&gt;
Finalmente, al invocar '''validator.validate(source);''' obtendremos la validación del documento. Si no conformara alguna de las condiciones del XSD, arrojará la excepción '''SAXException''', y si no se logra encontrar el xsd, arroja '''IOException'''.&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Validaciones_de_XML_contra_XSD_En_Java&amp;diff=6749</id>
		<title>Validaciones de XML contra XSD En Java</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Validaciones_de_XML_contra_XSD_En_Java&amp;diff=6749"/>
				<updated>2012-12-05T12:18:26Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Java]]&lt;br /&gt;
Necesidad:&lt;br /&gt;
validar que un XML está formado de acuerdo a las reglas de un XSD.&lt;br /&gt;
&lt;br /&gt;
Solución:&lt;br /&gt;
Para validar un xml, podemos aplicar lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 import javax.xml.XMLConstants;&lt;br /&gt;
 import javax.xml.transform.Source;&lt;br /&gt;
 import javax.xml.transform.stream.StreamSource;&lt;br /&gt;
 import javax.xml.validation.Schema;&lt;br /&gt;
 import javax.xml.validation.SchemaFactory;&lt;br /&gt;
 import javax.xml.validation.Validator;&lt;br /&gt;
 import java.io.IOException;&lt;br /&gt;
 import java.net.URL;&lt;br /&gt;
 &lt;br /&gt;
 import org.apache.xmlbeans.XmlObject;&lt;br /&gt;
 import org.xml.sax.SAXException;&lt;br /&gt;
 &lt;br /&gt;
 public class ValidadorXml {&lt;br /&gt;
    /**&lt;br /&gt;
     * Para crear un Schema a partir de un XSD.&lt;br /&gt;
     */&lt;br /&gt;
    private static SchemaFactory schemaFactory;&lt;br /&gt;
    static {&lt;br /&gt;
        schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);&lt;br /&gt;
    }&lt;br /&gt;
    public static void validarXml(String pathXsd, XmlObject xml) throws IOException, SAXException {&lt;br /&gt;
        Schema schema = schemaFactory.newSchema(new URL(pathXsd));&lt;br /&gt;
        Validator validator = schema.newValidator();&lt;br /&gt;
        Source source = new StreamSource(xml.newInputStream());&lt;br /&gt;
        validator.validate(source);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En el código anterior utilizamos la clase '''XmlObject'''. Podemos obtener una instancia de dicho elemento utilizando: &lt;br /&gt;
 String mensaje = &amp;quot;&amp;lt;hola&amp;gt;&amp;lt;/hola&amp;gt;&amp;quot; //cadena que representa el contenido xml.&lt;br /&gt;
 XmlObject.Factory.parse(mensaje);&lt;br /&gt;
&lt;br /&gt;
Este método constructor de XmlObject acepta varias formas de pasarle el xml a parsear. Es cuestión de buscar la manera que más se adapte a como nosotros recibimos el xml (por un String, archivo, url, etc).&lt;br /&gt;
&lt;br /&gt;
Finalmente, al invocar '''validator.validate(source);''' obtendremos la validación del documento. Si no conformara alguna de las condiciones del XSD, arrojará la excepción '''SAXException''', y si no se logra encontrar el xsd, arroja '''IOException'''.&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Validaciones_de_XML_contra_XSD_En_Java&amp;diff=6748</id>
		<title>Validaciones de XML contra XSD En Java</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Validaciones_de_XML_contra_XSD_En_Java&amp;diff=6748"/>
				<updated>2012-12-05T12:17:11Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Necesidad:&lt;br /&gt;
validar que un XML está formado de acuerdo a las reglas de un XSD.&lt;br /&gt;
&lt;br /&gt;
Solución:&lt;br /&gt;
Para validar un xml, podemos aplicar lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 import javax.xml.XMLConstants;&lt;br /&gt;
 import javax.xml.transform.Source;&lt;br /&gt;
 import javax.xml.transform.stream.StreamSource;&lt;br /&gt;
 import javax.xml.validation.Schema;&lt;br /&gt;
 import javax.xml.validation.SchemaFactory;&lt;br /&gt;
 import javax.xml.validation.Validator;&lt;br /&gt;
 import java.io.IOException;&lt;br /&gt;
 import java.net.URL;&lt;br /&gt;
 &lt;br /&gt;
 import org.apache.xmlbeans.XmlObject;&lt;br /&gt;
 import org.xml.sax.SAXException;&lt;br /&gt;
 &lt;br /&gt;
 public class ValidadorXml {&lt;br /&gt;
    /**&lt;br /&gt;
     * Para crear un Schema a partir de un XSD.&lt;br /&gt;
     */&lt;br /&gt;
    private static SchemaFactory schemaFactory;&lt;br /&gt;
    static {&lt;br /&gt;
        schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);&lt;br /&gt;
    }&lt;br /&gt;
    public static void validarXml(String pathXsd, XmlObject xml) throws IOException, SAXException {&lt;br /&gt;
        Schema schema = schemaFactory.newSchema(new URL(pathXsd));&lt;br /&gt;
        Validator validator = schema.newValidator();&lt;br /&gt;
        Source source = new StreamSource(xml.newInputStream());&lt;br /&gt;
        validator.validate(source);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En el código anterior utilizamos la clase '''XmlObject'''. Podemos obtener una instancia de dicho elemento utilizando: &lt;br /&gt;
 String mensaje = &amp;quot;&amp;lt;hola&amp;gt;&amp;lt;/hola&amp;gt;&amp;quot; //cadena que representa el contenido xml.&lt;br /&gt;
 XmlObject.Factory.parse(mensaje);&lt;br /&gt;
&lt;br /&gt;
Este método constructor de XmlObject acepta varias formas de pasarle el xml a parsear. Es cuestión de buscar la manera que más se adapte a como nosotros recibimos el xml (por un String, archivo, url, etc).&lt;br /&gt;
&lt;br /&gt;
Finalmente, al invocar '''validator.validate(source);''' obtendremos la validación del documento. Si no conformara alguna de las condiciones del XSD, arrojará la excepción '''SAXException''', y si no se logra encontrar el xsd, arroja '''IOException'''.&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Validaciones_de_XML_contra_XSD_En_Java&amp;diff=6747</id>
		<title>Validaciones de XML contra XSD En Java</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Validaciones_de_XML_contra_XSD_En_Java&amp;diff=6747"/>
				<updated>2012-12-04T20:47:24Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: Página creada con 'Necesidad: validar que un XML está formado de acuerdo a las reglas de un XSD.  Solución: Para validar un xml, podemos aplicar lo siguiente:    import javax.xml.XMLConstants;  …'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Necesidad:&lt;br /&gt;
validar que un XML está formado de acuerdo a las reglas de un XSD.&lt;br /&gt;
&lt;br /&gt;
Solución:&lt;br /&gt;
Para validar un xml, podemos aplicar lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 import javax.xml.XMLConstants;&lt;br /&gt;
 import javax.xml.transform.Source;&lt;br /&gt;
 import javax.xml.transform.stream.StreamSource;&lt;br /&gt;
 import javax.xml.validation.Schema;&lt;br /&gt;
 import javax.xml.validation.SchemaFactory;&lt;br /&gt;
 import javax.xml.validation.Validator;&lt;br /&gt;
 import java.io.IOException;&lt;br /&gt;
 import java.net.URL;&lt;br /&gt;
 &lt;br /&gt;
 import org.apache.xmlbeans.XmlObject;&lt;br /&gt;
 import org.xml.sax.SAXException;&lt;br /&gt;
 &lt;br /&gt;
 public class ValidadorXml {&lt;br /&gt;
    /**&lt;br /&gt;
     * Para crear un Schema a partir de un XSD.&lt;br /&gt;
     */&lt;br /&gt;
    private static SchemaFactory schemaFactory;&lt;br /&gt;
    static {&lt;br /&gt;
        schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);&lt;br /&gt;
    }&lt;br /&gt;
    public static void validarXml(String pathXsd, XmlObject xml) throws IOException, SAXException {&lt;br /&gt;
        Schema schema = schemaFactory.newSchema(new URL(pathXsd));&lt;br /&gt;
        Validator validator = schema.newValidator();&lt;br /&gt;
        Source source = new StreamSource(xml.newInputStream());&lt;br /&gt;
        validator.validate(source);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En el código anterior utilizamos la clase '''XmlObject'''. Podemos obtener una instancia de dicho elemento utilizando: &lt;br /&gt;
 String mensaje = &amp;quot;&amp;lt;hola&amp;gt;&amp;lt;/hola&amp;gt;&amp;quot; //cadena que representa el contenido xml.&lt;br /&gt;
 XmlObject.Factory.parse(mensaje);&lt;br /&gt;
&lt;br /&gt;
Este método constructor de XmlObject acepta varias formas de pasarle el xml a parsear. Es cuestión de buscar la manera que más se adapte a como nosotros recibimos el xml (por un String, archivo, url, etc).&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Java&amp;diff=6746</id>
		<title>Java</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Java&amp;diff=6746"/>
				<updated>2012-12-04T20:26:30Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* 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;
* [[SiteMesh 2]]&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;
===Seguridad===&lt;br /&gt;
* [[Spring Security]]&lt;br /&gt;
&lt;br /&gt;
===Cuestiones generales de Java===&lt;br /&gt;
* [[Validaciones de XML contra XSD En 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>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_REST_con_Spring&amp;diff=6745</id>
		<title>Mock REST con Spring</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_REST_con_Spring&amp;diff=6745"/>
				<updated>2012-10-23T15:55:51Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Usando MockRestServiceServer para testear un cliente Rest en componente===&lt;br /&gt;
&lt;br /&gt;
====Situación====&lt;br /&gt;
	Capa de acceso a datos que interactúa como cliente de un servicio REST.&lt;br /&gt;
====Necesidad====&lt;br /&gt;
	Construir tests de componente del DAO, que queden auto-contenidos.&lt;br /&gt;
	&lt;br /&gt;
Para resolver este problema, recurrimos a la clase MockRestServiceServer, incluida en los jars de spring social (y también en el core de Spring a partir de las últimas versiones).&lt;br /&gt;
Para poder utilizar una instancia de esta clase, se debe crear a partir de una instancia de la clase RestTemplate. &lt;br /&gt;
Dicho elemento debe ser declarado en el archivo xml de configuración de contexto de nuestros tests.&lt;br /&gt;
&lt;br /&gt;
=====Archivo de contexto=====&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;restTemplate&amp;quot; class=&amp;quot;org.springframework.web.client.RestTemplate&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;constructor-arg ref=&amp;quot;httpClientFactory&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;property name=&amp;quot;messageConverters&amp;quot;&amp;gt;&lt;br /&gt;
 		&amp;lt;list&amp;gt;&lt;br /&gt;
 			&amp;lt;bean  class=&amp;quot;org.springframework.http.converter.json.MappingJacksonHttpMessageConverter&amp;quot;/&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;
&lt;br /&gt;
=====En la clase de Test=====&lt;br /&gt;
&lt;br /&gt;
======Imports======&lt;br /&gt;
 import org.springframework.test.web.client.MockRestServiceServer;&lt;br /&gt;
 import org.springframework.test.web.client.RequestMatchers;&lt;br /&gt;
 import org.springframework.test.web.client.ResponseActions;&lt;br /&gt;
 import org.springframework.test.web.client.ResponseCreators;&lt;br /&gt;
 import org.springframework.test.web.server.MockMvc;&lt;br /&gt;
 import static org.springframework.test.web.server.request.MockMvcRequestBuilders.post;&lt;br /&gt;
 import static org.springframework.test.web.server.result.MockMvcResultMatchers.status;&lt;br /&gt;
 import org.springframework.test.web.server.setup.MockMvcBuilders;&lt;br /&gt;
 import org.springframework.web.client.RestTemplate;&lt;br /&gt;
&lt;br /&gt;
======Declaración de las variables======&lt;br /&gt;
   @Autowired&lt;br /&gt;
   private RestTemplate restTemplate;&lt;br /&gt;
   private MockRestServiceServer mockServer;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
======Preparación de cada uno de los test======&lt;br /&gt;
    @Before&lt;br /&gt;
    public void setUp() {&lt;br /&gt;
        mockMvc = MockMvcBuilders.standaloneSetup(instanciaDeClaseATestear).build();&lt;br /&gt;
        mockServer = MockRestServiceServer.createServer(restTemplate);&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
En los tests propiamente dichos, preparar las peticiones esperadas y sus respectivas respuestas:&lt;br /&gt;
&lt;br /&gt;
 ResponseActions responseAction = mockServer&lt;br /&gt;
           .expect(RequestMatchers.requestTo(&amp;quot;http://miURL:puerto/recurso&amp;quot;));                &lt;br /&gt;
        responseAction&lt;br /&gt;
           .andExpect(RequestMatchers.header(&amp;quot;Accept&amp;quot;, &amp;quot;application/json&amp;quot;))&lt;br /&gt;
           .andRespond(ResponseCreators.withStatus(HttpStatus.BAD_REQUEST));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, en el caso anterior, se espera que cuando sea llamada la URL &amp;quot;http://miURL:puerto/recurso&amp;quot; se responda con un 404.&lt;br /&gt;
A partir de este punto, ya se pueden ejercitar los métodos de nuestras clases que invoquen a los servicios REST con las URL configuradas.&lt;br /&gt;
Aclaración: en el caso que querramos esperar varias peticiones, las mismas tienen que ser declaradas en el orden en el que serán invocadas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://static.springsource.org/spring-social/docs/1.0.x/api/org/springframework/social/test/client/MockRestServiceServer.html API Oficial]&lt;br /&gt;
&lt;br /&gt;
* [http://static.springsource.org/spring/docs/3.2.0.BUILD-SNAPSHOT/api/org/springframework/test/web/mock/client/MockRestServiceServer.html API de la versión incluida en el core de Spring como Snapshot, con algunos ejemplos]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_REST_con_Spring&amp;diff=6744</id>
		<title>Mock REST con Spring</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_REST_con_Spring&amp;diff=6744"/>
				<updated>2012-10-23T15:52:16Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* imports */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Usando MockRestServiceServer para testear un cliente Rest en componente===&lt;br /&gt;
&lt;br /&gt;
====Situación====&lt;br /&gt;
	Capa de acceso a datos que interactúa como cliente de un servicio REST.&lt;br /&gt;
====Necesidad====&lt;br /&gt;
	Construir tests de componente del DAO, que queden auto-contenidos.&lt;br /&gt;
	&lt;br /&gt;
Para resolver este problema, recurrimos a la clase MockRestServiceServer, incluida en los jars de spring social (y también en el core de Spring a partir de las últimas versiones).&lt;br /&gt;
Para poder utilizar una instancia de esta clase, se debe crear a partir de una instancia de la clase RestTemplate. &lt;br /&gt;
Dicho elemento debe ser declarado en el archivo xml de configuración de contexto de nuestros tests.&lt;br /&gt;
&lt;br /&gt;
=====Archivo de contexto=====&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;restTemplate&amp;quot; class=&amp;quot;org.springframework.web.client.RestTemplate&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;constructor-arg ref=&amp;quot;httpClientFactory&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;property name=&amp;quot;messageConverters&amp;quot;&amp;gt;&lt;br /&gt;
 		&amp;lt;list&amp;gt;&lt;br /&gt;
 			&amp;lt;bean  class=&amp;quot;org.springframework.http.converter.json.MappingJacksonHttpMessageConverter&amp;quot;/&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;
&lt;br /&gt;
=====En la clase de Test=====&lt;br /&gt;
&lt;br /&gt;
======Imports======&lt;br /&gt;
 import org.springframework.test.web.client.MockRestServiceServer;&lt;br /&gt;
 import org.springframework.test.web.client.RequestMatchers;&lt;br /&gt;
 import org.springframework.test.web.client.ResponseActions;&lt;br /&gt;
 import org.springframework.test.web.client.ResponseCreators;&lt;br /&gt;
 import org.springframework.test.web.server.MockMvc;&lt;br /&gt;
 import static org.springframework.test.web.server.request.MockMvcRequestBuilders.post;&lt;br /&gt;
 import static org.springframework.test.web.server.result.MockMvcResultMatchers.status;&lt;br /&gt;
 import org.springframework.test.web.server.setup.MockMvcBuilders;&lt;br /&gt;
 import org.springframework.web.client.RestTemplate;&lt;br /&gt;
&lt;br /&gt;
======Declaración de las variables======&lt;br /&gt;
   @Autowired&lt;br /&gt;
   private RestTemplate restTemplate;&lt;br /&gt;
   private MockRestServiceServer mockServer;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
======Preparación de cada uno de los test======&lt;br /&gt;
    @Before&lt;br /&gt;
    public void setUp() {&lt;br /&gt;
        mockMvc = MockMvcBuilders.standaloneSetup(instanciaDeClaseATestear).build();&lt;br /&gt;
        mockServer = MockRestServiceServer.createServer(restTemplate);&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
En los tests propiamente dichos, preparar las peticiones esperadas y sus respectivas respuestas:&lt;br /&gt;
&lt;br /&gt;
 ResponseActions responseAction = mockServer&lt;br /&gt;
           .expect(RequestMatchers.requestTo(&amp;quot;http://miURL:puerto/recurso&amp;quot;));                &lt;br /&gt;
        responseAction&lt;br /&gt;
           .andExpect(RequestMatchers.header(&amp;quot;Accept&amp;quot;, &amp;quot;application/json&amp;quot;))&lt;br /&gt;
           .andRespond(ResponseCreators.withStatus(HttpStatus.BAD_REQUEST));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, en el caso anterior, se espera que cuando sea llamada la URL &amp;quot;http://miURL:puerto/recurso&amp;quot; se responda con un 404.&lt;br /&gt;
A partir de este punto, ya se pueden ejercitar los métodos de nuestras clases que invoquen a los servicios REST con las URL configuradas.&lt;br /&gt;
Aclaración: en el caso que querramos esperar varias peticiones, las mismas tienen que ser declaradas en el orden en el que serán invocadas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://static.springsource.org/spring-social/docs/1.0.x/api/org/springframework/social/test/client/MockRestServiceServer.html API Oficial]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_REST_con_Spring&amp;diff=6743</id>
		<title>Mock REST con Spring</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_REST_con_Spring&amp;diff=6743"/>
				<updated>2012-10-23T15:51:34Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Usando MockRestServiceServer para testear un cliente Rest en componente===&lt;br /&gt;
&lt;br /&gt;
====Situación====&lt;br /&gt;
	Capa de acceso a datos que interactúa como cliente de un servicio REST.&lt;br /&gt;
====Necesidad====&lt;br /&gt;
	Construir tests de componente del DAO, que queden auto-contenidos.&lt;br /&gt;
	&lt;br /&gt;
Para resolver este problema, recurrimos a la clase MockRestServiceServer, incluida en los jars de spring social (y también en el core de Spring a partir de las últimas versiones).&lt;br /&gt;
Para poder utilizar una instancia de esta clase, se debe crear a partir de una instancia de la clase RestTemplate. &lt;br /&gt;
Dicho elemento debe ser declarado en el archivo xml de configuración de contexto de nuestros tests.&lt;br /&gt;
&lt;br /&gt;
=====Archivo de contexto=====&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;restTemplate&amp;quot; class=&amp;quot;org.springframework.web.client.RestTemplate&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;constructor-arg ref=&amp;quot;httpClientFactory&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;property name=&amp;quot;messageConverters&amp;quot;&amp;gt;&lt;br /&gt;
 		&amp;lt;list&amp;gt;&lt;br /&gt;
 			&amp;lt;bean  class=&amp;quot;org.springframework.http.converter.json.MappingJacksonHttpMessageConverter&amp;quot;/&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;
&lt;br /&gt;
=====En la clase de Test=====&lt;br /&gt;
&lt;br /&gt;
======imports======&lt;br /&gt;
 import org.springframework.test.web.client.MockRestServiceServer;&lt;br /&gt;
 import org.springframework.test.web.client.RequestMatchers;&lt;br /&gt;
 import org.springframework.test.web.client.ResponseActions;&lt;br /&gt;
 import org.springframework.test.web.client.ResponseCreators;&lt;br /&gt;
 import org.springframework.test.web.server.MockMvc;&lt;br /&gt;
 import static org.springframework.test.web.server.request.MockMvcRequestBuilders.post;&lt;br /&gt;
 import static org.springframework.test.web.server.result.MockMvcResultMatchers.status;&lt;br /&gt;
 import org.springframework.test.web.server.setup.MockMvcBuilders;&lt;br /&gt;
 import org.springframework.web.client.RestTemplate;&lt;br /&gt;
&lt;br /&gt;
======Declaración de las variables======&lt;br /&gt;
   @Autowired&lt;br /&gt;
   private RestTemplate restTemplate;&lt;br /&gt;
   private MockRestServiceServer mockServer;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
======Preparación de cada uno de los test======&lt;br /&gt;
    @Before&lt;br /&gt;
    public void setUp() {&lt;br /&gt;
        mockMvc = MockMvcBuilders.standaloneSetup(instanciaDeClaseATestear).build();&lt;br /&gt;
        mockServer = MockRestServiceServer.createServer(restTemplate);&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
En los tests propiamente dichos, preparar las peticiones esperadas y sus respectivas respuestas:&lt;br /&gt;
&lt;br /&gt;
 ResponseActions responseAction = mockServer&lt;br /&gt;
           .expect(RequestMatchers.requestTo(&amp;quot;http://miURL:puerto/recurso&amp;quot;));                &lt;br /&gt;
        responseAction&lt;br /&gt;
           .andExpect(RequestMatchers.header(&amp;quot;Accept&amp;quot;, &amp;quot;application/json&amp;quot;))&lt;br /&gt;
           .andRespond(ResponseCreators.withStatus(HttpStatus.BAD_REQUEST));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, en el caso anterior, se espera que cuando sea llamada la URL &amp;quot;http://miURL:puerto/recurso&amp;quot; se responda con un 404.&lt;br /&gt;
A partir de este punto, ya se pueden ejercitar los métodos de nuestras clases que invoquen a los servicios REST con las URL configuradas.&lt;br /&gt;
Aclaración: en el caso que querramos esperar varias peticiones, las mismas tienen que ser declaradas en el orden en el que serán invocadas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://static.springsource.org/spring-social/docs/1.0.x/api/org/springframework/social/test/client/MockRestServiceServer.html API Oficial]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_REST_con_Spring&amp;diff=6742</id>
		<title>Mock REST con Spring</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_REST_con_Spring&amp;diff=6742"/>
				<updated>2012-10-23T15:32:22Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Archivo de contexto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Usando MockRestServiceServer para testear un cliente Rest en componente===&lt;br /&gt;
&lt;br /&gt;
====Situación====&lt;br /&gt;
	Capa de acceso a datos que interactúa como cliente de un servicio REST.&lt;br /&gt;
====Necesidad====&lt;br /&gt;
	Construir tests de componente del DAO, que queden auto-contenidos.&lt;br /&gt;
	&lt;br /&gt;
Para resolver este problema, recurrimos a la clase MockRestServiceServer, incluida en los jars de spring social (y también en el core de Spring a partir de las últimas versiones).&lt;br /&gt;
Para poder utilizar una instancia de esta clase, se debe crear a partir de una instancia de la clase RestTemplate. &lt;br /&gt;
Dicho elemento debe ser declarado en el archivo xml de configuración de contexto de nuestros tests.&lt;br /&gt;
&lt;br /&gt;
=====Archivo de contexto=====&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;restTemplate&amp;quot; class=&amp;quot;org.springframework.web.client.RestTemplate&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;constructor-arg ref=&amp;quot;httpClientFactory&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;property name=&amp;quot;messageConverters&amp;quot;&amp;gt;&lt;br /&gt;
 		&amp;lt;list&amp;gt;&lt;br /&gt;
 			&amp;lt;bean  class=&amp;quot;org.springframework.http.converter.json.MappingJacksonHttpMessageConverter&amp;quot;/&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;
&lt;br /&gt;
=====En la clase de Test=====&lt;br /&gt;
&lt;br /&gt;
======imports======&lt;br /&gt;
 import org.springframework.test.web.client.MockRestServiceServer;&lt;br /&gt;
 import org.springframework.test.web.client.RequestMatchers;&lt;br /&gt;
 import org.springframework.test.web.client.ResponseActions;&lt;br /&gt;
 import org.springframework.test.web.client.ResponseCreators;&lt;br /&gt;
 import org.springframework.test.web.server.MockMvc;&lt;br /&gt;
 import static org.springframework.test.web.server.request.MockMvcRequestBuilders.post;&lt;br /&gt;
 import static org.springframework.test.web.server.result.MockMvcResultMatchers.status;&lt;br /&gt;
 import org.springframework.test.web.server.setup.MockMvcBuilders;&lt;br /&gt;
 import org.springframework.web.client.RestTemplate;&lt;br /&gt;
&lt;br /&gt;
======Declaración de las variables======&lt;br /&gt;
   @Autowired&lt;br /&gt;
   private RestTemplate restTemplate;&lt;br /&gt;
   private MockRestServiceServer mockServer;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
======Preparación de cada uno de los test======&lt;br /&gt;
    @Before&lt;br /&gt;
    public void setUp() {&lt;br /&gt;
        mockMvc = MockMvcBuilders.standaloneSetup(instanciaDeClaseATestear).build();&lt;br /&gt;
        mockServer = MockRestServiceServer.createServer(restTemplate);&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
En los tests propiamente dichos, preparar las peticiones esperadas y sus respectivas respuestas:&lt;br /&gt;
&lt;br /&gt;
 ResponseActions responseAction = mockServer&lt;br /&gt;
           .expect(RequestMatchers.requestTo(&amp;quot;http://miURL:puerto/recurso&amp;quot;));                &lt;br /&gt;
        responseAction&lt;br /&gt;
           .andExpect(RequestMatchers.header(&amp;quot;Accept&amp;quot;, &amp;quot;application/json&amp;quot;))&lt;br /&gt;
           .andRespond(ResponseCreators.withStatus(HttpStatus.BAD_REQUEST));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, en el caso anterior, se espera que cuando sea llamada la URL &amp;quot;http://miURL:puerto/recurso&amp;quot; se responda con un 404.&lt;br /&gt;
A partir de este punto, ya se pueden ejercitar los métodos de nuestras clases que invoquen a los servicios REST con las URL configuradas.&lt;br /&gt;
Aclaración: en el caso que querramos esperar varias peticiones, las mismas tienen que ser declaradas en el orden en el que serán invocadas.&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_REST_con_Spring&amp;diff=6741</id>
		<title>Mock REST con Spring</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_REST_con_Spring&amp;diff=6741"/>
				<updated>2012-10-23T15:31:48Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: Página creada con '=== Usando MockRestServiceServer para testear un cliente Rest en componente===  ====Situación==== 	Capa de acceso a datos que interactúa como cliente de un servicio REST. ====…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Usando MockRestServiceServer para testear un cliente Rest en componente===&lt;br /&gt;
&lt;br /&gt;
====Situación====&lt;br /&gt;
	Capa de acceso a datos que interactúa como cliente de un servicio REST.&lt;br /&gt;
====Necesidad====&lt;br /&gt;
	Construir tests de componente del DAO, que queden auto-contenidos.&lt;br /&gt;
	&lt;br /&gt;
Para resolver este problema, recurrimos a la clase MockRestServiceServer, incluida en los jars de spring social (y también en el core de Spring a partir de las últimas versiones).&lt;br /&gt;
Para poder utilizar una instancia de esta clase, se debe crear a partir de una instancia de la clase RestTemplate. &lt;br /&gt;
Dicho elemento debe ser declarado en el archivo xml de configuración de contexto de nuestros tests.&lt;br /&gt;
&lt;br /&gt;
=====Archivo de contexto=====&lt;br /&gt;
&amp;lt;bean id=&amp;quot;restTemplate&amp;quot; class=&amp;quot;org.springframework.web.client.RestTemplate&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;constructor-arg ref=&amp;quot;httpClientFactory&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;property name=&amp;quot;messageConverters&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;list&amp;gt;&lt;br /&gt;
			&amp;lt;bean class=&amp;quot;org.springframework.http.converter.json.MappingJacksonHttpMessageConverter&amp;quot;/&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;
&lt;br /&gt;
=====En la clase de Test=====&lt;br /&gt;
&lt;br /&gt;
======imports======&lt;br /&gt;
 import org.springframework.test.web.client.MockRestServiceServer;&lt;br /&gt;
 import org.springframework.test.web.client.RequestMatchers;&lt;br /&gt;
 import org.springframework.test.web.client.ResponseActions;&lt;br /&gt;
 import org.springframework.test.web.client.ResponseCreators;&lt;br /&gt;
 import org.springframework.test.web.server.MockMvc;&lt;br /&gt;
 import static org.springframework.test.web.server.request.MockMvcRequestBuilders.post;&lt;br /&gt;
 import static org.springframework.test.web.server.result.MockMvcResultMatchers.status;&lt;br /&gt;
 import org.springframework.test.web.server.setup.MockMvcBuilders;&lt;br /&gt;
 import org.springframework.web.client.RestTemplate;&lt;br /&gt;
&lt;br /&gt;
======Declaración de las variables======&lt;br /&gt;
   @Autowired&lt;br /&gt;
   private RestTemplate restTemplate;&lt;br /&gt;
   private MockRestServiceServer mockServer;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
======Preparación de cada uno de los test======&lt;br /&gt;
    @Before&lt;br /&gt;
    public void setUp() {&lt;br /&gt;
        mockMvc = MockMvcBuilders.standaloneSetup(instanciaDeClaseATestear).build();&lt;br /&gt;
        mockServer = MockRestServiceServer.createServer(restTemplate);&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
En los tests propiamente dichos, preparar las peticiones esperadas y sus respectivas respuestas:&lt;br /&gt;
&lt;br /&gt;
 ResponseActions responseAction = mockServer&lt;br /&gt;
           .expect(RequestMatchers.requestTo(&amp;quot;http://miURL:puerto/recurso&amp;quot;));                &lt;br /&gt;
        responseAction&lt;br /&gt;
           .andExpect(RequestMatchers.header(&amp;quot;Accept&amp;quot;, &amp;quot;application/json&amp;quot;))&lt;br /&gt;
           .andRespond(ResponseCreators.withStatus(HttpStatus.BAD_REQUEST));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, en el caso anterior, se espera que cuando sea llamada la URL &amp;quot;http://miURL:puerto/recurso&amp;quot; se responda con un 404.&lt;br /&gt;
A partir de este punto, ya se pueden ejercitar los métodos de nuestras clases que invoquen a los servicios REST con las URL configuradas.&lt;br /&gt;
Aclaración: en el caso que querramos esperar varias peticiones, las mismas tienen que ser declaradas en el orden en el que serán invocadas.&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=REST_con_Spring&amp;diff=6740</id>
		<title>REST con Spring</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=REST_con_Spring&amp;diff=6740"/>
				<updated>2012-10-23T15:27:05Z</updated>
		
		<summary type="html">&lt;p&gt;Emiliano.tebes: /* Descargar un proyecto de ejemplo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Spring Framework]] 3.x trae la posibilidad de crear servicios web REST de manera muy simple. &lt;br /&gt;
&lt;br /&gt;
== Un ejemplo ==&lt;br /&gt;
Vamos a realizar una aplicación que responda a las siguientes URL: &lt;br /&gt;
&lt;br /&gt;
 /persona/todos   : devuelve todas las personas&lt;br /&gt;
 /persona/123     : devuelve la persona cuyo id es 123&lt;br /&gt;
&lt;br /&gt;
Tendremos que seguir 3 pasos:&lt;br /&gt;
# Configurar el servlet de Spring&lt;br /&gt;
# Crear la clase que atenderá y resolverá estas peticiones&lt;br /&gt;
# Configurar Spring&lt;br /&gt;
&lt;br /&gt;
=== El servlet de Spring ===&lt;br /&gt;
Lo primero es configurar el servlet de Spring que se encargará de tomas las peticiones y redireccionarla a las clases correspondientes. La clase que se encarga de esto es ''org.springframework.web.servlet.DispatcherServlet''. Un archivo web.xml de ejemplo sería: &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;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;web-app version=&amp;quot;2.5&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/javaee&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;display-name&amp;gt;json-con-spring-mvc&amp;lt;/display-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;filter&amp;gt;&lt;br /&gt;
        &amp;lt;filter-name&amp;gt;characterEncodingFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;
        &amp;lt;filter-class&amp;gt;org.springframework.web.filter.CharacterEncodingFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
            &amp;lt;param-name&amp;gt;encoding&amp;lt;/param-name&amp;gt;&lt;br /&gt;
            &amp;lt;param-value&amp;gt;UTF-8&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;forceEncoding&amp;lt;/param-name&amp;gt;&lt;br /&gt;
            &amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
    &amp;lt;/filter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;filter-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;filter-name&amp;gt;characterEncodingFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;servlet&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Spring MVC Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
            &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;
            &amp;lt;param-value&amp;gt;&lt;br /&gt;
			WEB-INF/applicationContext-clasico.xml&lt;br /&gt;
            &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;Spring MVC Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;/app/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;session-config&amp;gt;&lt;br /&gt;
        &amp;lt;session-timeout&amp;gt;&lt;br /&gt;
            30&lt;br /&gt;
        &amp;lt;/session-timeout&amp;gt;&lt;br /&gt;
    &amp;lt;/session-config&amp;gt;&lt;br /&gt;
    &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
        &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
    &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
&amp;lt;/web-app&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este ejemplo, el servlet de Spring queda atendiendo todas las URL que empiecen con &amp;quot;/app&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
=== El controller ===&lt;br /&gt;
La clase que toma las peticiones HTTP es una clase Java anotada con @Controller. Esta clase asocia las URL con métodos. Los objetos que devuelven los métodos son luego procesador por conversores, que representan la respuesta de distinta manera (XML, JSON, etc.)&lt;br /&gt;
&lt;br /&gt;
Para esto, creamos una clase de la siguiente forma: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
package com.dosideas.jsonconspringmvc;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.Collection;&lt;br /&gt;
import org.springframework.stereotype.Controller;&lt;br /&gt;
import org.springframework.web.bind.annotation.PathVariable;&lt;br /&gt;
import org.springframework.web.bind.annotation.RequestBody;&lt;br /&gt;
import org.springframework.web.bind.annotation.RequestMapping;&lt;br /&gt;
import org.springframework.web.bind.annotation.ResponseBody;&lt;br /&gt;
&lt;br /&gt;
@Controller&lt;br /&gt;
@RequestMapping(value=&amp;quot;/persona&amp;quot;)&lt;br /&gt;
public class PersonaController {&lt;br /&gt;
&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/{id}&amp;quot;)&lt;br /&gt;
    public @ResponseBody Persona get(@PathVariable Long id) {&lt;br /&gt;
        Persona p = new Persona(&amp;quot;Invasor &amp;quot; + id, &amp;quot;Zim &amp;quot; + id);&lt;br /&gt;
        return p;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/todos&amp;quot;)&lt;br /&gt;
    public @ResponseBody Collection&amp;lt;Persona&amp;gt; getTodos() {&lt;br /&gt;
        Collection&amp;lt;Persona&amp;gt; personas = new ArrayList&amp;lt;Persona&amp;gt;();&lt;br /&gt;
        for (int i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
            Persona p = new Persona(&amp;quot;Invasor &amp;quot; + i, &amp;quot;Zim&amp;quot; + i);&lt;br /&gt;
            personas.add(p);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return personas;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El objeto Persona es un POJO que tiene dos atributos: nombre y apellido. Los tags @RequestMapping se encargan de asociar la clase y cada uno de sus métodos con una URL en particular. &lt;br /&gt;
&lt;br /&gt;
=== La configuración ===&lt;br /&gt;
Lo último que nos queda configurar es Spring con un archivo clásico (el cual es referenciado por el servlet):  &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;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:p=&amp;quot;http://www.springframework.org/schema/p&amp;quot;&lt;br /&gt;
       xmlns:aop=&amp;quot;http://www.springframework.org/schema/aop&amp;quot;&lt;br /&gt;
       xmlns:tx=&amp;quot;http://www.springframework.org/schema/tx&amp;quot;&lt;br /&gt;
       xmlns:context=&amp;quot;http://www.springframework.org/schema/context&amp;quot;&lt;br /&gt;
       xmlns:mvc=&amp;quot;http://www.springframework.org/schema/mvc&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/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;context:component-scan base-package=&amp;quot;com.dosideas.jsonconspringmvc&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;mvc:annotation-driven /&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;
El tag ''mvc:annotation-driven'' se encarga de configurar automáticamente para emepezar a recibir y responder peticiones usando los controladores encontrados. &lt;br /&gt;
&lt;br /&gt;
Más aún, la configuración predeterminada se encarga de realizar [http://en.wikipedia.org/wiki/Content_negotiation negociación de contenido]: la respuesta se formatea de acuerdo a las capacidades del cliente. Por ejemplo, si en el classpath tenemos agregado las librerías de Jackson (un parser JSON), se habilitará el soporte JSON correspondiente. Si están agregadas las librerías de JAXB2, se habilitará el soporte XML. &lt;br /&gt;
&lt;br /&gt;
=== Probando ===&lt;br /&gt;
Podemos crear una prueba [[JUnit]] para acceder a nuestro servicio: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
package com.dosideas.jsonconspringmvc;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import org.apache.commons.httpclient.methods.GetMethod;&lt;br /&gt;
import org.apache.commons.httpclient.HttpMethod;&lt;br /&gt;
import org.apache.commons.httpclient.HttpClient;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
import static org.junit.Assert.*;&lt;br /&gt;
&lt;br /&gt;
public class HttpTest {&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void personaTodosJSON() throws IOException {&lt;br /&gt;
        HttpClient httpclient = new HttpClient();&lt;br /&gt;
        HttpMethod method = new GetMethod(&amp;quot;http://localhost:8084/json-con-spring-mvc/app/persona/todos&amp;quot;);&lt;br /&gt;
        method.addRequestHeader(&amp;quot;accept&amp;quot;, &amp;quot;application/json&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        httpclient.executeMethod(method);&lt;br /&gt;
        String resultado = method.getResponseBodyAsString();&lt;br /&gt;
        System.out.println(resultado);&lt;br /&gt;
&lt;br /&gt;
        assertNotNull(resultado);&lt;br /&gt;
        assertTrue(resultado.startsWith(&amp;quot;[{\&amp;quot;&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void personaPorIdJSON() throws IOException {&lt;br /&gt;
        HttpClient httpclient = new HttpClient();&lt;br /&gt;
        HttpMethod method = new GetMethod(&amp;quot;http://localhost:8084/json-con-spring-mvc/app/persona/34421&amp;quot;);&lt;br /&gt;
        method.addRequestHeader(&amp;quot;accept&amp;quot;, &amp;quot;application/json&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        httpclient.executeMethod(method);&lt;br /&gt;
        String resultado = method.getResponseBodyAsString();&lt;br /&gt;
        System.out.println(resultado);&lt;br /&gt;
&lt;br /&gt;
        assertNotNull(resultado);&lt;br /&gt;
        assertTrue(resultado.startsWith(&amp;quot;{\&amp;quot;&amp;quot;));&lt;br /&gt;
        assertTrue(resultado.contains(&amp;quot;34421&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void personaPorIdXML() throws IOException {&lt;br /&gt;
        HttpClient httpclient = new HttpClient();&lt;br /&gt;
        HttpMethod method = new GetMethod(&amp;quot;http://localhost:8084/json-con-spring-mvc/app/persona/34421&amp;quot;);&lt;br /&gt;
        method.addRequestHeader(&amp;quot;accept&amp;quot;, &amp;quot;application/xml&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        httpclient.executeMethod(method);&lt;br /&gt;
        String resultado = method.getResponseBodyAsString();&lt;br /&gt;
        System.out.println(resultado);&lt;br /&gt;
&lt;br /&gt;
        assertNotNull(resultado);&lt;br /&gt;
        assertTrue(resultado.startsWith(&amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;&amp;quot;));&lt;br /&gt;
        assertTrue(resultado.contains(&amp;quot;34421&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Manejo de errores ==&lt;br /&gt;
Es posible personalizar las excepciones para que devuelvan códigos de estado HTTP personalizados, usando la anotación @ResponseStatus en la excepción lanzada. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@ResponseStatus(value=HttpStatus.NOT_FOUND, reason=&amp;quot;No se encontró el recurso pedido&amp;quot;)&lt;br /&gt;
public class NotFoundException extends RuntimeException { ... }&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
@Controller&lt;br /&gt;
@RequestMapping(value=&amp;quot;/persona&amp;quot;)&lt;br /&gt;
public class PersonaController {&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/id/{id}&amp;quot;)&lt;br /&gt;
    public @ResponseBody Persona findById(@PathVariable long id) {&lt;br /&gt;
       Contact contact = personaService.findById(id);&lt;br /&gt;
       if (contact == null) {&lt;br /&gt;
           throw new NotFoundException();&lt;br /&gt;
       } else {&lt;br /&gt;
           return contact;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Otra forma de personalizar las excepciones, es interceptar las excepciones del controller(@Controller) y personalizarla en el mismo controller. &lt;br /&gt;
Para esto debemos crear un método handleException por cada excepción que deseemos personalizar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@Controller&lt;br /&gt;
@RequestMapping(value=&amp;quot;/persona&amp;quot;)&lt;br /&gt;
public class PersonaController {&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/id/{id}&amp;quot;)&lt;br /&gt;
    public @ResponseBody Persona findById(@PathVariable long id) {&lt;br /&gt;
       Contact contact = personaService.findById(id);&lt;br /&gt;
       if (contact == null) {&lt;br /&gt;
           throw new NotFoundException();&lt;br /&gt;
       } else {&lt;br /&gt;
           return contact;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @ResponseStatus(HttpStatus.NOT_FOUND)&lt;br /&gt;
    @ExceptionHandler(NotFoundException.class)&lt;br /&gt;
    @ResponseBody&lt;br /&gt;
    public Map&amp;lt;String, String&amp;gt; handleException(NotFoundException exception) {&lt;br /&gt;
        return Collections.singletonMap(&amp;quot;message&amp;quot;, &amp;quot;No se encontró el recurso pedido&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y agregar lo siguiente en el applicationContext.xml&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:p=&amp;quot;http://www.springframework.org/schema/p&amp;quot;&lt;br /&gt;
       xmlns:aop=&amp;quot;http://www.springframework.org/schema/aop&amp;quot;&lt;br /&gt;
       xmlns:tx=&amp;quot;http://www.springframework.org/schema/tx&amp;quot;&lt;br /&gt;
       xmlns:context=&amp;quot;http://www.springframework.org/schema/context&amp;quot;&lt;br /&gt;
       xmlns:mvc=&amp;quot;http://www.springframework.org/schema/mvc&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/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;context:component-scan base-package=&amp;quot;com.dosideas.jsonconspringmvc&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;mvc:annotation-driven /&amp;gt;&lt;br /&gt;
    &amp;lt;bean class=&amp;quot;org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;messageConverters&amp;quot;&amp;gt;&lt;br /&gt;
	    &amp;lt;list&amp;gt;&lt;br /&gt;
	        &amp;lt;bean class=&amp;quot;org.springframework.http.converter.json.MappingJacksonHttpMessageConverter&amp;quot; /&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;/beans&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Al utilizar este interceptor se debe personalizar las excepciones en todos los controladores, caso contrario la excepción no es customizada y retorna un status code 500.&lt;br /&gt;
La propiedad &amp;quot;messageConverters&amp;quot;, define que conversor utilizar en el ResponseBody, en nuestro caso lo estamos pasando a Json.&lt;br /&gt;
&lt;br /&gt;
En caso de que se quiera utilizar los 2 métodos, el de @ResponseStatus y el de @ExceptionHandler, se deben registrar los 2 Handler en el applicationContext.xml con el orden de ejecución.&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;order&amp;quot; value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;messageConverters&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;list&amp;gt;&lt;br /&gt;
            &amp;lt;bean class=&amp;quot;org.springframework.http.converter.json.MappingJacksonHttpMessageConverter&amp;quot; /&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;
&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;order&amp;quot; value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Manejo de la respuesta ==&lt;br /&gt;
La anotación @ResponseStatus puede usarse para personalizar el código HTTP de cualquier respuesta, al ubicarla en el método. &lt;br /&gt;
Por ejemplo, los métodos que devuelven void pueden usar esta anotación para indicar que no hay contenido (es útil si, por ejemplo, se parsea el contenido con algunas librerías como [[JQuery]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/delete/{id}&amp;quot;)&lt;br /&gt;
    @ResponseStatus(HttpStatus.NO_CONTENT)&lt;br /&gt;
    public void delete(@PathVariable long id) {&lt;br /&gt;
        contactService.delete(id);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Descargar un proyecto de ejemplo ===&lt;br /&gt;
Les dejamos para [http://www.dosideas.com/descargas/category/2-spring-framework.html?download=41%3Ap descargar un proyecto de ejemplo de REST con Spring MVC] donde tienen todos los fuentes necesarios para abrir y ejecutar el ejemplo de esta página.&lt;br /&gt;
&lt;br /&gt;
=== Test con componentes mock de un cliente REST===&lt;br /&gt;
* [[Mock REST con Spring]]&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://www.dosideas.com/descargas/category/2-spring-framework.html?download=41%3Ap Descargar un proyecto de ejemplo]&lt;br /&gt;
* [[Restfuse]] - testing de servicios REST.&lt;br /&gt;
* [[Spring Test MVC]] - testing de controladores de Spring.&lt;br /&gt;
* [http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch18.html Creating Restful services - Documentación oficial]&lt;br /&gt;
* [http://www.informit.com/guides/content.aspx?g=java&amp;amp;seqNum=544 Creating Restful web services]&lt;br /&gt;
* [http://www.ibm.com/developerworks/web/library/wa-spring3webserv/index.html?ca=drs- Building RESTful web services using Spring 3]&lt;br /&gt;
* [http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=springRestJson Spring + REST + JSON = SOAUI]&lt;br /&gt;
* [http://www.jpalace.org/docs/spring/rest.html Sprint REST Tutorial]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Spring MVC]]&lt;/div&gt;</summary>
		<author><name>Emiliano.tebes</name></author>	</entry>

	</feed>