Tip Struts 2 #15: Checkboxes

15/06/2014
struts2 tip

La librería de etiquetas JSP de Struts 2 permite integrar los elementos de un formulario con los Action y automatizar la obtención y envío de los valores adecuados con la ayuda de interceptores activas por defecto. En este tip se va a mostrar el uso básico la etiqueta checkbox para trabajar con este tipo de input.

Nota:el atributo label sólo se aplica si estamos de un formulario con una plantilla (atributo «theme») que lo soporte.

En el caso de un checkbox simple lo tenemos fácil ya que basta con definir el nombre de su label y un atributo boolean del action (getter) que recogerá ese valor.

<s:checkbox name="checkboxSimple" label="%{getText('checkboxSimple')}"/>
private boolean checkboxSimple;	

public boolean isCheckboxSimple() 
{
	return checkboxSimple;
}

public void setCheckboxSimple(boolean checkboxSimple) 
{
	this.checkboxSimple = checkboxSimple;
}

Para un checkbox múltiple se utiliza la etiqueta checkboxlist. Los posibles valores del checkbox se obtendrán a partir de una colección (o array) de objetos (por defecto se tomará el toString de los elementos de la colección) y que además se utilizarán como label; la situación más sencilla es utilizar un array o lista de String.

Los valores seleccionados se recogen en el Action en un String separados por una coma y un espacio. Así pues, tendremos los posibles valores en una Collection y los recogemos en otro atributo pero además para que se muestren los valores seleccionados indicaremos a la etiqueta con value un atributo (String[]) con los mismos.

<s:checkboxlist label="%{getText('checkboxList')}" list="countries" name="countriesCheckbox" value="countriesSelected"/>
private String[] countries = { getText("Spain"), getText("Mexico"), getText("Germany") };

	private String countriesCheckbox;

	private String[] countriesSelected;

	public String[] getCountries()
	{
		return countries;
	}

	public String getCountriesCheckbox()
	{
		return countriesCheckbox;
	}

	public void setCountriesCheckbox(String countriesCheckbox)
	{
		this.countriesCheckbox = countriesCheckbox;
	}

	public String[] getCountriesSelected()
	{
		return countriesSelected;
	}

       public String submit()
	{
		String[] countries = countriesCheckbox.split(", ");
		for (String country : countries)
		{
			LOG.info(country);
		}
		countriesSelected = countries;
		return INPUT;
	}

Si la colección o array esté formado por objetos de los que queramos tomar un atributo como valor y otro como label se utilizarán los atributos listKey y listValue de la etiqueta. Por ejemplo, consideremos la clase Country:

package com.danielme.tips.struts2.tip15.model;

public class Country
{

	private String code;
	
	private String name;
	

	public Country(String code, String name)
	{
		super();
		this.code = code;
		this.name = name;
	}

	public String getCode()
	{
		return code;
	}

	public void setCode(String code)
	{
		this.code = code;
	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}	
	
}
	public List<Country> getCountriesObject()
	{
		List<Country> countriesObject = new LinkedList<Country>();
		countriesObject.add(new Country("ESP", getText("Spain")));
		countriesObject.add(new Country("MEX", getText("Mexico")));
		countriesObject.add(new Country("DE", getText("Germany")));
		return countriesObject;
	}
	

Para utilizar el nombre del país como label y el código como el valor seleccionable en el checkbox y por lo tanto el que recibiremos al hacerse el submit se haría algo así:

			<s:checkboxlist label="%{getText('checkboxList')}" list="countriesObject" name="countriesCheckbox" listValue="name" listKey="code"/>

En este último ejemplo, si definimos el array con los valores seleccionados (atributo value de la etiqueta) este deberá ser del mismo tipo que el objeto utilizado como listKey.

Si se utiliza un Map, de forma automática las claves serán los valores de los checkbox mientras que los label se corresponderán con el toString de los objetos que indexan las claves. En el siguiente ejemplo se muestra un Map directamente definido con OGNL.

<s:checkboxlist label="%{getText('checkboxList')}" list="#{'v1':'label1', 'v2':'label2', 'v3':'label3'}" name="countriesCheckbox"/>			

struts 2 checkbox

El proyecto completo para Maven se encuentra en Github. Para más información sobre cómo utilizar GitHub, consultar este artículo.

<< TIPS STRUTS 2

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.