<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mundo Geek &#187; vista</title>
	<atom:link href="http://mundogeek.net/etiqueta/vista/feed/" rel="self" type="application/rss+xml" />
	<link>http://mundogeek.net</link>
	<description>Mundo geek, bitácora sobre todo lo geek: software, gadgets, tecnología, internet, ...</description>
	<lastBuildDate>Wed, 08 Feb 2012 16:09:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>¿Einstein o Marilyn? Comprueba cómo tienes la vista</title>
		<link>http://mundogeek.net/archivos/2011/07/31/einstein-o-marliyn-comprueba-como-tienes-la-vista/</link>
		<comments>http://mundogeek.net/archivos/2011/07/31/einstein-o-marliyn-comprueba-como-tienes-la-vista/#comments</comments>
		<pubDate>Sun, 31 Jul 2011 15:43:19 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[imagen]]></category>
		<category><![CDATA[miopia]]></category>
		<category><![CDATA[prueba]]></category>
		<category><![CDATA[vista]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=7142</guid>
		<description><![CDATA[Esta curiosa imagen, creada por Aude Oliva, profesora del Departmento del Cerebro y las Ciencias Cognitivas del MIT, permite comprobar fácilmente si sufres de miopía, uno de los problemas oculares más comunes entre la población mundial. Si ves a Albert Einstein estando sentado a una distancia normal de la pantalla, tienes una vista normal. Si, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://lifehacker.com/5823098/monroe-or-einstein-check-if-you-need-glasses-at-your-computer">Esta</a> curiosa imagen, creada por <a href="http://cvcl.mit.edu/aude.htm">Aude Oliva</a>, profesora del Departmento del Cerebro y las Ciencias Cognitivas del MIT, permite comprobar fácilmente si sufres de miopía, uno de los problemas oculares más comunes entre la población mundial. Si ves a Albert Einstein estando sentado a una distancia normal de la pantalla, tienes una vista normal. Si, por el contrario, ves a Marilyn Monroe, es posible que tengas miopía.</p>
<p>Sea cual sea el resultado, en todo caso, no dejes de leer mis <a href="http://mundogeek.net/archivos/2009/04/06/10-consejos-para-cuidar-tu-vista-al-usar-el-ordenador/">10 consejos para cuidar tu vista al usar el ordenador</a>.<span id="more-7142"></span></p>
<div style="text-align:center"><img src="http://mundogeek.net/wp-content/prueba-miopia.jpg" alt="Prueba de miopía"/></div>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2011/07/31/einstein-o-marliyn-comprueba-como-tienes-la-vista/feed/</wfw:commentRss>
		<slash:comments>98</slash:comments>
		</item>
		<item>
		<title>10 consejos para cuidar tu vista al usar el ordenador</title>
		<link>http://mundogeek.net/archivos/2009/04/06/10-consejos-para-cuidar-tu-vista-al-usar-el-ordenador/</link>
		<comments>http://mundogeek.net/archivos/2009/04/06/10-consejos-para-cuidar-tu-vista-al-usar-el-ordenador/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 11:44:12 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[monitores]]></category>
		<category><![CDATA[ojos]]></category>
		<category><![CDATA[salud]]></category>
		<category><![CDATA[vista]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=2938</guid>
		<description><![CDATA[Tengas problemas actualmente con la vista o no los tengas, la salud de los ojos es algo que nunca debemos descuidar. Mucho menos las personas que pasamos horas y horas frente a un monitor, como es el caso de muchos lectores de Mundo geek. Os dejo por tanto algunos consejos que he ido recopilando a [...]]]></description>
			<content:encoded><![CDATA[<p>Tengas problemas actualmente con la vista o no los tengas, la salud de los ojos es algo que nunca debemos descuidar. Mucho menos las personas que pasamos horas y horas frente a un monitor, como es el caso de muchos lectores de <a href="http://mundogeek.net/" title="Mundo geek">Mundo geek</a>. Os dejo por tanto algunos consejos que he ido recopilando a lo largo de los años a base de experiencia y de lectura.</p>
<p>Y si hay algún oftalmólogo en la sala que quiera dar su opinión, seguro que a todos nos encantaría leerla <img src='http://mundogeek.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
<span id="more-2938"></span></p>
<ol>
<li>Haz descansos cada cierto tiempo. Por ejemplo, una pausa de 5 minutos cada hora. En esto te puede ayudar, por ejemplo, <a href="http://mundogeek.net/workaholic/" title="Programa que te recuerda tomar un descanso del ordenador cada cierto tiempo">Workaholic</a>.</li>
<li>Para descansar los ojos tápalos con las manos y ábrelos para mirar a la oscuridad. Esto relaja más la vista que simplemente cerrarlos. Otro ejercicio que puedes utilizar es alternar la vista entre un objeto cercano y uno lejano.</li>
<li>Establece el brillo del monitor al mínimo posible con el que te encuentres cómodo. Para contrarrestarlo, pon el contraste al máximo posible con el que te encuentres cómodo.</li>
<li>Recuerda parpadear. Parece una tontería pero debido a la concentración tendemos a hacerlo mucho menos de lo normal. La frecuencia de parpadeo media en un adulto es de unas 20 veces por minuto, mientras que cuando utilizamos un ordenador, la frecuencia baja hasta los 5 por minuto. Si aun así notas que tienes los ojos secos también puedes recurrir a un colirio. Consulta con tu oftalmólogo o tu farmacéutico.</li>
<li>Asegúrate de que hay suficiente luz. Mucho mejor si es natural. Eso si, ten en cuenta que el exceso de luz también puede ser perjudicial.</li>
<li>Evita los reflejos. Es importante tener en cuenta la posición del monitor respecto de las fuentes de luz y evitar los monitores del tipo glossy como los TrueLife de Dell o los Glossy Display de Apple. Estas pantallas cuentan con un acabado brillante muy reflectante. Además suelen ser más caras que sus contrapartidas con acabado mate.</li>
<li>Mantén el monitor a unos 60 centímetros de distancia.</li>
<li>Si es posible, utiliza un monitor de tipo TFT. Cansan mucho menos la vista que los CRT.</li>
<li>Si no te queda más remedio que utilizar un CRT, o si lo prefieres debido a tu trabajo, asegúrate de subir el refresco de la pantalla al máximo posible.</li>
<li>No cometas la locura de utilizar el ordenador para leer libros, manuales, o cualquier otro tipo de documento extenso; imprimelo. Si sueles leer mucho, también te puede interesar comprar un <a href="http://mundogeek.net/archivos/2008/01/19/lectores-de-libros-de-tinta-electronica/" title="Libros electrónicos">libro electrónico</a>, como el <a href="http://mundogeek.net/archivos/2008/01/30/libro-electronico-hanlin-v3/" title="Libro electrónico Hanlin v3">Hanlin v3</a>.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2009/04/06/10-consejos-para-cuidar-tu-vista-al-usar-el-ordenador/feed/</wfw:commentRss>
		<slash:comments>60</slash:comments>
		</item>
		<item>
		<title>Etiquetas Struts 2</title>
		<link>http://mundogeek.net/archivos/2009/02/13/etiquetas-struts-2/</link>
		<comments>http://mundogeek.net/archivos/2009/02/13/etiquetas-struts-2/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 19:57:23 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[etiquetas]]></category>
		<category><![CDATA[struts 2]]></category>
		<category><![CDATA[vista]]></category>

		<guid isPermaLink="false">http://mundogeek.net/archivos/2009/02/13/etiquetas-struts-2/</guid>
		<description><![CDATA[Struts 2 proporciona una librería de etiquetas que facilitan, entre otras, las tareas de validación e internacionalización. Estas etiquetas, cuyo TLD podemos encontrar en META-INF/struts-tags.tld, en el jar de struts2-core, pueden utilizarse tanto con JSP como con Velocity o FreeMarker. A continuación veremos una lista con las distintas etiquetas, una pequeña definición, la clase que [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://mundogeek.net/archivos/2009/02/08/struts-2/" title="Struts 2">Struts 2</a> proporciona una librería de etiquetas que facilitan, entre otras, las tareas de validación e internacionalización. Estas etiquetas, cuyo TLD podemos encontrar en META-INF/struts-tags.tld, en el jar de struts2-core, pueden utilizarse tanto con JSP como con Velocity o FreeMarker.</p>
<p>A continuación veremos una lista con las distintas etiquetas, una pequeña definición, la clase que las implementa, algunos atributos útiles y, cuando se ha considerado necesario, un pequeño ejemplo (usando JSP). Sin embargo, para evitar repeticiones, comenzaremos primero enumerando algunos atributos comunes a todas las etiquetas de interfaz de usuario:<br />
<span id="more-2508"></span>
<ul>
<li><code>cssClass</code>: El atributo <code>class</code> de HTML. Indica la clase CSS a utilizar para el elemento HTML generado.</li>
<li><code>cssStyle</code>: El atributo <code>style</code> de HTML. Permite definir el estilo del elemento <em>inline</em>, en lugar de utilizar un archivo CSS externo o una etiqueta <code>style</code>.</li>
<li><code>disabled</code>: Determina si el control está deshabilitado.</li>
<li><code>label</code>: Etiqueta que acompañará al widget. Genera una clásica etiqueta <code>label</code> de HTML.</li>
<li><code>required</code>: Booleano indicando si el campo es obligatorio. Si es así muestra un asterisco al lado de la etiqueta.</li>
<li><code>tabindex</code>: El atributo <code>tabindex</code> de HTML. Utilizado para establecer el orden a seguir al recorrer los controles cuando el usuario pulsa la tecla de Tabulación</li>
<li><code>template</code>: Plantilla a utilizar.</li>
<li><code>theme</code>: Tema a utilizar.</li>
</ul>
<p>Ahora si, las etiquetas son las siguientes:</p>
<h2>action</h2>
<p>Permite ejecutar una acción desde una vista indicando el nombre de la acción y, opcionalmente, el espacio de nombres. Se puede pasar parámetros utilizando la etiqueta <code>param</code>.<br />
<code>org.apache.struts2.views.jsp.ActionTag</code></p>
<p><code>executeResult</code>: determina si el resultado de la acción (normalmente otra vista) se debe ejecutar / renderizar también.<br />
<code>ignoreContextParams</code>: indica si se deben incluir los parámetros de la petición actual al invocar la acción.<br />
<code>name</code> (requerido): el nombre de la acción a ejecutar.<br />
<code>namespace</code>: el espacio de nombres de la acción a ejecutar.</p>
<p>index.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
Antes de s:action&lt;br/&gt;
&lt;s:action name="Accion" executeResult="true"/&gt;&lt;br/&gt;
Después de s:action
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private String web;

	public String getWeb() {
		return web;
	}

	public String execute() {
		web = "mundogeek.net";
		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

Visita &lt;s:property value="web"/&gt;</pre>
<h2>actionerror</h2>
<p>Muestra los errores que se produjeron en las acciones, si es que existen. Podemos añadir errores utilizando el método <code>addActionError(String error)</code> de la interfaz <code>ValidationAware</code>, que <code>ActionSupport</code> implementa. Los métodos y propiedades de <code>ValidationAware</code> también estarán disponibles en la vista, por lo que es posible en su lugar comprobar si existen errores con el método <code>hasActionErrors()</code> e iterar directamente sobre la colección <code>actionErrors</code>.<br />
<code>org.apache.struts2.views.jsp.ui.ActionErrorTag</code></p>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	public String execute() {
		addActionError("Oh dios mío, ¡un error!");
		return ERROR;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;s:actionerror /&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>actionmessage</h2>
<p>Similar a <code>actionerror</code>, pero en lugar de errores en la acción sirve para mostrar mensajes de la acción, los cuales añadimos utilizando el método <code>addActionMessage(String mensaje)</code> de la interfaz <code>ValidationAware</code>. Como el anterior, también podríamos utilizar el método <code>hasActionMessages()</code> para comprobar la existencia de mensajes e iterar sobre la colección de strings <code>actionMessages</code>.<br />
<code>org.apache.struts2.views.jsp.ui.ActionMessageTag</code></p>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	public String execute() {
		addActionMessage("Tengo un mensaje para usted.");
		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;s:actionmessage/&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>a</h2>
<p>Crea una etiqueta anchor HTML. Se puede utilizar con el tema ajax para generar llamadas asíncronas al servidor.<br />
<code>org.apache.struts2.views.jsp.ui.AnchorTag</code></p>
<p><code>href</code>: La URL a cargar cuando el usuario pulse sobre el enlace.<br />
<code>title</code>: Atributo title de HTML.</p>
<h2>append</h2>
<p>Crea un nuevo iterador a partir de varios iteradores pasados como parámetro en forma de etiquetas <code>param</code>.<br />
<code>org.apache.struts2.views.jsp.iterator.AppendIteratorTag</code></p>
<p><code>var</code>: el nombre que tendrá el iterador resultante en el <code>ValueStack</code>.</p>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private List&lt;String&gt; registrados;
	private List&lt;String&gt; vips;

	public List&lt;String&gt; getRegistrados() {
		return registrados;
	}

	public List&lt;String&gt; getVips() {
		return vips;
	}

	public String execute() {
		registrados = new ArrayList&lt;String&gt;();
		registrados.add("Juan");
		registrados.add("Manuel");

		vips = new ArrayList&lt;String&gt;();
		vips.add("Pedro");
		vips.add("María");

		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;s:append var="usuarios"&gt;
	&lt;s:param value="%{registrados}" /&gt;
	&lt;s:param value="%{vips}" /&gt;
&lt;/s:append&gt;

Usuarios:
&lt;ul&gt;
	&lt;s:iterator value="usuarios"&gt;
		&lt;li&gt;&lt;s:property /&gt;&lt;/li&gt;
	&lt;/s:iterator&gt;
&lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>bean</h2>
<p>Instancia un Java Bean. Se puede pasar valores a las propiedades del bean utilizando etiquetas <code>param</code>.<br />
<code>org.apache.struts2.views.jsp.BeanTag</code></p>
<p><code>name</code> (requerido): La clase a instanciar.<br />
<code>var</code>: Nombre con el que se añadirá la instancia a <code>ValueStack</code>.</p>
<p>Usuario.java</p>
<pre name="code" class="java">public class Usuario {
	private String nombre;

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;s:bean name="Usuario" var="miUsuario"&gt;
	&lt;s:param name="nombre"&gt;Raúl&lt;/s:param&gt;
&lt;/s:bean&gt;

Bienvenido &lt;s:property value="#miUsuario.nombre"/&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>checkbox</h2>
<p>Crea un checkbox HTML. Para una lista de varios checkboxes relacionados podemos utilizar la etiqueta <code>checkboxlist</code>.<br />
</code>org.apache.struts2.views.jsp.ui.CheckboxTag</code></p>
<p><code>value</code>: Booleano que indica si el checkbox está marcado o no.</p>
<p>index.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;s:form action="Accion"&gt;
	&lt;s:checkbox label="Aceptar condiciones" name="condiciones" value="true" /&gt;
	&lt;s:submit value="Enviar" /&gt;
&lt;/s:form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private boolean condiciones;

	public boolean isCondiciones() {
		return condiciones;
	}

	public void setCondiciones(boolean condiciones) {
		this.condiciones = condiciones;
	}

	public String execute() {
		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;s:if test="condiciones"&gt;
Muchas gracias.
&lt;/s:if&gt;
&lt;s:else&gt;
Pues es una lástima.
&lt;/s:else&gt;
&lt;/body&gt;</pre>
<h2>checkboxlist</h2>
<p>Crea una lista de checkboxes relacionados (todos con el mismo atributo <code>name</code>). Esto implica que el valor del elemento no será un booleano indicando si está marcado o no, como en el caso de checkbox, sino una lista con los valores marcados.<br />
<code>org.apache.struts2.views.jsp.ui.CheckboxListTag</code></p>
<p><code>list</code> (requerido): Iterable con los valores con los que generar la lista.<br />
<code>listKey</code>: Propiedad de los objetos del iterable del que el checkbox correspondiente tomará su valor.<br />
<code>listValue</code>: Exactamente igual al anterior, pero en lugar del valor, el contenido.<br />
<code>name</code>: Nombre de los checkboxes.</p>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private List&lt;String&gt; lenguajes;

	public List&lt;String&gt; getLenguajes() {
		return lenguajes;
	}

	public String execute() {
		lenguajes = new ArrayList&lt;String&gt;();
		lenguajes.add("Python");
		lenguajes.add("Java");
		lenguajes.add("Ruby");
		lenguajes.add("C#");
		lenguajes.add("C++");
		lenguajes.add("Lisp");
		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;body&gt;
&lt;s:form&gt;
	&lt;s:checkboxlist list="lenguajes" name="lenguajes-preferidos" /&gt;
	&lt;s:submit value="Enviar" /&gt;
&lt;/s:form&gt;
&lt;/body&gt;</pre>
<p><img src="http://mundogeek.net/wp-content/struts-2-checkboxlist.png" alt="Struts 2 etiqueta checkboxlist" title="Struts 2 etiqueta checkboxlist"/></p>
<h2>combobox</h2>
<p>Crea una combinación de select y caja de texto. El valor de la caja de texto se auto rellena según el elemento seleccionado en el select.<br />
<code>org.apache.struts2.views.jsp.ui.ComboBoxTag</code></p>
<p><code>emptyOption</code>: Indica si queremos añadir una opción vacía.<br />
<code>list</code> (requerido): Iterable con los valores con los que generar la lista.<br />
<code>listKey</code>: Propiedad de los objetos del iterable del que el checkbox correspondiente tomará su valor.<br />
<code>listValue</code>: Exactamente igual al anterior, pero en lugar del valor, el contenido.<br />
<code>name</code>: Nombre a usar para el elemento.<br />
<code>readonly</code>: Si queremos que el usuario pueda escribir sus propios valores en la caja de texto.</p>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private List&lt;String&gt; lenguajes;

	public List&lt;String&gt; getLenguajes() {
		return lenguajes;
	}

	public String execute() {
		lenguajes = new ArrayList&lt;String&gt;();
		lenguajes.add("Python");
		lenguajes.add("Java");
		lenguajes.add("Ruby");
		lenguajes.add("C#");
		lenguajes.add("C++");
		lenguajes.add("Lisp");
		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;body&gt;
&lt;s:form action="Otro"&gt;
	&lt;s:combobox list="lenguajes" name="nombre-lenguajes"
		label="Lenguaje preferido" readonly="true" /&gt;
	&lt;s:submit value="Enviar" /&gt;
&lt;/s:form&gt;
&lt;/body&gt;</pre>
<p><img src="http://mundogeek.net/wp-content/struts-2-combobox.png" alt="Struts 2 etiqueta combobox" title="Struts 2 etiqueta combobox"/></p>
<h2>date</h2>
<p>Permite mostrar una fecha almacenada en una cierta variable indicando opcionalmente el formato a utilizar.<br />
<code>org.apache.struts2.views.jsp.DateTag</code></p>
<p><code>format</code>: Formato a utilizar para mostrar la fecha. Si queremos usar siempre el mismo formato podemos crear un archivo properties con una entrada <code>struts.date.format</code>. Por defecto se utiliza el formato <code>DateFormat.MEDIUM</code>.<br />
<code>name</code> (requerido): Nombre de la variable que contiene la fecha a mostrar.<br />
<code>nice</code>: Utiliza un formato que facilita la lectura. Por defecto se utiliza inglés para mostrar los mensajes; si queremos traducirlo a algún otro idioma tendremos que recurrir a las funciones de internacionalización de Struts 2. Las claves a traducir son las siguientes:</p>
<table border="1">
<tr>
<td>CLAVE</td>
<td>VALOR POR DEFECTO</td>
</tr>
<tr>
<td><code>struts.date.format.past</code></td>
<td>{0} ago</td>
</tr>
<tr>
<td><code>struts.date.format.future</code></td>
<td>in {0}</td>
</tr>
<tr>
<td><code>struts.date.format.seconds</code></td>
<td>an instant</td>
</tr>
<tr>
<td><code>struts.date.format.minutes</code></td>
<td>{0,choice,1#one minute|1&lt;{0} minutes}</td>
</tr>
<tr>
<td><code>struts.date.format.hours</code></td>
<td>{0,choice,1#one hour|1&lt;{0} hours}{1,choice,0#|1#, one minute|1&lt;, {1} minutes}</td>
</tr>
<tr>
<td><code>struts.date.format.days</code></td>
<td>{0,choice,1#one day|1&lt;{0} days}{1,choice,0#|1#, one hour|1&lt;, {1} hours}</td>
</tr>
<tr>
<td><code>struts.date.format.years</code></td>
<td>{0,choice,1#one year|1&lt;{0} years}{1,choice,0#|1#, one day|1&lt;, {1} days}</td>
</tr>
</table>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;

import java.util.Calendar;
import java.util.Date;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private Date ahora;
	private Date anyoNuevo;

	public Date getAhora() {
		return ahora;
	}

	public Date getAnyoNuevo() {
		return anyoNuevo;
	}

	public String execute() {
		ahora = new Date();

		Calendar cal = Calendar.getInstance();
		int anyo = cal.get(Calendar.YEAR);
		cal.set(anyo + 1, Calendar.JANUARY, 1);
		anyoNuevo = cal.getTime();

		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;body&gt;
Hoy es &lt;s:date name="ahora" format="d 'de' MMMM 'de' yyyy" /&gt;&lt;br/&gt;
Año nuevo &lt;s:date name="anyoNuevo" nice="true" /&gt;
&lt;/body&gt;</pre>
<h2>debug</h2>
<p>Imprime información de depuración (entre otros, el contenido de <code>ValueStack</code>).<br />
<code>org.apache.struts2.views.jsp.ui.DebugTag</code></p>
<h2>div</h2>
<p>Crea un elemento div de HTML.<br />
<code>org.apache.struts2.views.jsp.ui.DivTag</code></p>
<h2>doubleselect</h2>
<p>Crea dos elementos select HTML, con el segundo de ellos modificando sus valores dependiendo del valor seleccionado en el primero.<br />
<code>org.apache.struts2.views.jsp.ui.DoubleSelectTag</code></p>
<p><code>doubleList</code> (requerido): Lista con los valores que tendrá el segundo select.<br />
<code>doubleMultiple</code>: Determina si en el segundo select se pueden seleccionar varios valores o solo uno.<br />
<code>doubleName</code> (requerido): Nombre del elemento.<br />
<code>list</code> (requerido): Lista con los valores que tendrá el primer select.</p>
<p>Artista.java</p>
<pre name="code" class="java">import java.util.List;

public class Artista {
	private String nombre;
	private List&lt;String&gt; canciones;

	public Artista(String nombre, List&lt;String&gt; canciones) {
		this.nombre = nombre;
		this.canciones = canciones;
	}

	public String getNombre() {
		return nombre;
	}

	public List&lt;String&gt; getCanciones() {
		return canciones;
	}
}</pre>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private List&lt;Artista&gt; artistas;

	public List&lt;Artista&gt; getArtistas() {
		return artistas;
	}

	public String execute() {
		artistas = new ArrayList&lt;Artista&gt;();

		List&lt;String&gt; canciones_p = new ArrayList&lt;String&gt;();
		canciones_p.add("El equilibro es imposible");
		canciones_p.add("Años 80");
		canciones_p.add("Promesas que no valen nada");
		Artista piratas = new Artista("Los piratas", canciones_p);
		artistas.add(piratas);

		List&lt;String&gt; canciones_c = new ArrayList&lt;String&gt;();
		canciones_c.add("Viva la vida");
		canciones_c.add("Clocks");
		canciones_c.add("Life in technicolor");
		Artista coldplay = new Artista("Coldplay", canciones_c);
		artistas.add(coldplay);

		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;body&gt;
&lt;s:form action="Otro"&gt;
	&lt;s:doubleselect label="Selecciona la canción" list="artistas"
		listValue="nombre" doubleList="canciones" doubleName="cancion" /&gt;
	&lt;s:submit value="Enviar" /&gt;
&lt;/s:form&gt;
&lt;/body&gt;</pre>
<p><img src="http://mundogeek.net/wp-content/struts-2-doubleselect.png" alt="Struts 2 etiqueta doubleselect" title="Struts 2 etiqueta doubleselect"/></p>
<h2>fielderror</h2>
<p>Muestra los errores que se han detectado al validar los campos del formulario. Por defecto se muestran todos los errores, pero podemos seleccionar que se muestren sólo los relativos a ciertos campos pasándole etiquetas <code>param</code>. El funcionamiento es parecido al de <code>actionerror</code> y <code>actionmessage</code>: podemos añadir errores utilizando el método <code>addFieldError(String fieldName, String errorMessage)</code> de la interfaz <code>ValidationAware</code>, que <code>ActionSupport</code> implementa. Hay que tener en cuenta, no obstante, que si redirigimos al formulario de entrada el propio formulario imprimará estos errores por defecto sin necesidad de añadir esta etiqueta. Los métodos y propiedades de <code>ValidationAware</code> también estarán disponibles en la vista, por lo que es posible en su lugar comprobar si existen errores con el método <code>hasFieldErrors()</code> e iterar directamente sobre la colección <code>fieldErrors</code>.<br />
<code>org.apache.struts2.views.jsp.ui.FieldErrorTag</code></p>
<p>index.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;s:fielderror /&gt;

&lt;s:form action="Accion"&gt;
	&lt;s:textfield label="Nombre" name="nombre" /&gt;
	&lt;s:submit value="Enviar" /&gt;
&lt;/s:form&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private String nombre;

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String execute() {
		if(nombre.length() &gt; 10) {
			addFieldError("nombre", "El nombre no puede tener más de 10 caracteres.");
			return ERROR;
		}

		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;body&gt;
&lt;s:fielderror /&gt;
&lt;/body&gt;</pre>
<h2>file</h2>
<p>Muestra un campo file de HTML. Para facilitarnos la vida podemos aprovechar el interceptor <code>fileUpload</code> que se encuentra en la selección de interceptores por defecto (<code>defaultStack</code>) y que funciona de forma parecida al interceptor <code>param</code>. Basta crear setters y getters en la acción para las nuevas propiedades <code><em>nombre</em></code> (el archivo en si), <code><em>nombre</em>ContentType</code> (el tipo MIME del archivo subido) o <code><em>nombre</em>FileName</code> (el nombre del archivo subido) para tener acceso a estos valores en la acción.<br />
<code>org.apache.struts2.views.jsp.ui.FileTag</code></p>
<p><code>accept</code>: atributo del mismo nombre de HTML que permite indicar los tipos MIME que acepta el campo.</p>
<p>index.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;

&lt;s:form enctype="multipart/form-data" method="POST" action="Accion"&gt;
	&lt;s:file label="Archivo a enviar" name="archivoTexto"
		accept="text/txt" /&gt;
	&lt;s:submit value="Enviar" /&gt;
&lt;/s:form&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private File archivoTexto;
	private String archivoTextoContentType;
	private String archivoTextoFileName;
	private String contenido;

	public String getContenido() {
		return contenido;
	}

	public File getArchivoTexto() {
		return archivoTexto;
	}

	public void setArchivoTexto(File archivoTexto) {
		this.archivoTexto = archivoTexto;
	}

	public String getArchivoTextoContentType() {
		return archivoTextoContentType;
	}

	public void setArchivoTextoContentType(String archivoTextoContentType) {
		this.archivoTextoContentType = archivoTextoContentType;
	}

	public String getArchivoTextoFileName() {
		return archivoTextoFileName;
	}

	public void setArchivoTextoFileName(String archivoTextoFileName) {
		this.archivoTextoFileName = archivoTextoFileName;
	}

	public String execute() throws IOException {
		BufferedReader input = new BufferedReader(new FileReader(archivoTexto));

		String linea = "";
		contenido = "";
		while ((linea = input.readLine()) != null)
			contenido = contenido + linea;

		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;body&gt;
&lt;strong&gt;Archivo&lt;/strong&gt;: &lt;s:property value="archivoTextoFileName"/&gt;&lt;br/&gt;
&lt;strong&gt;Tipo&lt;/strong&gt;: &lt;s:property value="archivoTextoContentType"/&gt;&lt;br/&gt;
&lt;strong&gt;Contenido&lt;/strong&gt;: &lt;s:property value="contenido"/&gt;
&lt;/body&gt;</pre>
<p><img src="http://mundogeek.net/wp-content/struts-2-file.png" alt="Struts 2 etiqueta file" title="Struts 2 etiqueta file"/></p>
<h2>form</h2>
<p>Crea un elemento form de HTML.<br />
<code>org.apache.struts2.views.jsp.ui.FormTag</code></p>
<p><code>action</code>: Acción a la que se enviará la petición con los datos del formulario. También se puede enlazar otras páginas o servlets. Si no utilizamos el atributo para especificar el destino se utiliza la misma página del formulario.<br />
<code>namespace</code>: Espacio de nombres al que pertenece la acción a la que se enviará la petición. Por defecto se utiliza el espacio de nombres actual.<br />
<code>validate</code>: Si queremos validar los campos del formulario antes de enviarlos.</p>
<h2>component</h2>
<p>Utilizado para crear nuestras propias etiquetas sin tener que recurrir a la API de etiquetas de JSP.<br />
<code>org.apache.struts2.views.jsp.ui.ComponentTag</code></p>
<h2>head</h2>
<p>Etiqueta auxiliar que se coloca dentro de la etiqueta head de HTML y se encarga de generar distintos elementos necesarios para otras etiquetas, como las etiquetas para la carga de hojas de estilo o scripts.<br />
<code>org.apache.struts2.views.jsp.ui.HeadTag</code></p>
<h2>hidden</h2>
<p>Crea un campo oculto.<br />
<code>org.apache.struts2.views.jsp.ui.HiddenTag</code></p>
<h2>i18n</h2>
<p>Carga un archivo de recursos adicional con la traducción de nuestros mensajes y los coloca en <code>ValueStack</code> de forma que puedan ser accedidos fácilmente por el código que se encuentre dentro de la etiqueta.<br />
<code>org.apache.struts2.views.jsp.I18nTag</code></p>
<p><code>name</code> (requerido): Nombre del <code>ResourceBundle</code> a cargar.</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;

&lt;s:i18n name="textos"&gt;
	&lt;s:text name="bienvenida" /&gt;
&lt;/s:i18n&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>if-elseif-else</h2>
<p>La típica sentencia condicional.<br />
<code>org.apache.struts2.views.jsp.IfTag</code><br />
<code>org.apache.struts2.views.jsp.ElseIfTag</code><br />
<code>org.apache.struts2.views.jsp.ElseTag</code></p>
<p><code>test</code> (requerido para <code>if</code> y <code>elseif</code>): la expresión a comprobar</p>
<p>index.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;

&lt;s:if test="ventas &lt; 1000"&gt;Comisión del 1%&lt;/s:if&gt;
&lt;s:elseif test="ventas &lt; 2000"&gt;Comisión del 2%&lt;/s:elseif&gt;
&lt;s:else&gt;Comisión del 3%&lt;/s:else&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>include</h2>
<p>Parecido a <code>action</code> con el parámetro <code>executeResult</code>, pero, a diferencia de este, permite incluir cualquier recurso. Como el <code>include</code> de JSP también se le pueden pasar parámetros para que sea dinámico con etiquetas <code>param</code>, pero estos valores no se acceden como propiedades de <code>ValueStack</code>, sino como parámetros de la petición.<br />
<code>org.apache.struts2.views.jsp.IncludeTag</code></p>
<p><code>value</code> (requerido): El recurso a incluir.</p>
<p>header.jsp</p>
<pre name="code" class="xml">&lt;h1&gt;Bienvenido a ${param.web}&lt;/h1&gt;</pre>
<p>index.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;s:include value="header.jsp"&gt;
	&lt;s:param name="web"&gt;http://mundogeek.net&lt;/s:param&gt;
&lt;/s:include&gt;
Contenido.
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>inputtransferselect</h2>
<p>Crea un componente consistente en un select de selección múltiple, un campo de texto y distintos botones que permiten añadir, eliminar y ordenar los valores.<br />
<code>org.apache.struts2.views.jsp.ui.InputTransferSelectTag</code></p>
<p><code>allowRemoveAll</code>: Determina si se mostrará el botón para eliminar todos los valores.<br />
<code>allowUpDown</code>: Determina si se mostrarán los botones para subir y bajar los valores en la lista.<br />
<code>downLabel</code>: Etiqueta del botón que baja los valores.<br />
<code>list</code> (requerido): Lista con los valores que tendrá el select al comenzar.<br />
<code>removeAllLabel</code>: Etiqueta del botón que elimina todos los valores.<br />
<code>removeLabel</code>: Etiqueta del botón que elimina un valor.<br />
<code>upLabel</code>: Etiqueta del botón que sube los valores.</p>
<p>Accion.java</p>
<pre name="code" class="xml">import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private List&lt;String&gt; lenguajes;

	public List&lt;String&gt; getLenguajes() {
		return lenguajes;
	}

	public String execute() {
		lenguajes = new ArrayList&lt;String&gt;();
		lenguajes.add("Python");
		lenguajes.add("Java");
		lenguajes.add("Ruby");
		lenguajes.add("C#");
		lenguajes.add("C++");
		lenguajes.add("Lisp");
		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;s:form&gt;
	&lt;s:inputtransferselect label="¿Cuáles son tus lenguajes favoritos?"
		list="lenguajes" /&gt;
	&lt;s:submit value="Enviar" /&gt;
&lt;/s:form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p><img src="http://mundogeek.net/wp-content/struts-2-inputtransferselect.png" alt="Struts 2 etiqueta inputtransferselect" title="Struts 2 etiqueta inputtransferselect"/></p>
<h2>iterator</h2>
<p>Para iterar sobre colecciones. En cada iteración el objeto recuperado se coloca en <code>ValueStack</code> para poder acceder a sus propiedades fácilmente.<br />
<code>org.apache.struts2.views.jsp.IteratorTag</code></p>
<p><code>status</code>: Crea una instancia de <code>IteratorStatus</code> con el nombre indicado. Este objeto expone algunas propiedades muy útiles como <code>index</code> (índice del elemento actual), <code>first</code> (booleano que indica si es el primero elemento), <code>even</code> (booleano que indica si es impar), <code>last</code> (booleano que indica si es el último elemento) u <code>odd</code> (booleano que indica si es par).<br />
<code>value</code>: Colección sobre la que iterar.</p>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private List&lt;String&gt; lenguajes;

	public List&lt;String&gt; getLenguajes() {
		return lenguajes;
	}

	public String execute() {
		lenguajes = new ArrayList&lt;String&gt;();
		lenguajes.add("Python");
		lenguajes.add("Java");
		lenguajes.add("Ruby");
		lenguajes.add("C#");
		lenguajes.add("C++");
		lenguajes.add("Lisp");
		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
Tus lenguajes preferidos son:
&lt;ul&gt;
	&lt;s:iterator value="lenguajes"&gt;
		&lt;li&gt;&lt;s:property /&gt;&lt;/li&gt;
	&lt;/s:iterator&gt;
&lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>label</h2>
<p>Crea una etiqueta label de HTML.<br />
<code>org.apache.struts2.views.jsp.ui.LabelTag</code></p>
<h2>merge</h2>
<p>Crea un nuevo iterador unión de los distintos iteradores pasados como parámetro mediante etiquetas <code>param</code>.<br />
<code>org.apache.struts2.views.jsp.iterator.MergeIteratorTag</code></p>
<p><code>var</code>: Nombre que se usará en <code>ValueStack</code> para el nuevo iterador.</p>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private List&lt;String&gt; lista1;
	private List&lt;String&gt; lista2;

	public List&lt;String&gt; getLista1() {
		return lista1;
	}

	public void setLista1(List&lt;String&gt; lista1) {
		this.lista1 = lista1;
	}

	public List&lt;String&gt; getLista2() {
		return lista2;
	}

	public void setLista2(List&lt;String&gt; lista2) {
		this.lista2 = lista2;
	}

	public String execute() {
		lista1 = new ArrayList&lt;String&gt;();
		lista1.add("Uno");
		lista1.add("Dos");
		lista1.add("Tres");

		lista2 = new ArrayList&lt;String&gt;();
		lista2.add("1");
		lista2.add("2");
		lista2.add("3");

		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;

&lt;s:merge var="nuevaLista"&gt;
	&lt;s:param value="lista1" /&gt;
	&lt;s:param value="lista2" /&gt;
&lt;/s:merge&gt;

&lt;ul&gt;
	&lt;s:iterator value="nuevaLista"&gt;
		&lt;li&gt;&lt;s:property /&gt;&lt;/li&gt;
	&lt;/s:iterator&gt;
&lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>optgroup</h2>
<p>Crea un nuevo elemento HTML optgroup (un grupo de opciones para un elemento select)<br />
<code>org.apache.struts2.views.jsp.ui.OptGroupTag</code></p>
<p><code>list</code>: El objeto del que se tomarán los valores con los que rellenar el elemento.</p>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;

import java.util.HashMap;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private HashMap&lt;String, String&gt; registrados;
	private HashMap&lt;String, String&gt; vips;

	public HashMap&lt;String, String&gt; getVips() {
		return vips;
	}

	public void setVips(HashMap&lt;String, String&gt; vips) {
		this.vips = vips;
	}

	public HashMap&lt;String, String&gt; getRegistrados() {
		return registrados;
	}

	public void setRegistrados(HashMap&lt;String, String&gt; registrados) {
		this.registrados = registrados;
	}

	public String execute() {
		registrados = new HashMap&lt;String, String&gt;();
		registrados.put("Juan", "Juan Encina");
		registrados.put("Manuel", "Manuel Robledo");

		vips = new HashMap&lt;String, String&gt;();
		vips.put("Pedro", "Pedro Peral");
		vips.put("María", "María Manzano");

		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;

&lt;s:form&gt;
	&lt;s:select list="{}"&gt;
		&lt;s:optgroup label="Registrados" list="registrados" /&gt;
		&lt;s:optgroup label="VIPs" list="vips" /&gt;
	&lt;/s:select&gt;
	&lt;s:submit value="Enviar" /&gt;
&lt;/s:form&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
<p><img src="http://mundogeek.net/wp-content/struts-2-optgroup.png" alt="Struts 2 etiqueta optgroup" title="Struts 2 etiqueta optgroup"/></p>
<h2>optiontransferselect</h2>
<p>Crea un componente consistente en dos selects cuyos elementos pueden traspasarse de uno a otro.<br />
<code>org.apache.struts2.views.jsp.ui.OptionTransferSelectTag</code></p>
<p><code>doubleList</code> (requerido): El iterador con los valores que tendrá el segundo select al comenzar.<br />
<code>doubleName</code> (requerido): Nombre a utilizar para el elemento.<br />
<code>leftTitle</code>: Título del primer select.<br />
<code>list</code>: El iterador con los valores que tendrá el primer select al comenzar.<br />
<code>rightTitle</code>: Título del segundo select</p>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;

import java.util.HashMap;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private HashMap&lt;String, String&gt; registrados;
	private HashMap&lt;String, String&gt; vips;

	public HashMap&lt;String, String&gt; getVips() {
		return vips;
	}

	public void setVips(HashMap&lt;String, String&gt; vips) {
		this.vips = vips;
	}

	public HashMap&lt;String, String&gt; getRegistrados() {
		return registrados;
	}

	public void setRegistrados(HashMap&lt;String, String&gt; registrados) {
		this.registrados = registrados;
	}

	public String execute() {
		registrados = new HashMap&lt;String, String&gt;();
		registrados.put("Juan", "Juan Encina");
		registrados.put("Manuel", "Manuel Robledo");

		vips = new HashMap&lt;String, String&gt;();
		vips.put("Pedro", "Pedro Peral");
		vips.put("María", "María Manzano");

		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;

&lt;s:form action="Otro"&gt;
	&lt;s:optiontransferselect list="registrados" leftTitle="Registrados"
		doubleList="vips" rightTitle="VIPs" doubleName="usuarios" /&gt;
	&lt;s:submit value="Enviar" /&gt;
&lt;/s:form&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
<p><img src="http://mundogeek.net/wp-content/struts-2-optiontransferselect.png" alt="Struts 2 etiqueta optiontransferselect" title="Struts 2 etiqueta optiontransferselect"/></p>
<h2>param</h2>
<p>Utilizada para añadir parámetros a otras etiquetas.<br />
<code>org.apache.struts2.views.jsp.ParamTag</code></p>
<p><code>name</code>: Nombre del parámetro.<br />
<code>value</code>: Valor del parámetro.</p>
<h2>password</h2>
<p>Crea un elemento password de HTML.<br />
<code>org.apache.struts2.views.jsp.ui.PasswordTag</code></p>
<p><code>showPassword</code>: Indica si queremos que se muestren los caracteres en claro.</p>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;

&lt;s:form action="Otro"&gt;
	&lt;s:textfield label="Nombre" /&gt;
	&lt;s:password label="Contraseña" /&gt;
	&lt;s:submit value="Enviar" /&gt;
&lt;/s:form&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
<p><img src="http://mundogeek.net/wp-content/struts-2-password.png" alt="Struts 2 etiqueta password" title="Struts 2 etiqueta password"/></p>
<h2>property</h2>
<p>Muestra una propiedad de <code>ValueStack</code> u otro objeto de <code>ActionContext</code>.<br />
<code>org.apache.struts2.views.jsp.PropertyTag</code></p>
<p><code>default</code>: Valor a mostrar en caso de que el valor pedido sea nulo.<br />
<code>escape</code>: Determina si queremos que se escape el HTML. Por defecto es true.<br />
<code>value</code>: Valor a mostrar.</p>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private String web;

	public String getWeb() {
		return web;
	}

	public void setWeb(String web) {
		this.web = web;
	}

	public String execute() {
		web = "mundogeek.net";
		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;

Visita &lt;s:property value="web" default="google.es" /&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>push</h2>
<p>Añade el valor especificado a lo alto de la pila.<br />
<code>org.apache.struts2.views.jsp.PushTag</code></p>
<p><code>value</code> (requerido): El valor a añadir.</p>
<h2>radio</h2>
<p>Crea un conjunto de radio buttons HTML.<br />
<code>org.apache.struts2.views.jsp.ui.RadioTag</code></p>
<p><code>list</code> (requerido): Lista con los valores que tendrá el grupo de radio buttons.</p>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private List&lt;String&gt; lenguajes;

	public List&lt;String&gt; getLenguajes() {
		return lenguajes;
	}

	public String execute() {
		lenguajes = new ArrayList&lt;String&gt;();
		lenguajes.add("Python");
		lenguajes.add("Java");
		lenguajes.add("Ruby");
		lenguajes.add("C#");
		lenguajes.add("C++");
		lenguajes.add("Lisp");
		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;s:form&gt;
	&lt;s:radio label="Selecciona tu lenguaje preferido" list="lenguajes" /&gt;
	&lt;s:submit value="Enviar" /&gt;
&lt;/s:form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>reset</h2>
<p>Crea un botón que borra los datos introducidos en el formulario.<br />
<code>org.apache.struts2.views.jsp.ui.ResetTag</code></p>
<p><code>value</code>: Texto a utilizar para el botón</p>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;

&lt;s:form action="Otro"&gt;
	&lt;s:textfield label="Nombre" /&gt;
	&lt;s:password label="Contraseña" /&gt;
	&lt;s:reset value="Borrar" /&gt;
	&lt;s:submit value="Enviar" /&gt;
&lt;/s:form&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
<p><img src="http://mundogeek.net/wp-content/struts-2-reset.png" alt="Struts 2 etiqueta reset" title="Struts 2 etiqueta reset"/></p>
<h2>select</h2>
<p>Crea un elemento select.<br />
<code>org.apache.struts2.views.jsp.ui.SelectTag</code></p>
<p><code>list</code>: El iterable con los valores que tendrá el select.</p>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private List&lt;String&gt; lenguajes;

	public List&lt;String&gt; getLenguajes() {
		return lenguajes;
	}

	public String execute() {
		lenguajes = new ArrayList&lt;String&gt;();
		lenguajes.add("Python");
		lenguajes.add("Java");
		lenguajes.add("Ruby");
		lenguajes.add("C#");
		lenguajes.add("C++");
		lenguajes.add("Lisp");
		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;

&lt;s:form action="Otro"&gt;
	&lt;s:select label="Lenguaje preferido" list="lenguajes" /&gt;
	&lt;s:submit value="Enviar" /&gt;
&lt;/s:form&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
<p><img src="http://mundogeek.net/wp-content/struts-2-select.png" alt="Struts 2 etiqueta select" title="Struts 2 etiqueta select"/></p>
<h2>set</h2>
<p>Asigna un valor a una variable, opcionalmente indicando el ámbito al que añadirla. El valor se puede indicar utilizando el atributo <code>value</code>, o encerrando el valor en la propia etiqueta.<br />
<code>org.apache.struts2.views.jsp.SetTag</code></p>
<p><code>name</code>: Nombre a utilizar para la variable.<br />
<code>scope</code>: Ámbito en el que añadir la variable. Puede ser <code>application</code>, <code>session</code>, <code>request</code>, <code>page</code>, o <code>action</code>. Por defecto se utiliza <code>action</code>.<br />
<code>value</code>: Valor a asignar.</p>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;s:set name="nombre"&gt;Raúl&lt;/s:set&gt;
Hola &lt;s:property value="nombre" /&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>submit</h2>
<p>Crea un botón para enviar el formulario.<br />
<code>org.apache.struts2.views.jsp.ui.SubmitTag</code></p>
<p><code>value</code>: Texto a utilizar para el botón</p>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;

&lt;s:form action="Otro"&gt;
	&lt;s:textfield label="Nombre" /&gt;
	&lt;s:password label="Contraseña" /&gt;
	&lt;s:reset value="Borrar" /&gt;
	&lt;s:submit value="Enviar" /&gt;
&lt;/s:form&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>text</h2>
<p>Muestra un texto localizado de un resource bundle.<br />
<code>org.apache.struts2.views.jsp.TextTag</code></p>
<p><code>name</code> (requerido): La clave a buscar en el resource bundle.</p>
<p>index.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;s:url id="en" action="Accion"&gt;
	&lt;s:param name="request_locale"&gt;en&lt;/s:param&gt;
&lt;/s:url&gt;

&lt;s:url id="fr" action="Accion"&gt;
	&lt;s:param name="request_locale"&gt;fr&lt;/s:param&gt;
&lt;/s:url&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;s:a href="Accion"&gt;Español&lt;/s:a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;s:a href="%{en}"&gt;Inglés&lt;/s:a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;s:a href="%{fr}"&gt;Francés&lt;/s:a&gt;&lt;/li&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Accion.properties</p>
<pre>mensaje = ¡Hola Mundo!</pre>
<p>Accion_en.properties</p>
<pre>mensaje = Hello World!</pre>
<p>Accion_fr.properties</p>
<pre>mensaje = Bonjour le monde!</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;s:text name="mensaje" /&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>textarea</h2>
<p>Crea un elemento textarea de HTML.<br />
<code>org.apache.struts2.views.jsp.ui.TextareaTag</code></p>
<p><code>cols</code>: Atributo </code>cols</code> de HTML (número de columnas).<br />
<code>rows</code>: Atributo </code>rows</code> de HTML (número de filas).<br />
<code>value</code>: El texto que mostrará el área de texto.</p>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;s:textarea cols="40" rows="10" value="Hola mundo" /&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p><img src="http://mundogeek.net/wp-content/struts-2-textarea.png" alt="Struts 2 etiqueta textarea" title="Struts 2 etiqueta textarea"/></p>
<h2>textfield</h2>
<p>Crea una caja de texto.<br />
<code>org.apache.struts2.views.jsp.ui.TextFieldTag</code></p>
<p><code>maxlength</code>: Atributo <code>maxlength</code> de HTML (número máximo de caracteres permitidos)<br />
<code>readonly</code>: Determina si el campo será de solo lectura.<br />
<code>size</code>: Atributo <code>size</code> de HTML (tamaño de la caja de texto en caracteres)</p>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;s:textfield label="Nombre" maxlength="10" size="10" /&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p><img src="http://mundogeek.net/wp-content/struts-2-textfield.png" alt="Struts 2 etiqueta textfield" title="Struts 2 etiqueta textfield"/></p>
<h2>token</h2>
<p>Añade un token oculto al formulario para ayudar a los interceptores <code>token</code> y <code>tokenSession</code> a evitar que el usuario mande la misma petición varias veces por error.<br />
<code>org.apache.struts2.views.jsp.ui.TokenTag</code></p>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;
&lt;s:form action="Comprar"&gt;
	&lt;ul&gt;
		&lt;li&gt;The Pragmatic Programmer &hellip; 50&euro;&lt;/li&gt;
		&lt;li&gt;Code Complete &hellip; 50&euro;&lt;/li&gt;
	&lt;/ul&gt;
	&lt;s:token /&gt;
	&lt;s:submit value="Comprar" /&gt;
&lt;/s:form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>url</h2>
<p>Crea una URL. Se pueden añadir parámetros a la URL usando etiquetas <code>param</code>.<br />
<code>org.apache.struts2.views.jsp.URLTag</code></p>
<p><code>action</code>: Acción a la que llama la URL. Si queremos pasar una URL directamente se utiliza <code>value</code>.<br />
<code>encode</code>: Indica si queremos hacer reescritura de URLs para mantener sesiones si el usuario tiene las cookies deshabilitadas.<br />
<code>value</code>: URL base.</p>
<h2>updownselect</h2>
<p>Crea un select con botones para ordenar los elementos según el gusto del usuario.<br />
<code>org.apache.struts2.views.jsp.ui.UpDownSelectTag</code></p>
<p><code>list</code>: El iterable con los valores que tendrá el select.</p>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private List&lt;String&gt; lenguajes;

	public List&lt;String&gt; getLenguajes() {
		return lenguajes;
	}

	public String execute() {
		lenguajes = new ArrayList&lt;String&gt;();
		lenguajes.add("Python");
		lenguajes.add("Java");
		lenguajes.add("Ruby");
		lenguajes.add("C#");
		lenguajes.add("C++");
		lenguajes.add("Lisp");
		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;

&lt;s:form action="Otro"&gt;
	&lt;s:updownselect label="Lenguaje preferido" list="lenguajes" /&gt;
	&lt;s:submit value="Enviar" /&gt;
&lt;/s:form&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
<p><img src="http://mundogeek.net/wp-content/struts-2-updownselect.png" alt="Struts 2 etiqueta updownselect" title="Struts 2 etiqueta updownselect"/></p>
<h2>generator</h2>
<p>Genera un nuevo iterador. Los valores se obtienen dividiendo la cadena <code>val</code> usando como separador el caracter indicado en <code>separator</code>.<br />
<code>org.apache.struts2.views.jsp.iterator.IteratorGeneratorTag</code></p>
<p><code>converter</code>: Objeto de tipo <code>Converter</code> con el que realizar las distintas operaciones que sean necesarias con cada valor.<br />
<code>count</code>: Número máximo de elementos que queremos generar.<br />
<code>separator</code> (requerido): Separador utilizado para transformar la cadena en los distintos valores del iterador.<br />
<code>val</code> (requerido): La cadena de la que se generarán.<br />
<code>var</code>: Nombre con el que se almacenará el nuevo iterador.</p>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.util.IteratorGenerator.Converter;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private String lenguajes;
	private Converter aMayusculas;

	public Converter getAMayusculas() {
		return aMayusculas;
	}

	public String getLenguajes() {
		return lenguajes;
	}

	public String execute() {
		aMayusculas = new Converter() {
			public Object convert(String cadena) throws Exception {
				return cadena.toUpperCase();
			}
		};

		lenguajes = "Python,Java,Ruby,C#,C++,Lisp";
		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;

&lt;s:generator separator="," val="lenguajes" converter="aMayusculas"
	var="listaLenguajes" /&gt;

&lt;ul&gt;
	&lt;s:iterator value="listaLenguajes"&gt;
		&lt;li&gt;&lt;s:property /&gt;&lt;/li&gt;
	&lt;/s:iterator&gt;
&lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>sort</h2>
<p>Ordena una lista<br />
<code>org.apache.struts2.views.jsp.iterator.SortIteratorTag</code></p>
<p><code>comparator</code> (requerido): Objeto <code>Comparator</code> a utilizar para comparar los valores de la lista.<br />
<code>source</code>: Lista a ordenar.<br />
<code>var</code>: Nombre con el que almacenar la nueva lista. Se almacenará como atributo de page context.</p>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private List&lt;String&gt; lenguajes;
	private Comparator&lt;String&gt; compararString;

	public List&lt;String&gt; getLenguajes() {
		return lenguajes;
	}

	public Comparator&lt;String&gt; getCompararString() {
		return compararString;
	}

	public String execute() {
		compararString = new Comparator&lt;String&gt;() {
			public int compare(String valor1, String valor2) {
				return valor1.compareTo(valor2);
			}
		};

		lenguajes = new ArrayList&lt;String&gt;();
		lenguajes.add("Python");
		lenguajes.add("Java");
		lenguajes.add("Ruby");
		lenguajes.add("C#");
		lenguajes.add("C++");
		lenguajes.add("Lisp");

		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;

&lt;s:sort comparator="compararString" source="lenguajes"
	var="lenguajesOrd" /&gt;

&lt;ul&gt;
	&lt;s:iterator value="#attr.lenguajesOrd"&gt;
		&lt;li&gt;&lt;s:property /&gt;&lt;/li&gt;
	&lt;/s:iterator&gt;
&lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>subset</h2>
<p>Obtiene un subconjunto de un iterador.<br />
<code>org.apache.struts2.views.jsp.iterator.SubsetIteratorTag</code></p>
<p><code>count</code>: Número máximo de elementos que queremos obtener.<br />
<code>decider</code>: Objeto <code>Decider</code> que determinará si el elemento debe incluirse en el nuevo iterador.<br />
<code>source</code>: Iterador inicial.<br />
<code>var</code>: Nombre con el que se almacenará el nuevo iterador en page context.</p>
<p>Accion.java</p>
<pre name="code" class="java">import com.opensymphony.xwork2.ActionSupport;
import java.util.ArrayList;
import java.util.List;

import org.apache.struts2.util.SubsetIteratorFilter.Decider;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private List&lt;String&gt; lenguajes;
	private Decider decisor;

	public List&lt;String&gt; getLenguajes() {
		return lenguajes;
	}

	public Decider getDecisor() {
		return decisor;
	}

	public String execute() {
		decisor = new Decider() {
			public boolean decide(Object elemento) throws Exception {
				String cadena = ((String) elemento);
				return cadena.startsWith("C");
			}
		};

		lenguajes = new ArrayList&lt;String&gt;();
		lenguajes.add("Python");
		lenguajes.add("Java");
		lenguajes.add("Ruby");
		lenguajes.add("C#");
		lenguajes.add("C++");
		lenguajes.add("Lisp");

		return SUCCESS;
	}
}</pre>
<p>resultado.jsp</p>
<pre name="code" class="xml">&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;

&lt;html&gt;
&lt;body&gt;

&lt;s:subset decider="decisor" source="lenguajes" var="lenguajesSub" /&gt;

&lt;ul&gt;
	&lt;s:iterator value="#attr.lenguajesSub"&gt;
		&lt;li&gt;&lt;s:property /&gt;&lt;/li&gt;
	&lt;/s:iterator&gt;
&lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<link type="text/css" rel="stylesheet" href="http://mundogeek.net/sh/css/SyntaxHighlighter.css"></link>
<script language="javascript" src="http://mundogeek.net/sh/js/shCore.js"></script><br />
<script language="javascript" src="http://mundogeek.net/sh/js/shBrushJava.js"></script><br />
<script language="javascript" src="http://mundogeek.net/sh/js/shBrushXml.js"></script><br />
<script language="javascript">dp.SyntaxHighlighter.ClipboardSwf = 'http://mundogeek.net/sh//flash/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code');</script></p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2009/02/13/etiquetas-struts-2/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>¿Sabías que&#8230;</title>
		<link>http://mundogeek.net/archivos/2008/05/12/sabias-que-2/</link>
		<comments>http://mundogeek.net/archivos/2008/05/12/sabias-que-2/#comments</comments>
		<pubDate>Mon, 12 May 2008 09:00:22 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[curiosidades]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[loc]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[vista]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=1512</guid>
		<description><![CDATA[&#8230;Windows Vista tiene más de 50 millones de líneas de código? Como curiosidad, Windows XP tenía unos 40 millones, Windows 98, 18 millones; Windows 95, 15 millones y Windows 3.11 tan sólo 3 millones. Además, en la creación de Windows Vista trabajaron unos 2.000 desarrolladores (no de forma simultánea, claro). En comparación, a finales de [...]]]></description>
			<content:encoded><![CDATA[<p><em>&#8230;Windows Vista tiene más de 50 millones de líneas de código?</em></p>
<p>Como curiosidad, Windows XP tenía unos 40 millones, Windows 98, 18 millones; Windows 95, 15 millones y Windows 3.11 tan sólo 3 millones.</p>
<p>Además, en la creación de Windows Vista trabajaron unos 2.000 desarrolladores (no de forma simultánea, claro).</p>
<p>En comparación, a finales de 2007 los programas incluidos en los repositorios de Ubuntu sumaban más de 120 millones de líneas de código.</p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2008/05/12/sabias-que-2/feed/</wfw:commentRss>
		<slash:comments>38</slash:comments>
		</item>
		<item>
		<title>Y el sistema operativo que usas es&#8230;</title>
		<link>http://mundogeek.net/archivos/2007/05/07/y-el-sistema-operativo-que-usas-es/</link>
		<comments>http://mundogeek.net/archivos/2007/05/07/y-el-sistema-operativo-que-usas-es/#comments</comments>
		<pubDate>Mon, 07 May 2007 14:29:09 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[bitacora]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[macos]]></category>
		<category><![CDATA[vista]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://mundogeek.net/archivos/2007/05/07/y-el-sistema-operativo-que-usas-es/</guid>
		<description><![CDATA[Después de algo más de una semana la encuesta sobre los sistemas operativos que usaban los lectores de la bitácora tiene suficientes votos para ser representativa (660). El ganador ha sido Ubuntu Feisty Fawn, con 219 votos, seguido muy de cerca de Windows XP, con 218. Eso supone que XP y Feisty Fawn contabilizan una [...]]]></description>
			<content:encoded><![CDATA[<p>Después de algo más de una semana la <a href="http://mundogeek.net/archivos/2007/04/26/%c2%bfque-sistemas-operativos-utilizas/" title="¿Qué sistemas operativos utilizas?">encuesta sobre los sistemas operativos que usaban los lectores</a> de la bitácora tiene suficientes votos para ser representativa (660).</p>
<p>El ganador ha sido Ubuntu Feisty Fawn, con 219 votos, seguido muy de cerca de Windows XP, con 218. Eso supone que XP y Feisty Fawn contabilizan una tercera parte de los votos cada uno. Dos terceras partes de todos los usuarios por sí solos.<span id="more-1063"></span></p>
<p>La suma de todas las versiones de Ubuntu resulta en 264 votos lo que significa casi 3.5 veces más usuarios de Ubuntu leyendo la bitácora que de otras distros Linux.</p>
<p>La suma de todas las distros Linux supone un 52% de los votos totales, luego ¡más de la mitad de los lectores que contestaron la encuesta utilizan Linux como sistema operativo principal! (o dicen usarlo).</p>
<p>Otra curiosidad es que hay exactamente el doble de usuarios de Mac OS que de Windows Vista. Sorprendente descalabro de Microsoft.</p>
<p>Por último comentar el uso anecdótico de sistemas operativos distintos a Linux, Mac OS y Windows, que sólo contabilizo 3 votos.</p>
<p><img src="http://mundogeek.net/wp-content/sistemas-operativos.png" alt="Sistemas operativos de los lectores" title="Sistemas operativos de los lectores"/></p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2007/05/07/y-el-sistema-operativo-que-usas-es/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>El consumo desproporcionado de batería de Aero en Windows Vista y cómo desactivar Aero</title>
		<link>http://mundogeek.net/archivos/2007/05/05/el-consumo-desproporcionado-de-bateria-de-aero-en-windows-vista-y-como-desactivar-aero/</link>
		<comments>http://mundogeek.net/archivos/2007/05/05/el-consumo-desproporcionado-de-bateria-de-aero-en-windows-vista-y-como-desactivar-aero/#comments</comments>
		<pubDate>Sat, 05 May 2007 12:16:02 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[bateria]]></category>
		<category><![CDATA[portatiles]]></category>
		<category><![CDATA[vista]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://mundogeek.net/archivos/2007/05/05/el-consumo-desproporcionado-de-bateria-de-aero-en-windows-vista-y-como-desactivar-aero/</guid>
		<description><![CDATA[Lo comentan en ZDNet y es la razón por la que Aero está ya desactivado en mi portatil, aunque en realidad no he notado esa supuesta diferencia: Cuando Aero está desactivado, la duración de la batería es igual o mejor que en Windows XP. Pero cuando está activado, la duración de la batería se resiente [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://news.zdnet.com/2100-1040_22-6181366.html?part=rss&#038;tag=feed&#038;subj=zdnn">Lo comentan en ZDNet</a> y es la razón por la que Aero está ya desactivado en mi portatil, aunque en realidad no he notado esa supuesta diferencia:</p>
<blockquote><p>Cuando Aero está desactivado, la duración de la batería es igual o mejor que en Windows XP. Pero cuando está activado, la duración de la batería se resiente con respecto a Windows XP (&#8230;) Los usuarios de portatiles que tuvieron que gastar más dinero en sistemas que cumplieran con los requisitos gráficos de Vista y la interfaz Aero ahora no tienen más remedio que usar el equivalente estético del Vista Basic, la versión de bajo coste de Vista, al menos si se preocupan por la duración de la batería.</p></blockquote>
<p>Para desactivar Aero hacemos clic con el botón derecho en el escritorio y seleccionamos Personalizar -> Color y apariencia de las ventanas -> Abrir las propiedades de apariencia clásica para ver más opciones de color, y en el diálogo que aparece seleccionamos una combinación de colores distinta de &#8220;Aero de Windows&#8221;; por ejemplo &#8220;Básico de Windows Vista&#8221;, que mantiene el aspecto de los bordes de las ventanas y los widgets pero elimina los efectos de Aero.</p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2007/05/05/el-consumo-desproporcionado-de-bateria-de-aero-en-windows-vista-y-como-desactivar-aero/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Las beta y RC de Vista, con fecha de caducidad</title>
		<link>http://mundogeek.net/archivos/2007/04/25/las-beta-y-rc-de-vista-con-fecha-de-caducidad/</link>
		<comments>http://mundogeek.net/archivos/2007/04/25/las-beta-y-rc-de-vista-con-fecha-de-caducidad/#comments</comments>
		<pubDate>Wed, 25 Apr 2007 14:19:33 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[vista]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://mundogeek.net/archivos/2007/04/25/las-beta-y-rc-de-vista-con-fecha-de-caducidad/</guid>
		<description><![CDATA[A partir del día 1 de Junio las versiones beta y RC de Windows Vista se reiniciarán automáticamente cada 2 horas. Lo mismo el Sasser en realidad era una feature de XP&#8230;]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.neowin.net/index.php?act=view&#038;id=39716" title="Windows Vista Beta 2, RC1 y RC2 expirarán el 31 de Mayo de 2007">A partir del día 1 de Junio las versiones beta y RC de Windows Vista se reiniciarán automáticamente cada 2 horas</a>.</p>
<p>Lo mismo el <a href="http://es.wikipedia.org/wiki/Sasser" title="El temido virus pre-service pack">Sasser</a> en realidad era una feature de XP&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2007/04/25/las-beta-y-rc-de-vista-con-fecha-de-caducidad/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Servicios Windows Vista</title>
		<link>http://mundogeek.net/archivos/2007/04/16/servicios-windows-vista/</link>
		<comments>http://mundogeek.net/archivos/2007/04/16/servicios-windows-vista/#comments</comments>
		<pubDate>Mon, 16 Apr 2007 08:30:23 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[Linklog]]></category>
		<category><![CDATA[rendimiento]]></category>
		<category><![CDATA[servicios]]></category>
		<category><![CDATA[vista]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://mundogeek.net/archivos/2007/04/16/servicios-windows-vista/</guid>
		<description><![CDATA[Como ya hizo con Windows XP BlackViper ha recopilado una lista de los servicios de Windows Vista que podemos desactivar para mejorar el rendimiento.]]></description>
			<content:encoded><![CDATA[<p>Como ya hizo con Windows XP BlackViper ha recopilado una <a href="http://www.blackviper.com/WinVista/servicecfg.htm" title="Servicios Windows Vista">lista de los servicios de Windows Vista</a> que podemos desactivar para mejorar el rendimiento.</p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2007/04/16/servicios-windows-vista/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>&#8220;Hackear&#8221; contraseñas de Windows Vista</title>
		<link>http://mundogeek.net/archivos/2007/03/21/hackear-contrasenas-de-windows-vista/</link>
		<comments>http://mundogeek.net/archivos/2007/03/21/hackear-contrasenas-de-windows-vista/#comments</comments>
		<pubDate>Wed, 21 Mar 2007 15:29:22 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[Linklog]]></category>
		<category><![CDATA[cracking]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[vista]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://mundogeek.net/archivos/2007/03/21/hackear-contrasenas-de-windows-vista/</guid>
		<description><![CDATA[La nueva versión de Ophcrack puede descifrar los archivos SAM de Windows Vista.]]></description>
			<content:encoded><![CDATA[<p><a href="http://ophcrack.sourceforge.net/" title="Descifrar contraseñas Windows">La nueva versión de Ophcrack</a> puede descifrar los archivos SAM de Windows Vista.</p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2007/03/21/hackear-contrasenas-de-windows-vista/feed/</wfw:commentRss>
		<slash:comments>536</slash:comments>
		</item>
		<item>
		<title>Forzar Aero en Windows Vista</title>
		<link>http://mundogeek.net/archivos/2007/03/19/forzar-aero-en-windows-vista/</link>
		<comments>http://mundogeek.net/archivos/2007/03/19/forzar-aero-en-windows-vista/#comments</comments>
		<pubDate>Mon, 19 Mar 2007 16:04:03 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[aero]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[vista]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://mundogeek.net/archivos/2007/03/19/forzar-aero-en-windows-vista/</guid>
		<description><![CDATA[Cuando Windows Vista determina que nuestro equipo no puede correr el sistema con suficiente fluidez desactiva la nueva interfaz gráfica, Aero, con lo que perdemos entre otros cosas tan necesarias como las transparencias o el Flip3D. Para forzar a Windows Vista a utilizar Aero tenemos que: Abrir el editor de registro escribiendo regedit en Inicio [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando Windows Vista determina que nuestro equipo no puede correr el sistema con suficiente fluidez desactiva la nueva interfaz gráfica, Aero, con lo que perdemos entre otros cosas tan <em>necesarias</em> como las transparencias o el Flip3D. Para forzar a Windows Vista a utilizar Aero tenemos que:</p>
<ol>
<li>Abrir el editor de registro escribiendo regedit en Inicio -> Iniciar búsqueda.</li>
<li>Crear o modificar la clave HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM\Composition estableciendo el valor a 1 (Valor de DWORD de 32 bits)</li>
<li>Crear o modificar la clave HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM\CompositionPolicy estableciendo el valor a 2 (Valor de DWORD de 32 bits)</li>
<li>Reiniciar el gestor del escritorio escribiendo los comandos <code>net stop uxsms</code> y <code>net start uxsms</code> en la consola (Inicio -> Escribimos cmd en Iniciar búsqueda)</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2007/03/19/forzar-aero-en-windows-vista/feed/</wfw:commentRss>
		<slash:comments>233</slash:comments>
		</item>
	</channel>
</rss>

