miércoles, junio 29, 2011

Problemas con JDBCRealm en Tomcat6 sobre Ubuntu

Me ha llevado unos días el poder desplegar correctamente una aplicación que usaba un realm para la validación de usuarios.

Una vez configurado los ficheros oportunos en el proyecto (podéis ver una entrada sobre esto aquí), al desplegar la aplicación e intentar acceder a los recursos protegidos por el realm, el servidor me redirigía contínuamente a la página de error del login definida para la aplicación.

El problema, aunque simple, me costó más de tres días de trabajo. El servidor era una instalación limpia de un Apache+Tomcat6+MySQL en una Ubuntu. Esta versión de Tomcat para Ubuntu (y supongo que para todas las distro Linux), no se instala con el formato tradicional de carpetas, sino que aparece instalada sobre distintos directorios. Tengo la impresión de que está predefinida para el uso de distintas instancias sobre la misma instalación.

El motivo de que no me validara el usuario cuando accedía a recursos protegidos era que Tomcat no era capaz de encontrar el driver de MySQL. En esta instalación de Tomcat no existe una carpeta TOMCAT_HOME/common/lib (y si la creas, no la tiene en cuenta), y hay que colocar estos en la ruta CATALINA_HOME, que está establecida por defecto en /usr/share/tomcat6 (tomcat6 es el nombre de mi instancia). Ahí hay que dejar los drivers.

Si se quiere cambiar el valor de CATALINA_HOME, deberemos editar el fichero /etc/default/tomcat6. Este fichero también contiene otras cosas interesantes, merece la pena echarle un vistazo.

Bueno... espero que ayude.

miércoles, abril 20, 2011

Botones de submit dinámicos con Struts2

En ocasiones he tenido la necesidad de poder tener más de un botón de submit en un mismo formulario, teniendo estos distintas acciones, claro está.
6
Esto se puede resolver estableciendo el atributo "method" del elemento s:submit con el nombre de un determinado método que se ejecutará en la clase action destino. Tal que así:


<form action="unaAccion">
<s:submit method="ver" value="Ver"/>
<s:submit method="cancelar" value="Cancelar"/>
</form>


Y luego, en la clase action, establecer los métodos ver y cancelar así:


public class UnaAccion {
public String ver() {
return Action.SUCCES;
}

public String cancelar() {
return Action.SUCCES;
}
}


Pero hay otras ocasiones en las que tenemos más métodos de los que, razonablemente, pordríamo mapear y, además podemos complicarlo con que cada médoto debería recibir un dato del submit pulsado.

Para eso podemos usar la creación de submit dinámicos, más o menos sería así:


<form action="borrarEntrada.action">
<s:iterate value="entradas">
<s:property value="titulo">
<input type="submit" name="borrar[<s:property value='id'>]" value="borrar"/>
<br/>
</s:iterate>
</form>


Luego, el valor del botón pulsado se pordría recoger en la clase action de la siguiente forma:


public class BorrarEntradaAction {

private final Map borrar = new HashMap ();

public String execute () {
super.execute ();

for (Iterator i = borrar.keySet ().iterator (); i.hasNext ();) {
String id = (String) i.next ();
System.out.println (id);
}
}

public final Map getBorrar () {
return borrar;
}
}


Evidentemente, en el for solamente tendremos un item cuyo valor será el id que hemos asignado en la JSP.

Espero que, por lo menos, os ahorre el tiempo que a mí me ha costado encontrarlo :)