Aplicaciones Strusts 2 Java netbeans

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 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:

  • cssClass: El atributo class de HTML. Indica la clase CSS a utilizar para el elemento HTML generado.
  • cssStyle: El atributo style de HTML. Permite definir el estilo del elemento inline, en lugar de utilizar un archivo CSS externo o una etiqueta style.
  • disabled: Determina si el control está deshabilitado.
  • label: Etiqueta que acompañará al widget. Genera una clásica etiqueta label de HTML.
  • required: Booleano indicando si el campo es obligatorio. Si es así muestra un asterisco al lado de la etiqueta.
  • tabindex: El atributo tabindex de HTML. Utilizado para establecer el orden a seguir al recorrer los controles cuando el usuario pulsa la tecla de Tabulación
  • template: Plantilla a utilizar.
  • theme: Tema a utilizar.

Ahora si, las etiquetas son las siguientes:

action

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 param.
org.apache.struts2.views.jsp.ActionTag

executeResult: determina si el resultado de la acción (normalmente otra vista) se debe ejecutar / renderizar también.
ignoreContextParams: indica si se deben incluir los parámetros de la petición actual al invocar la acción.
name (requerido): el nombre de la acción a ejecutar.
namespace: el espacio de nombres de la acción a ejecutar.

index.jsp

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. <html>
  3. <body>
  4. Antes de s:action<br/>
  5. <s:action name=»Accion» executeResult=»true»/><br/>
  6. Después de s:action
  7. </body>
  8. </html>
<%@ taglib uri="/struts-tags" prefix="s"%>

<html>
<body>
Antes de s:action<br/>
<s:action name="Accion" executeResult="true"/><br/>
Después de s:action
</body>
</html>

Accion.java

  1. import com.opensymphony.xwork2.ActionSupport;
  2. @SuppressWarnings(«serial»)
  3. public class Accion extends ActionSupport {
  4.     private String web;
  5.     public String getWeb() {
  6.         return web;
  7.     }
  8.     public String execute() {
  9.         web = «mundogeek.net»;
  10.         return SUCCESS;
  11.     }
  12. }
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;
	}
}

resultado.jsp

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. Visita <s:property value=»web»/>
<%@ taglib uri="/struts-tags" prefix="s"%>

Visita <s:property value="web"/>

actionerror

Muestra los errores que se produjeron en las acciones, si es que existen. Podemos añadir errores utilizando el método addActionError(String error) de la interfaz ValidationAware, que ActionSupport implementa. Los métodos y propiedades de ValidationAware también estarán disponibles en la vista, por lo que es posible en su lugar comprobar si existen errores con el método hasActionErrors() e iterar directamente sobre la colección actionErrors.
org.apache.struts2.views.jsp.ui.ActionErrorTag

Accion.java

  1. import com.opensymphony.xwork2.ActionSupport;
  2. @SuppressWarnings(«serial»)
  3. public class Accion extends ActionSupport {
  4.     public String execute() {
  5.         addActionError(«Oh dios mío, ¡un error!»);
  6.         return ERROR;
  7.     }
  8. }
import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	public String execute() {
		addActionError("Oh dios mío, ¡un error!");
		return ERROR;
	}
}

resultado.jsp

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. <html>
  3. <body>
  4. <s:actionerror />
  5. </body>
  6. </html>
<%@ taglib uri="/struts-tags" prefix="s"%>

<html>
<body>
<s:actionerror />
</body>
</html>

actionmessage

Similar a actionerror, 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 addActionMessage(String mensaje) de la interfaz ValidationAware. Como el anterior, también podríamos utilizar el método hasActionMessages() para comprobar la existencia de mensajes e iterar sobre la colección de strings actionMessages.
org.apache.struts2.views.jsp.ui.ActionMessageTag

Accion.java

  1. import com.opensymphony.xwork2.ActionSupport;
  2. @SuppressWarnings(«serial»)
  3. public class Accion extends ActionSupport {
  4.     public String execute() {
  5.         addActionMessage(«Tengo un mensaje para usted.»);
  6.         return SUCCESS;
  7.     }
  8. }
import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	public String execute() {
		addActionMessage("Tengo un mensaje para usted.");
		return SUCCESS;
	}
}

resultado.jsp

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. <html>
  3. <body>
  4. <s:actionmessage/>
  5. </body>
  6. </html>
<%@ taglib uri="/struts-tags" prefix="s"%>

<html>
<body>
<s:actionmessage/>
</body>
</html>

a

Crea una etiqueta anchor HTML. Se puede utilizar con el tema ajax para generar llamadas asíncronas al servidor.
org.apache.struts2.views.jsp.ui.AnchorTag

href: La URL a cargar cuando el usuario pulse sobre el enlace.
title: Atributo title de HTML.

append

Crea un nuevo iterador a partir de varios iteradores pasados como parámetro en forma de etiquetas param.
org.apache.struts2.views.jsp.iterator.AppendIteratorTag

var: el nombre que tendrá el iterador resultante en el ValueStack.

Accion.java

  1. import com.opensymphony.xwork2.ActionSupport;
  2. import java.util.List;
  3. import java.util.ArrayList;
  4. @SuppressWarnings(«serial»)
  5. public class Accion extends ActionSupport {
  6.     private List<String> registrados;
  7.     private List<String> vips;
  8.     public List<String> getRegistrados() {
  9.         return registrados;
  10.     }
  11.     public List<String> getVips() {
  12.         return vips;
  13.     }
  14.     public String execute() {
  15.         registrados = new ArrayList<String>();
  16.         registrados.add(«Juan»);
  17.         registrados.add(«Manuel»);
  18.         vips = new ArrayList<String>();
  19.         vips.add(«Pedro»);
  20.         vips.add(«María»);
  21.         return SUCCESS;
  22.     }
  23. }
import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private List<String> registrados;
	private List<String> vips;

	public List<String> getRegistrados() {
		return registrados;
	}

	public List<String> getVips() {
		return vips;
	}

	public String execute() {
		registrados = new ArrayList<String>();
		registrados.add("Juan");
		registrados.add("Manuel");

		vips = new ArrayList<String>();
		vips.add("Pedro");
		vips.add("María");

		return SUCCESS;
	}
}

resultado.jsp

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. <html>
  3. <body>
  4. <s:append var=»usuarios»>
  5.     <s:param value=»%{registrados}» />
  6.     <s:param value=»%{vips}» />
  7. </s:append>
  8. Usuarios:
  9. <ul>
  10.     <s:iterator value=»usuarios»>
  11.         <li><s:property /></li>
  12.     </s:iterator>
  13. </ul>
  14. </body>
  15. </html>
<%@ taglib uri="/struts-tags" prefix="s"%>

<html>
<body>
<s:append var="usuarios">
	<s:param value="%{registrados}" />
	<s:param value="%{vips}" />
</s:append>

Usuarios:
<ul>
	<s:iterator value="usuarios">
		<li><s:property /></li>
	</s:iterator>
</ul>
</body>
</html>

bean

Instancia un Java Bean. Se puede pasar valores a las propiedades del bean utilizando etiquetas param.
org.apache.struts2.views.jsp.BeanTag

name (requerido): La clase a instanciar.
var: Nombre con el que se añadirá la instancia a ValueStack.

Usuario.java

  1. public class Usuario {
  2.     private String nombre;
  3.     public String getNombre() {
  4.         return nombre;
  5.     }
  6.     public void setNombre(String nombre) {
  7.         this.nombre = nombre;
  8.     }
  9. }
public class Usuario {
	private String nombre;

	public String getNombre() {
		return nombre;
	}

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

resultado.jsp

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. <html>
  3. <body>
  4. <s:bean name=»Usuario» var=»miUsuario»>
  5.     <s:param name=»nombre»>Raúl</s:param>
  6. </s:bean>
  7. Bienvenido <s:property value=»#miUsuario.nombre»/>
  8. </body>
  9. </html>
<%@ taglib uri="/struts-tags" prefix="s"%>

<html>
<body>
<s:bean name="Usuario" var="miUsuario">
	<s:param name="nombre">Raúl</s:param>
</s:bean>

Bienvenido <s:property value="#miUsuario.nombre"/>
</body>
</html>

checkbox

Crea un checkbox HTML. Para una lista de varios checkboxes relacionados podemos utilizar la etiqueta checkboxlist.
org.apache.struts2.views.jsp.ui.CheckboxTag

value: Booleano que indica si el checkbox está marcado o no.

index.jsp

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. <html>
  3. <body>
  4. <s:form action=»Accion»>
  5.     <s:checkbox label=»Aceptar condiciones» name=»condiciones» value=»true» />
  6.     <s:submit value=»Enviar» />
  7. </s:form>
  8. </body>
  9. </html>
<%@ taglib uri="/struts-tags" prefix="s"%>

<html>
<body>
<s:form action="Accion">
	<s:checkbox label="Aceptar condiciones" name="condiciones" value="true" />
	<s:submit value="Enviar" />
</s:form>
</body>
</html>

Accion.java

  1. import com.opensymphony.xwork2.ActionSupport;
  2. @SuppressWarnings(«serial»)
  3. public class Accion extends ActionSupport {
  4.     private boolean condiciones;
  5.     public boolean isCondiciones() {
  6.         return condiciones;
  7.     }
  8.     public void setCondiciones(boolean condiciones) {
  9.         this.condiciones = condiciones;
  10.     }
  11.     public String execute() {
  12.         return SUCCESS;
  13.     }
  14. }
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;
	}
}

resultado.jsp

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. <html>
  3. <body>
  4. <s:if test=»condiciones»>
  5. Muchas gracias.
  6. </s:if>
  7. <s:else>
  8. Pues es una lástima.
  9. </s:else>
  10. </body>
<%@ taglib uri="/struts-tags" prefix="s"%>

<html>
<body>
<s:if test="condiciones">
Muchas gracias.
</s:if>
<s:else>
Pues es una lástima.
</s:else>
</body>

checkboxlist

Crea una lista de checkboxes relacionados (todos con el mismo atributo name). 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.
org.apache.struts2.views.jsp.ui.CheckboxListTag

list (requerido): Iterable con los valores con los que generar la lista.
listKey: Propiedad de los objetos del iterable del que el checkbox correspondiente tomará su valor.
listValue: Exactamente igual al anterior, pero en lugar del valor, el contenido.
name: Nombre de los checkboxes.

Accion.java

  1. import com.opensymphony.xwork2.ActionSupport;
  2. import java.util.List;
  3. import java.util.ArrayList;
  4. @SuppressWarnings(«serial»)
  5. public class Accion extends ActionSupport {
  6.     private List<String> lenguajes;
  7.     public List<String> getLenguajes() {
  8.         return lenguajes;
  9.     }
  10.     public String execute() {
  11.         lenguajes = new ArrayList<String>();
  12.         lenguajes.add(«Python»);
  13.         lenguajes.add(«Java»);
  14.         lenguajes.add(«Ruby»);
  15.         lenguajes.add(«C#»);
  16.         lenguajes.add(«C++»);
  17.         lenguajes.add(«Lisp»);
  18.         return SUCCESS;
  19.     }
  20. }
import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private List<String> lenguajes;

	public List<String> getLenguajes() {
		return lenguajes;
	}

	public String execute() {
		lenguajes = new ArrayList<String>();
		lenguajes.add("Python");
		lenguajes.add("Java");
		lenguajes.add("Ruby");
		lenguajes.add("C#");
		lenguajes.add("C++");
		lenguajes.add("Lisp");
		return SUCCESS;
	}
}

resultado.jsp

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. <html>
  3. <body>
  4. <body>
  5. <s:form>
  6.     <s:checkboxlist list=»lenguajes» name=»lenguajes-preferidos» />
  7.     <s:submit value=»Enviar» />
  8. </s:form>
  9. </body>
<%@ taglib uri="/struts-tags" prefix="s"%>

<html>
<body>
<body>
<s:form>
	<s:checkboxlist list="lenguajes" name="lenguajes-preferidos" />
	<s:submit value="Enviar" />
</s:form>
</body>

Struts 2 etiqueta checkboxlist

combobox

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.
org.apache.struts2.views.jsp.ui.ComboBoxTag

emptyOption: Indica si queremos añadir una opción vacía.
list (requerido): Iterable con los valores con los que generar la lista.
listKey: Propiedad de los objetos del iterable del que el checkbox correspondiente tomará su valor.
listValue: Exactamente igual al anterior, pero en lugar del valor, el contenido.
name: Nombre a usar para el elemento.
readonly: Si queremos que el usuario pueda escribir sus propios valores en la caja de texto.

Accion.java

  1. import com.opensymphony.xwork2.ActionSupport;
  2. import java.util.List;
  3. import java.util.ArrayList;
  4. @SuppressWarnings(«serial»)
  5. public class Accion extends ActionSupport {
  6.     private List<String> lenguajes;
  7.     public List<String> getLenguajes() {
  8.         return lenguajes;
  9.     }
  10.     public String execute() {
  11.         lenguajes = new ArrayList<String>();
  12.         lenguajes.add(«Python»);
  13.         lenguajes.add(«Java»);
  14.         lenguajes.add(«Ruby»);
  15.         lenguajes.add(«C#»);
  16.         lenguajes.add(«C++»);
  17.         lenguajes.add(«Lisp»);
  18.         return SUCCESS;
  19.     }
  20. }
import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private List<String> lenguajes;

	public List<String> getLenguajes() {
		return lenguajes;
	}

	public String execute() {
		lenguajes = new ArrayList<String>();
		lenguajes.add("Python");
		lenguajes.add("Java");
		lenguajes.add("Ruby");
		lenguajes.add("C#");
		lenguajes.add("C++");
		lenguajes.add("Lisp");
		return SUCCESS;
	}
}

resultado.jsp

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. <html>
  3. <body>
  4. <body>
  5. <s:form action=»Otro»>
  6.     <s:combobox list=»lenguajes» name=»nombre-lenguajes»
  7.         label=»Lenguaje preferido» readonly=»true» />
  8.     <s:submit value=»Enviar» />
  9. </s:form>
  10. </body>
<%@ taglib uri="/struts-tags" prefix="s"%>

<html>
<body>
<body>
<s:form action="Otro">
	<s:combobox list="lenguajes" name="nombre-lenguajes"
		label="Lenguaje preferido" readonly="true" />
	<s:submit value="Enviar" />
</s:form>
</body>

Struts 2 etiqueta combobox

date

Permite mostrar una fecha almacenada en una cierta variable indicando opcionalmente el formato a utilizar.
org.apache.struts2.views.jsp.DateTag

format: Formato a utilizar para mostrar la fecha. Si queremos usar siempre el mismo formato podemos crear un archivo properties con una entrada struts.date.format. Por defecto se utiliza el formato DateFormat.MEDIUM.
name (requerido): Nombre de la variable que contiene la fecha a mostrar.
nice: 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:

CLAVE VALOR POR DEFECTO
struts.date.format.past {0} ago
struts.date.format.future in {0}
struts.date.format.seconds an instant
struts.date.format.minutes {0,choice,1#one minute|1<{0} minutes}
struts.date.format.hours {0,choice,1#one hour|1<{0} hours}{1,choice,0#|1#, one minute|1<, {1} minutes}
struts.date.format.days {0,choice,1#one day|1<{0} days}{1,choice,0#|1#, one hour|1<, {1} hours}
struts.date.format.years {0,choice,1#one year|1<{0} years}{1,choice,0#|1#, one day|1<, {1} days}

Accion.java

  1. import com.opensymphony.xwork2.ActionSupport;
  2. import java.util.Calendar;
  3. import java.util.Date;
  4. @SuppressWarnings(«serial»)
  5. public class Accion extends ActionSupport {
  6.     private Date ahora;
  7.     private Date anyoNuevo;
  8.     public Date getAhora() {
  9.         return ahora;
  10.     }
  11.     public Date getAnyoNuevo() {
  12.         return anyoNuevo;
  13.     }
  14.     public String execute() {
  15.         ahora = new Date();
  16.         Calendar cal = Calendar.getInstance();
  17.         int anyo = cal.get(Calendar.YEAR);
  18.         cal.set(anyo + 1, Calendar.JANUARY, 1);
  19.         anyoNuevo = cal.getTime();
  20.         return SUCCESS;
  21.     }
  22. }
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;
	}
}

resultado.jsp

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. <html>
  3. <body>
  4. <body>
  5. Hoy es <s:date name=»ahora» format=»d ‘de’ MMMM ‘de’ yyyy» /><br/>
  6. Año nuevo <s:date name=»anyoNuevo» nice=»true» />
  7. </body>
<%@ taglib uri="/struts-tags" prefix="s"%>

<html>
<body>
<body>
Hoy es <s:date name="ahora" format="d 'de' MMMM 'de' yyyy" /><br/>
Año nuevo <s:date name="anyoNuevo" nice="true" />
</body>

debug

Imprime información de depuración (entre otros, el contenido de ValueStack).
org.apache.struts2.views.jsp.ui.DebugTag

div

Crea un elemento div de HTML.
org.apache.struts2.views.jsp.ui.DivTag

doubleselect

Crea dos elementos select HTML, con el segundo de ellos modificando sus valores dependiendo del valor seleccionado en el primero.
org.apache.struts2.views.jsp.ui.DoubleSelectTag

doubleList (requerido): Lista con los valores que tendrá el segundo select.
doubleMultiple: Determina si en el segundo select se pueden seleccionar varios valores o solo uno.
doubleName (requerido): Nombre del elemento.
list (requerido): Lista con los valores que tendrá el primer select.

Artista.java

  1. import java.util.List;
  2. public class Artista {
  3.     private String nombre;
  4.     private List<String> canciones;
  5.     public Artista(String nombre, List<String> canciones) {
  6.         this.nombre = nombre;
  7.         this.canciones = canciones;
  8.     }
  9.     public String getNombre() {
  10.         return nombre;
  11.     }
  12.     public List<String> getCanciones() {
  13.         return canciones;
  14.     }
  15. }
import java.util.List;

public class Artista {
	private String nombre;
	private List<String> canciones;

	public Artista(String nombre, List<String> canciones) {
		this.nombre = nombre;
		this.canciones = canciones;
	}

	public String getNombre() {
		return nombre;
	}

	public List<String> getCanciones() {
		return canciones;
	}
}

Accion.java

  1. import com.opensymphony.xwork2.ActionSupport;
  2. import java.util.List;
  3. import java.util.ArrayList;
  4. @SuppressWarnings(«serial»)
  5. public class Accion extends ActionSupport {
  6.     private List<Artista> artistas;
  7.     public List<Artista> getArtistas() {
  8.         return artistas;
  9.     }
  10.     public String execute() {
  11.         artistas = new ArrayList<Artista>();
  12.         List<String> canciones_p = new ArrayList<String>();
  13.         canciones_p.add(«El equilibro es imposible»);
  14.         canciones_p.add(«Años 80»);
  15.         canciones_p.add(«Promesas que no valen nada»);
  16.         Artista piratas = new Artista(«Los piratas», canciones_p);
  17.         artistas.add(piratas);
  18.         List<String> canciones_c = new ArrayList<String>();
  19.         canciones_c.add(«Viva la vida»);
  20.         canciones_c.add(«Clocks»);
  21.         canciones_c.add(«Life in technicolor»);
  22.         Artista coldplay = new Artista(«Coldplay», canciones_c);
  23.         artistas.add(coldplay);
  24.         return SUCCESS;
  25.     }
  26. }
import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private List<Artista> artistas;

	public List<Artista> getArtistas() {
		return artistas;
	}

	public String execute() {
		artistas = new ArrayList<Artista>();

		List<String> canciones_p = new ArrayList<String>();
		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<String> canciones_c = new ArrayList<String>();
		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;
	}
}

resultado.jsp

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. <html>
  3. <body>
  4. <body>
  5. <s:form action=»Otro»>
  6.     <s:doubleselect label=»Selecciona la canción» list=»artistas»
  7.         listValue=»nombre» doubleList=»canciones» doubleName=»cancion» />
  8.     <s:submit value=»Enviar» />
  9. </s:form>
  10. </body>
<%@ taglib uri="/struts-tags" prefix="s"%>

<html>
<body>
<body>
<s:form action="Otro">
	<s:doubleselect label="Selecciona la canción" list="artistas"
		listValue="nombre" doubleList="canciones" doubleName="cancion" />
	<s:submit value="Enviar" />
</s:form>
</body>

Struts 2 etiqueta doubleselect

fielderror

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 param. El funcionamiento es parecido al de actionerror y actionmessage: podemos añadir errores utilizando el método addFieldError(String fieldName, String errorMessage) de la interfaz ValidationAware, que ActionSupport 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 ValidationAware también estarán disponibles en la vista, por lo que es posible en su lugar comprobar si existen errores con el método hasFieldErrors() e iterar directamente sobre la colección fieldErrors.
org.apache.struts2.views.jsp.ui.FieldErrorTag

index.jsp

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. <html>
  3. <body>
  4. <s:fielderror />
  5. <s:form action=»Accion»>
  6.     <s:textfield label=»Nombre» name=»nombre» />
  7.     <s:submit value=»Enviar» />
  8. </s:form>
  9. </body>
  10. </html>
<%@ taglib uri="/struts-tags" prefix="s"%>

<html>
<body>
<s:fielderror />

<s:form action="Accion">
	<s:textfield label="Nombre" name="nombre" />
	<s:submit value="Enviar" />
</s:form>

</body>
</html>

Accion.java

  1. import com.opensymphony.xwork2.ActionSupport;
  2. @SuppressWarnings(«serial»)
  3. public class Accion extends ActionSupport {
  4.     private String nombre;
  5.     public String getNombre() {
  6.         return nombre;
  7.     }
  8.     public void setNombre(String nombre) {
  9.         this.nombre = nombre;
  10.     }
  11.     public String execute() {
  12.         if(nombre.length() > 10) {
  13.             addFieldError(«nombre», «El nombre no puede tener más de 10 caracteres.»);
  14.             return ERROR;
  15.         }
  16.         return SUCCESS;
  17.     }
  18. }
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() > 10) {
			addFieldError("nombre", "El nombre no puede tener más de 10 caracteres.");
			return ERROR;
		}

		return SUCCESS;
	}
}

resultado.jsp

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. <html>
  3. <body>
  4. <body>
  5. <s:fielderror />
  6. </body>
<%@ taglib uri="/struts-tags" prefix="s"%>

<html>
<body>
<body>
<s:fielderror />
</body>

file

Muestra un campo file de HTML. Para facilitarnos la vida podemos aprovechar el interceptor fileUpload que se encuentra en la selección de interceptores por defecto (defaultStack) y que funciona de forma parecida al interceptor param. Basta crear setters y getters en la acción para las nuevas propiedades nombre (el archivo en si), nombreContentType (el tipo MIME del archivo subido) o nombreFileName (el nombre del archivo subido) para tener acceso a estos valores en la acción.
org.apache.struts2.views.jsp.ui.FileTag

accept: atributo del mismo nombre de HTML que permite indicar los tipos MIME que acepta el campo.

index.jsp

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. <html>
  3. <body>
  4. <s:form enctype=»multipart/form-data» method=»POST» action=»Accion»>
  5.     <s:file label=»Archivo a enviar» name=»archivoTexto»
  6.         accept=»text/txt» />
  7.     <s:submit value=»Enviar» />
  8. </s:form>
  9. </body>
  10. </html>
<%@ taglib uri="/struts-tags" prefix="s"%>

<html>
<body>

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

</body>
</html>

Accion.java

  1. import com.opensymphony.xwork2.ActionSupport;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileReader;
  5. import java.io.IOException;
  6. @SuppressWarnings(«serial»)
  7. public class Accion extends ActionSupport {
  8.     private File archivoTexto;
  9.     private String archivoTextoContentType;
  10.     private String archivoTextoFileName;
  11.     private String contenido;
  12.     public String getContenido() {
  13.         return contenido;
  14.     }
  15.     public File getArchivoTexto() {
  16.         return archivoTexto;
  17.     }
  18.     public void setArchivoTexto(File archivoTexto) {
  19.         this.archivoTexto = archivoTexto;
  20.     }
  21.     public String getArchivoTextoContentType() {
  22.         return archivoTextoContentType;
  23.     }
  24.     public void setArchivoTextoContentType(String archivoTextoContentType) {
  25.         this.archivoTextoContentType = archivoTextoContentType;
  26.     }
  27.     public String getArchivoTextoFileName() {
  28.         return archivoTextoFileName;
  29.     }
  30.     public void setArchivoTextoFileName(String archivoTextoFileName) {
  31.         this.archivoTextoFileName = archivoTextoFileName;
  32.     }
  33.     public String execute() throws IOException {
  34.         BufferedReader input = new BufferedReader(new FileReader(archivoTexto));
  35.         String linea = «»;
  36.         contenido = «»;
  37.         while ((linea = input.readLine()) != null)
  38.             contenido = contenido + linea;
  39.         return SUCCESS;
  40.     }
  41. }
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;
	}
}

resultado.jsp

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. <html>
  3. <body>
  4. <body>
  5. <strong>Archivo</strong>: <s:property value=»archivoTextoFileName»/><br/>
  6. <strong>Tipo</strong>: <s:property value=»archivoTextoContentType»/><br/>
  7. <strong>Contenido</strong>: <s:property value=»contenido»/>
  8. </body>
<%@ taglib uri="/struts-tags" prefix="s"%>

<html>
<body>
<body>
<strong>Archivo</strong>: <s:property value="archivoTextoFileName"/><br/>
<strong>Tipo</strong>: <s:property value="archivoTextoContentType"/><br/>
<strong>Contenido</strong>: <s:property value="contenido"/>
</body>

Struts 2 etiqueta file

form

Crea un elemento form de HTML.
org.apache.struts2.views.jsp.ui.FormTag

action: 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.
namespace: 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.
validate: Si queremos validar los campos del formulario antes de enviarlos.

component

Utilizado para crear nuestras propias etiquetas sin tener que recurrir a la API de etiquetas de JSP.
org.apache.struts2.views.jsp.ui.ComponentTag

head

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.
org.apache.struts2.views.jsp.ui.HeadTag

hidden

Crea un campo oculto.
org.apache.struts2.views.jsp.ui.HiddenTag

i18n

Carga un archivo de recursos adicional con la traducción de nuestros mensajes y los coloca en ValueStack de forma que puedan ser accedidos fácilmente por el código que se encuentre dentro de la etiqueta.
org.apache.struts2.views.jsp.I18nTag

name (requerido): Nombre del ResourceBundle a cargar.

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. <html>
  3. <body>
  4. <s:i18n name=»textos»>
  5.     <s:text name=»bienvenida» />
  6. </s:i18n>
  7. </body>
  8. </html>
<%@ taglib uri="/struts-tags" prefix="s"%>

<html>
<body>

<s:i18n name="textos">
	<s:text name="bienvenida" />
</s:i18n>

</body>
</html>

if-elseif-else

La típica sentencia condicional.
org.apache.struts2.views.jsp.IfTag
org.apache.struts2.views.jsp.ElseIfTag
org.apache.struts2.views.jsp.ElseTag

test (requerido para if y elseif): la expresión a comprobar

index.jsp

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. <html>
  3. <body>
  4. <s:if test=»ventas < 1000″>Comisión del 1%</s:if>
  5. <s:elseif test=»ventas < 2000″>Comisión del 2%</s:elseif>
  6. <s:else>Comisión del 3%</s:else>
  7. </body>
  8. </html>
<%@ taglib uri="/struts-tags" prefix="s"%>

<html>
<body>

<s:if test="ventas < 1000">Comisión del 1%</s:if>
<s:elseif test="ventas < 2000">Comisión del 2%</s:elseif>
<s:else>Comisión del 3%</s:else>

</body>
</html>

include

Parecido a action con el parámetro executeResult, pero, a diferencia de este, permite incluir cualquier recurso. Como el include de JSP también se le pueden pasar parámetros para que sea dinámico con etiquetas param, pero estos valores no se acceden como propiedades de ValueStack, sino como parámetros de la petición.
org.apache.struts2.views.jsp.IncludeTag

value (requerido): El recurso a incluir.

header.jsp

  1. <h1>Bienvenido a ${param.web}</h1>
<h1>Bienvenido a ${param.web}</h1>

index.jsp

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. <html>
  3. <body>
  4. <s:include value=»header.jsp»>
  5.     <s:param name=»web»>http://mundogeek.net</s:param&gt;
  6. </s:include>
  7. Contenido.
  8. </body>
  9. </html>
<%@ taglib uri="/struts-tags" prefix="s"%>

<html>
<body>
<s:include value="header.jsp">
	<s:param name="web">http://mundogeek.net</s:param>
</s:include>
Contenido.
</body>
</html>

inputtransferselect

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.
org.apache.struts2.views.jsp.ui.InputTransferSelectTag

allowRemoveAll: Determina si se mostrará el botón para eliminar todos los valores.
allowUpDown: Determina si se mostrarán los botones para subir y bajar los valores en la lista.
downLabel: Etiqueta del botón que baja los valores.
list (requerido): Lista con los valores que tendrá el select al comenzar.
removeAllLabel: Etiqueta del botón que elimina todos los valores.
removeLabel: Etiqueta del botón que elimina un valor.
upLabel: Etiqueta del botón que sube los valores.

Accion.java

  1. import com.opensymphony.xwork2.ActionSupport;
  2. import java.util.List;
  3. import java.util.ArrayList;
  4. @SuppressWarnings(«serial»)
  5. public class Accion extends ActionSupport {
  6.     private List<String> lenguajes;
  7.     public List<String> getLenguajes() {
  8.         return lenguajes;
  9.     }
  10.     public String execute() {
  11.         lenguajes = new ArrayList<String>();
  12.         lenguajes.add(«Python»);
  13.         lenguajes.add(«Java»);
  14.         lenguajes.add(«Ruby»);
  15.         lenguajes.add(«C#»);
  16.         lenguajes.add(«C++»);
  17.         lenguajes.add(«Lisp»);
  18.         return SUCCESS;
  19.     }
  20. }
import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings("serial")
public class Accion extends ActionSupport {
	private List<String> lenguajes;

	public List<String> getLenguajes() {
		return lenguajes;
	}

	public String execute() {
		lenguajes = new ArrayList<String>();
		lenguajes.add("Python");
		lenguajes.add("Java");
		lenguajes.add("Ruby");
		lenguajes.add("C#");
		lenguajes.add("C++");
		lenguajes.add("Lisp");
		return SUCCESS;
	}
}

resultado.jsp

  1. <%@ taglib uri=»/struts-tags» prefix=»s»%>
  2. <html>
  3. <body>
  4. <s:form>
  5.     <s:inputtransferselect label=»¿Cuáles son tus lenguajes favoritos?»
  6.         list=»lenguajes» />
  7.     <s:submit value=»Enviar» />
  8. </s:form>
  9. </body>
  10. </html>
<%@ taglib uri="/struts-tags" prefix="s"%>

<html>
<body>
<s:form>
	<s:inputtransferselect label="¿Cuáles son tus lenguajes favoritos?"
		list="lenguajes" />
	<s:submit value="Enviar" />
</s:form>
</body>
</html>

Struts 2 etiqueta inputtransferselect

iterator

Para iterar sobre colecciones. En cada iteración el objeto recuperado se coloca en ValueStack para poder acceder a sus propiedades fácilmente.
org.apache.struts2.views.jsp.IteratorTag

status: Crea una instancia de IteratorStatus con el nombre indicado. Este objeto expone algunas propiedades muy útiles como index (índice del elemento actual), first (booleano que indica si es el primero elemento), even (booleano que indica si es impar), last (booleano que indica si es el último elemento) u odd (booleano que indica si es par).
value: Colección sobre la que iterar.
Accion.java

view plaincopy to clipboardprint?
1.import com.opensymphony.xwork2.ActionSupport;
2.import java.util.List;
3.import java.util.ArrayList;
4.
5.@SuppressWarnings(«serial»)
6.public class Accion extends ActionSupport {
7.    private List<String> lenguajes;
8.
9.    public List<String> getLenguajes() {
10.        return lenguajes;
11.    }
12.
13.    public String execute() {
14.        lenguajes = new ArrayList<String>();
15.        lenguajes.add(«Python»);
16.        lenguajes.add(«Java»);
17.        lenguajes.add(«Ruby»);
18.        lenguajes.add(«C#»);
19.        lenguajes.add(«C++»);
20.        lenguajes.add(«Lisp»);
21.        return SUCCESS;
22.    }
23.}
import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings(«serial»)
public class Accion extends ActionSupport {
private List<String> lenguajes;

public List<String> getLenguajes() {
return lenguajes;
}

public String execute() {
lenguajes = new ArrayList<String>();
lenguajes.add(«Python»);
lenguajes.add(«Java»);
lenguajes.add(«Ruby»);
lenguajes.add(«C#»);
lenguajes.add(«C++»);
lenguajes.add(«Lisp»);
return SUCCESS;
}
}resultado.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.Tus lenguajes preferidos son:
6.<ul>
7.    <s:iterator value=»lenguajes»>
8.        <li><s:property /></li>
9.    </s:iterator>
10.</ul>
11.</body>
12.</html>
<%@ taglib uri=»/struts-tags» prefix=»s»%>

<html>
<body>
Tus lenguajes preferidos son:
<ul>
<s:iterator value=»lenguajes»>
<li><s:property /></li>
</s:iterator>
</ul>
</body>
</html>label
Crea una etiqueta label de HTML.
org.apache.struts2.views.jsp.ui.LabelTag

merge
Crea un nuevo iterador unión de los distintos iteradores pasados como parámetro mediante etiquetas param.
org.apache.struts2.views.jsp.iterator.MergeIteratorTag

var: Nombre que se usará en ValueStack para el nuevo iterador.

Accion.java

view plaincopy to clipboardprint?
1.import com.opensymphony.xwork2.ActionSupport;
2.import java.util.List;
3.import java.util.ArrayList;
4.
5.@SuppressWarnings(«serial»)
6.public class Accion extends ActionSupport {
7.    private List<String> lista1;
8.    private List<String> lista2;
9.
10.    public List<String> getLista1() {
11.        return lista1;
12.    }
13.
14.    public void setLista1(List<String> lista1) {
15.        this.lista1 = lista1;
16.    }
17.
18.    public List<String> getLista2() {
19.        return lista2;
20.    }
21.
22.    public void setLista2(List<String> lista2) {
23.        this.lista2 = lista2;
24.    }
25.
26.    public String execute() {
27.        lista1 = new ArrayList<String>();
28.        lista1.add(«Uno»);
29.        lista1.add(«Dos»);
30.        lista1.add(«Tres»);
31.
32.        lista2 = new ArrayList<String>();
33.        lista2.add(«1»);
34.        lista2.add(«2»);
35.        lista2.add(«3»);
36.
37.        return SUCCESS;
38.    }
39.}
import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings(«serial»)
public class Accion extends ActionSupport {
private List<String> lista1;
private List<String> lista2;

public List<String> getLista1() {
return lista1;
}

public void setLista1(List<String> lista1) {
this.lista1 = lista1;
}

public List<String> getLista2() {
return lista2;
}

public void setLista2(List<String> lista2) {
this.lista2 = lista2;
}

public String execute() {
lista1 = new ArrayList<String>();
lista1.add(«Uno»);
lista1.add(«Dos»);
lista1.add(«Tres»);

lista2 = new ArrayList<String>();
lista2.add(«1»);
lista2.add(«2»);
lista2.add(«3″);

return SUCCESS;
}
}resultado.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.
6.<s:merge var=»nuevaLista»>
7.    <s:param value=»lista1″ />
8.    <s:param value=»lista2″ />
9.</s:merge>
10.
11.<ul>
12.    <s:iterator value=»nuevaLista»>
13.        <li><s:property /></li>
14.    </s:iterator>
15.</ul>
16.</body>
17.</html>
<%@ taglib uri=»/struts-tags» prefix=»s»%>

<html>
<body>

<s:merge var=»nuevaLista»>
<s:param value=»lista1″ />
<s:param value=»lista2″ />
</s:merge>

<ul>
<s:iterator value=»nuevaLista»>
<li><s:property /></li>
</s:iterator>
</ul>
</body>
</html>optgroup
Crea un nuevo elemento HTML optgroup (un grupo de opciones para un elemento select)
org.apache.struts2.views.jsp.ui.OptGroupTag

list: El objeto del que se tomarán los valores con los que rellenar el elemento.

Accion.java

view plaincopy to clipboardprint?
1.import com.opensymphony.xwork2.ActionSupport;
2.
3.import java.util.HashMap;
4.
5.@SuppressWarnings(«serial»)
6.public class Accion extends ActionSupport {
7.    private HashMap<String, String> registrados;
8.    private HashMap<String, String> vips;
9.
10.    public HashMap<String, String> getVips() {
11.        return vips;
12.    }
13.
14.    public void setVips(HashMap<String, String> vips) {
15.        this.vips = vips;
16.    }
17.
18.    public HashMap<String, String> getRegistrados() {
19.        return registrados;
20.    }
21.
22.    public void setRegistrados(HashMap<String, String> registrados) {
23.        this.registrados = registrados;
24.    }
25.
26.    public String execute() {
27.        registrados = new HashMap<String, String>();
28.        registrados.put(«Juan», «Juan Encina»);
29.        registrados.put(«Manuel», «Manuel Robledo»);
30.
31.        vips = new HashMap<String, String>();
32.        vips.put(«Pedro», «Pedro Peral»);
33.        vips.put(«María», «María Manzano»);
34.
35.        return SUCCESS;
36.    }
37.}
import com.opensymphony.xwork2.ActionSupport;

import java.util.HashMap;

@SuppressWarnings(«serial»)
public class Accion extends ActionSupport {
private HashMap<String, String> registrados;
private HashMap<String, String> vips;

public HashMap<String, String> getVips() {
return vips;
}

public void setVips(HashMap<String, String> vips) {
this.vips = vips;
}

public HashMap<String, String> getRegistrados() {
return registrados;
}

public void setRegistrados(HashMap<String, String> registrados) {
this.registrados = registrados;
}

public String execute() {
registrados = new HashMap<String, String>();
registrados.put(«Juan», «Juan Encina»);
registrados.put(«Manuel», «Manuel Robledo»);

vips = new HashMap<String, String>();
vips.put(«Pedro», «Pedro Peral»);
vips.put(«María», «María Manzano»);

return SUCCESS;
}
}resultado.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.
6.<s:form>
7.    <s:select list=»{}»>
8.        <s:optgroup label=»Registrados» list=»registrados» />
9.        <s:optgroup label=»VIPs» list=»vips» />
10.    </s:select>
11.    <s:submit value=»Enviar» />
12.</s:form>
13.
14.</body>
15.</html>
<%@ taglib uri=»/struts-tags» prefix=»s»%>

<html>
<body>

<s:form>
<s:select list=»{}»>
<s:optgroup label=»Registrados» list=»registrados» />
<s:optgroup label=»VIPs» list=»vips» />
</s:select>
<s:submit value=»Enviar» />
</s:form>

</body>
</html>

optiontransferselect
Crea un componente consistente en dos selects cuyos elementos pueden traspasarse de uno a otro.
org.apache.struts2.views.jsp.ui.OptionTransferSelectTag

doubleList (requerido): El iterador con los valores que tendrá el segundo select al comenzar.
doubleName (requerido): Nombre a utilizar para el elemento.
leftTitle: Título del primer select.
list: El iterador con los valores que tendrá el primer select al comenzar.
rightTitle: Título del segundo select

Accion.java

view plaincopy to clipboardprint?
1.import com.opensymphony.xwork2.ActionSupport;
2.
3.import java.util.HashMap;
4.
5.@SuppressWarnings(«serial»)
6.public class Accion extends ActionSupport {
7.    private HashMap<String, String> registrados;
8.    private HashMap<String, String> vips;
9.
10.    public HashMap<String, String> getVips() {
11.        return vips;
12.    }
13.
14.    public void setVips(HashMap<String, String> vips) {
15.        this.vips = vips;
16.    }
17.
18.    public HashMap<String, String> getRegistrados() {
19.        return registrados;
20.    }
21.
22.    public void setRegistrados(HashMap<String, String> registrados) {
23.        this.registrados = registrados;
24.    }
25.
26.    public String execute() {
27.        registrados = new HashMap<String, String>();
28.        registrados.put(«Juan», «Juan Encina»);
29.        registrados.put(«Manuel», «Manuel Robledo»);
30.
31.        vips = new HashMap<String, String>();
32.        vips.put(«Pedro», «Pedro Peral»);
33.        vips.put(«María», «María Manzano»);
34.
35.        return SUCCESS;
36.    }
37.}
import com.opensymphony.xwork2.ActionSupport;

import java.util.HashMap;

@SuppressWarnings(«serial»)
public class Accion extends ActionSupport {
private HashMap<String, String> registrados;
private HashMap<String, String> vips;

public HashMap<String, String> getVips() {
return vips;
}

public void setVips(HashMap<String, String> vips) {
this.vips = vips;
}

public HashMap<String, String> getRegistrados() {
return registrados;
}

public void setRegistrados(HashMap<String, String> registrados) {
this.registrados = registrados;
}

public String execute() {
registrados = new HashMap<String, String>();
registrados.put(«Juan», «Juan Encina»);
registrados.put(«Manuel», «Manuel Robledo»);

vips = new HashMap<String, String>();
vips.put(«Pedro», «Pedro Peral»);
vips.put(«María», «María Manzano»);

return SUCCESS;
}
}resultado.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.
6.<s:form action=»Otro»>
7.    <s:optiontransferselect list=»registrados» leftTitle=»Registrados»
8.        doubleList=»vips» rightTitle=»VIPs» doubleName=»usuarios» />
9.    <s:submit value=»Enviar» />
10.</s:form>
11.
12.</body>
13.</html>
<%@ taglib uri=»/struts-tags» prefix=»s»%>

<html>
<body>

<s:form action=»Otro»>
<s:optiontransferselect list=»registrados» leftTitle=»Registrados»
doubleList=»vips» rightTitle=»VIPs» doubleName=»usuarios» />
<s:submit value=»Enviar» />
</s:form>

</body>
</html>

param
Utilizada para añadir parámetros a otras etiquetas.
org.apache.struts2.views.jsp.ParamTag

name: Nombre del parámetro.
value: Valor del parámetro.

password
Crea un elemento password de HTML.
org.apache.struts2.views.jsp.ui.PasswordTag

showPassword: Indica si queremos que se muestren los caracteres en claro.

resultado.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.
6.<s:form action=»Otro»>
7.    <s:textfield label=»Nombre» />
8.    <s:password label=»Contraseña» />
9.    <s:submit value=»Enviar» />
10.</s:form>
11.
12.</body>
13.</html>
<%@ taglib uri=»/struts-tags» prefix=»s»%>

<html>
<body>

<s:form action=»Otro»>
<s:textfield label=»Nombre» />
<s:password label=»Contraseña» />
<s:submit value=»Enviar» />
</s:form>

</body>
</html>

property
Muestra una propiedad de ValueStack u otro objeto de ActionContext.
org.apache.struts2.views.jsp.PropertyTag

default: Valor a mostrar en caso de que el valor pedido sea nulo.
escape: Determina si queremos que se escape el HTML. Por defecto es true.
value: Valor a mostrar.

Accion.java

view plaincopy to clipboardprint?
1.import com.opensymphony.xwork2.ActionSupport;
2.
3.@SuppressWarnings(«serial»)
4.public class Accion extends ActionSupport {
5.    private String web;
6.
7.    public String getWeb() {
8.        return web;
9.    }
10.
11.    public void setWeb(String web) {
12.        this.web = web;
13.    }
14.
15.    public String execute() {
16.        web = «mundogeek.net»;
17.        return SUCCESS;
18.    }
19.}
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;
}
}resultado.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.
6.Visita <s:property value=»web» default=»google.es» />
7.</body>
8.</html>
<%@ taglib uri=»/struts-tags» prefix=»s»%>

<html>
<body>

Visita <s:property value=»web» default=»google.es» />
</body>
</html>push
Añade el valor especificado a lo alto de la pila.
org.apache.struts2.views.jsp.PushTag

value (requerido): El valor a añadir.

radio
Crea un conjunto de radio buttons HTML.
org.apache.struts2.views.jsp.ui.RadioTag

list (requerido): Lista con los valores que tendrá el grupo de radio buttons.

Accion.java

view plaincopy to clipboardprint?
1.import com.opensymphony.xwork2.ActionSupport;
2.import java.util.List;
3.import java.util.ArrayList;
4.
5.@SuppressWarnings(«serial»)
6.public class Accion extends ActionSupport {
7.    private List<String> lenguajes;
8.
9.    public List<String> getLenguajes() {
10.        return lenguajes;
11.    }
12.
13.    public String execute() {
14.        lenguajes = new ArrayList<String>();
15.        lenguajes.add(«Python»);
16.        lenguajes.add(«Java»);
17.        lenguajes.add(«Ruby»);
18.        lenguajes.add(«C#»);
19.        lenguajes.add(«C++»);
20.        lenguajes.add(«Lisp»);
21.        return SUCCESS;
22.    }
23.}
import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings(«serial»)
public class Accion extends ActionSupport {
private List<String> lenguajes;

public List<String> getLenguajes() {
return lenguajes;
}

public String execute() {
lenguajes = new ArrayList<String>();
lenguajes.add(«Python»);
lenguajes.add(«Java»);
lenguajes.add(«Ruby»);
lenguajes.add(«C#»);
lenguajes.add(«C++»);
lenguajes.add(«Lisp»);
return SUCCESS;
}
}resultado.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.<s:form>
6.    <s:radio label=»Selecciona tu lenguaje preferido» list=»lenguajes» />
7.    <s:submit value=»Enviar» />
8.</s:form>
9.</body>
10.</html>
<%@ taglib uri=»/struts-tags» prefix=»s»%>

<html>
<body>
<s:form>
<s:radio label=»Selecciona tu lenguaje preferido» list=»lenguajes» />
<s:submit value=»Enviar» />
</s:form>
</body>
</html>reset
Crea un botón que borra los datos introducidos en el formulario.
org.apache.struts2.views.jsp.ui.ResetTag

value: Texto a utilizar para el botón

resultado.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.
6.<s:form action=»Otro»>
7.    <s:textfield label=»Nombre» />
8.    <s:password label=»Contraseña» />
9.    <s:reset value=»Borrar» />
10.    <s:submit value=»Enviar» />
11.</s:form>
12.
13.</body>
14.</html>
<%@ taglib uri=»/struts-tags» prefix=»s»%>

<html>
<body>

<s:form action=»Otro»>
<s:textfield label=»Nombre» />
<s:password label=»Contraseña» />
<s:reset value=»Borrar» />
<s:submit value=»Enviar» />
</s:form>

</body>
</html>

select
Crea un elemento select.
org.apache.struts2.views.jsp.ui.SelectTag

list: El iterable con los valores que tendrá el select.

Accion.java

view plaincopy to clipboardprint?
1.import com.opensymphony.xwork2.ActionSupport;
2.import java.util.List;
3.import java.util.ArrayList;
4.
5.@SuppressWarnings(«serial»)
6.public class Accion extends ActionSupport {
7.    private List<String> lenguajes;
8.
9.    public List<String> getLenguajes() {
10.        return lenguajes;
11.    }
12.
13.    public String execute() {
14.        lenguajes = new ArrayList<String>();
15.        lenguajes.add(«Python»);
16.        lenguajes.add(«Java»);
17.        lenguajes.add(«Ruby»);
18.        lenguajes.add(«C#»);
19.        lenguajes.add(«C++»);
20.        lenguajes.add(«Lisp»);
21.        return SUCCESS;
22.    }
23.}
import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings(«serial»)
public class Accion extends ActionSupport {
private List<String> lenguajes;

public List<String> getLenguajes() {
return lenguajes;
}

public String execute() {
lenguajes = new ArrayList<String>();
lenguajes.add(«Python»);
lenguajes.add(«Java»);
lenguajes.add(«Ruby»);
lenguajes.add(«C#»);
lenguajes.add(«C++»);
lenguajes.add(«Lisp»);
return SUCCESS;
}
}resultado.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.
6.<s:form action=»Otro»>
7.    <s:select label=»Lenguaje preferido» list=»lenguajes» />
8.    <s:submit value=»Enviar» />
9.</s:form>
10.
11.</body>
12.</html>
<%@ taglib uri=»/struts-tags» prefix=»s»%>

<html>
<body>

<s:form action=»Otro»>
<s:select label=»Lenguaje preferido» list=»lenguajes» />
<s:submit value=»Enviar» />
</s:form>

</body>
</html>

set
Asigna un valor a una variable, opcionalmente indicando el ámbito al que añadirla. El valor se puede indicar utilizando el atributo value, o encerrando el valor en la propia etiqueta.
org.apache.struts2.views.jsp.SetTag

name: Nombre a utilizar para la variable.
scope: Ámbito en el que añadir la variable. Puede ser application, session, request, page, o action. Por defecto se utiliza action.
value: Valor a asignar.

resultado.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.<s:set name=»nombre»>Raúl</s:set>
6.Hola <s:property value=»nombre» />
7.</body>
8.</html>
<%@ taglib uri=»/struts-tags» prefix=»s»%>

<html>
<body>
<s:set name=»nombre»>Raúl</s:set>
Hola <s:property value=»nombre» />
</body>
</html>submit
Crea un botón para enviar el formulario.
org.apache.struts2.views.jsp.ui.SubmitTag

value: Texto a utilizar para el botón

resultado.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.
6.<s:form action=»Otro»>
7.    <s:textfield label=»Nombre» />
8.    <s:password label=»Contraseña» />
9.    <s:reset value=»Borrar» />
10.    <s:submit value=»Enviar» />
11.</s:form>
12.
13.</body>
14.</html>
<%@ taglib uri=»/struts-tags» prefix=»s»%>

<html>
<body>

<s:form action=»Otro»>
<s:textfield label=»Nombre» />
<s:password label=»Contraseña» />
<s:reset value=»Borrar» />
<s:submit value=»Enviar» />
</s:form>

</body>
</html>text
Muestra un texto localizado de un resource bundle.
org.apache.struts2.views.jsp.TextTag

name (requerido): La clave a buscar en el resource bundle.

index.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.<s:url id=»en» action=»Accion»>
6.    <s:param name=»request_locale»>en</s:param>
7.</s:url>
8.
9.<s:url id=»fr» action=»Accion»>
10.    <s:param name=»request_locale»>fr</s:param>
11.</s:url>
12.
13.<ul>
14.    <li><s:a href=»Accion»>Español</s:a></li>
15.    <li><s:a href=»%{en}»>Inglés</s:a></li>
16.    <li><s:a href=»%{fr}»>Francés</s:a></li>
17.</body>
18.</html>
<%@ taglib uri=»/struts-tags» prefix=»s»%>

<html>
<body>
<s:url id=»en» action=»Accion»>
<s:param name=»request_locale»>en</s:param>
</s:url>

<s:url id=»fr» action=»Accion»>
<s:param name=»request_locale»>fr</s:param>
</s:url>

<ul>
<li><s:a href=»Accion»>Español</s:a></li>
<li><s:a href=»%{en}»>Inglés</s:a></li>
<li><s:a href=»%{fr}»>Francés</s:a></li>
</body>
</html>Accion.properties

mensaje = ¡Hola Mundo!Accion_en.properties

mensaje = Hello World!Accion_fr.properties

mensaje = Bonjour le monde!resultado.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.<s:text name=»mensaje» />
6.</body>
7.</html>
<%@ taglib uri=»/struts-tags» prefix=»s»%>

<html>
<body>
<s:text name=»mensaje» />
</body>
</html>textarea
Crea un elemento textarea de HTML.
org.apache.struts2.views.jsp.ui.TextareaTag

cols: Atributo cols de HTML (número de columnas).
rows: Atributo rows de HTML (número de filas).
value: El texto que mostrará el área de texto.

resultado.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.<s:textarea cols=»40″ rows=»10″ value=»Hola mundo» />
6.</body>
7.</html>
<%@ taglib uri=»/struts-tags» prefix=»s»%>

<html>
<body>
<s:textarea cols=»40″ rows=»10″ value=»Hola mundo» />
</body>
</html>

textfield
Crea una caja de texto.
org.apache.struts2.views.jsp.ui.TextFieldTag

maxlength: Atributo maxlength de HTML (número máximo de caracteres permitidos)
readonly: Determina si el campo será de solo lectura.
size: Atributo size de HTML (tamaño de la caja de texto en caracteres)

resultado.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.<s:textfield label=»Nombre» maxlength=»10″ size=»10″ />
6.</body>
7.</html>
<%@ taglib uri=»/struts-tags» prefix=»s»%>

<html>
<body>
<s:textfield label=»Nombre» maxlength=»10″ size=»10″ />
</body>
</html>

token
Añade un token oculto al formulario para ayudar a los interceptores token y tokenSession a evitar que el usuario mande la misma petición varias veces por error.
org.apache.struts2.views.jsp.ui.TokenTag

resultado.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.<s:form action=»Comprar»>
6.    <ul>
7.        <li>The Pragmatic Programmer … 50€</li>
8.        <li>Code Complete … 50€</li>
9.    </ul>
10.    <s:token />
11.    <s:submit value=»Comprar» />
12.</s:form>
13.</body>
14.</html>
<%@ taglib uri=»/struts-tags» prefix=»s»%>

<html>
<body>
<s:form action=»Comprar»>
<ul>
<li>The Pragmatic Programmer … 50€</li>
<li>Code Complete … 50€</li>
</ul>
<s:token />
<s:submit value=»Comprar» />
</s:form>
</body>
</html>url
Crea una URL. Se pueden añadir parámetros a la URL usando etiquetas param.
org.apache.struts2.views.jsp.URLTag

action: Acción a la que llama la URL. Si queremos pasar una URL directamente se utiliza value.
encode: Indica si queremos hacer reescritura de URLs para mantener sesiones si el usuario tiene las cookies deshabilitadas.
value: URL base.

updownselect
Crea un select con botones para ordenar los elementos según el gusto del usuario.
org.apache.struts2.views.jsp.ui.UpDownSelectTag

list: El iterable con los valores que tendrá el select.

Accion.java

view plaincopy to clipboardprint?
1.import com.opensymphony.xwork2.ActionSupport;
2.import java.util.List;
3.import java.util.ArrayList;
4.
5.@SuppressWarnings(«serial»)
6.public class Accion extends ActionSupport {
7.    private List<String> lenguajes;
8.
9.    public List<String> getLenguajes() {
10.        return lenguajes;
11.    }
12.
13.    public String execute() {
14.        lenguajes = new ArrayList<String>();
15.        lenguajes.add(«Python»);
16.        lenguajes.add(«Java»);
17.        lenguajes.add(«Ruby»);
18.        lenguajes.add(«C#»);
19.        lenguajes.add(«C++»);
20.        lenguajes.add(«Lisp»);
21.        return SUCCESS;
22.    }
23.}
import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings(«serial»)
public class Accion extends ActionSupport {
private List<String> lenguajes;

public List<String> getLenguajes() {
return lenguajes;
}

public String execute() {
lenguajes = new ArrayList<String>();
lenguajes.add(«Python»);
lenguajes.add(«Java»);
lenguajes.add(«Ruby»);
lenguajes.add(«C#»);
lenguajes.add(«C++»);
lenguajes.add(«Lisp»);
return SUCCESS;
}
}resultado.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.
6.<s:form action=»Otro»>
7.    <s:updownselect label=»Lenguaje preferido» list=»lenguajes» />
8.    <s:submit value=»Enviar» />
9.</s:form>
10.
11.</body>
12.</html>
<%@ taglib uri=»/struts-tags» prefix=»s»%>

<html>
<body>

<s:form action=»Otro»>
<s:updownselect label=»Lenguaje preferido» list=»lenguajes» />
<s:submit value=»Enviar» />
</s:form>

</body>
</html>

generator
Genera un nuevo iterador. Los valores se obtienen dividiendo la cadena val usando como separador el caracter indicado en separator.
org.apache.struts2.views.jsp.iterator.IteratorGeneratorTag

converter: Objeto de tipo Converter con el que realizar las distintas operaciones que sean necesarias con cada valor.
count: Número máximo de elementos que queremos generar.
separator (requerido): Separador utilizado para transformar la cadena en los distintos valores del iterador.
val (requerido): La cadena de la que se generarán.
var: Nombre con el que se almacenará el nuevo iterador.

Accion.java

view plaincopy to clipboardprint?
1.import com.opensymphony.xwork2.ActionSupport;
2.import org.apache.struts2.util.IteratorGenerator.Converter;
3.
4.@SuppressWarnings(«serial»)
5.public class Accion extends ActionSupport {
6.    private String lenguajes;
7.    private Converter aMayusculas;
8.
9.    public Converter getAMayusculas() {
10.        return aMayusculas;
11.    }
12.
13.    public String getLenguajes() {
14.        return lenguajes;
15.    }
16.
17.    public String execute() {
18.        aMayusculas = new Converter() {
19.            public Object convert(String cadena) throws Exception {
20.                return cadena.toUpperCase();
21.            }
22.        };
23.
24.        lenguajes = «Python,Java,Ruby,C#,C++,Lisp»;
25.        return SUCCESS;
26.    }
27.}
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;
}
}resultado.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.
6.<s:generator separator=»,» val=»lenguajes» converter=»aMayusculas»
7.    var=»listaLenguajes» />
8.
9.<ul>
10.    <s:iterator value=»listaLenguajes»>
11.        <li><s:property /></li>
12.    </s:iterator>
13.</ul>
14.</body>
15.</html>
<%@ taglib uri=»/struts-tags» prefix=»s»%>

<html>
<body>

<s:generator separator=»,» val=»lenguajes» converter=»aMayusculas»
var=»listaLenguajes» />

<ul>
<s:iterator value=»listaLenguajes»>
<li><s:property /></li>
</s:iterator>
</ul>
</body>
</html>sort
Ordena una lista
org.apache.struts2.views.jsp.iterator.SortIteratorTag

comparator (requerido): Objeto Comparator a utilizar para comparar los valores de la lista.
source: Lista a ordenar.
var: Nombre con el que almacenar la nueva lista. Se almacenará como atributo de page context.

Accion.java

view plaincopy to clipboardprint?
1.import com.opensymphony.xwork2.ActionSupport;
2.import java.util.ArrayList;
3.import java.util.Comparator;
4.import java.util.List;
5.
6.@SuppressWarnings(«serial»)
7.public class Accion extends ActionSupport {
8.    private List<String> lenguajes;
9.    private Comparator<String> compararString;
10.
11.    public List<String> getLenguajes() {
12.        return lenguajes;
13.    }
14.
15.    public Comparator<String> getCompararString() {
16.        return compararString;
17.    }
18.
19.    public String execute() {
20.        compararString = new Comparator<String>() {
21.            public int compare(String valor1, String valor2) {
22.                return valor1.compareTo(valor2);
23.            }
24.        };
25.
26.        lenguajes = new ArrayList<String>();
27.        lenguajes.add(«Python»);
28.        lenguajes.add(«Java»);
29.        lenguajes.add(«Ruby»);
30.        lenguajes.add(«C#»);
31.        lenguajes.add(«C++»);
32.        lenguajes.add(«Lisp»);
33.
34.        return SUCCESS;
35.    }
36.}
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<String> lenguajes;
private Comparator<String> compararString;

public List<String> getLenguajes() {
return lenguajes;
}

public Comparator<String> getCompararString() {
return compararString;
}

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

lenguajes = new ArrayList<String>();
lenguajes.add(«Python»);
lenguajes.add(«Java»);
lenguajes.add(«Ruby»);
lenguajes.add(«C#»);
lenguajes.add(«C++»);
lenguajes.add(«Lisp»);

return SUCCESS;
}
}resultado.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.
6.<s:sort comparator=»compararString» source=»lenguajes»
7.    var=»lenguajesOrd» />
8.
9.<ul>
10.    <s:iterator value=»#attr.lenguajesOrd»>
11.        <li><s:property /></li>
12.    </s:iterator>
13.</ul>
14.</body>
15.</html>
<%@ taglib uri=»/struts-tags» prefix=»s»%>

<html>
<body>

<s:sort comparator=»compararString» source=»lenguajes»
var=»lenguajesOrd» />

<ul>
<s:iterator value=»#attr.lenguajesOrd»>
<li><s:property /></li>
</s:iterator>
</ul>
</body>
</html>subset
Obtiene un subconjunto de un iterador.
org.apache.struts2.views.jsp.iterator.SubsetIteratorTag

count: Número máximo de elementos que queremos obtener.
decider: Objeto Decider que determinará si el elemento debe incluirse en el nuevo iterador.
source: Iterador inicial.
var: Nombre con el que se almacenará el nuevo iterador en page context.

Accion.java

view plaincopy to clipboardprint?
1.import com.opensymphony.xwork2.ActionSupport;
2.import java.util.ArrayList;
3.import java.util.List;
4.
5.import org.apache.struts2.util.SubsetIteratorFilter.Decider;
6.
7.@SuppressWarnings(«serial»)
8.public class Accion extends ActionSupport {
9.    private List<String> lenguajes;
10.    private Decider decisor;
11.
12.    public List<String> getLenguajes() {
13.        return lenguajes;
14.    }
15.
16.    public Decider getDecisor() {
17.        return decisor;
18.    }
19.
20.    public String execute() {
21.        decisor = new Decider() {
22.            public boolean decide(Object elemento) throws Exception {
23.                String cadena = ((String) elemento);
24.                return cadena.startsWith(«C»);
25.            }
26.        };
27.
28.        lenguajes = new ArrayList<String>();
29.        lenguajes.add(«Python»);
30.        lenguajes.add(«Java»);
31.        lenguajes.add(«Ruby»);
32.        lenguajes.add(«C#»);
33.        lenguajes.add(«C++»);
34.        lenguajes.add(«Lisp»);
35.
36.        return SUCCESS;
37.    }
38.}
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<String> lenguajes;
private Decider decisor;

public List<String> 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<String>();
lenguajes.add(«Python»);
lenguajes.add(«Java»);
lenguajes.add(«Ruby»);
lenguajes.add(«C#»);
lenguajes.add(«C++»);
lenguajes.add(«Lisp»);

return SUCCESS;
}
}resultado.jsp

view plaincopy to clipboardprint?
1.<%@ taglib uri=»/struts-tags» prefix=»s»%>
2.
3.<html>
4.<body>
5.
6.<s:subset decider=»decisor» source=»lenguajes» var=»lenguajesSub» />
7.
8.<ul>
9.    <s:iterator value=»#attr.lenguajesSub»>
10.        <li><s:property /></li>
11.    </s:iterator>
12.</ul>
13.</body>
14.</html>

 

fin.

cualquier informacion .

edwin.dunkelvolk@hotmail.com.ar

 

 

 

 

Deja un comentario