J2EE: Struts2 + log4j + AJAX (III)




Hola a todos,

Como les contaba en los Post anteriores (post 1, post 2), la nueva versión de Struts (Struts2) es muy diferente a su predecesor.

[si es primera vez que ves este post te recomiendo visitar los post anteriores]





Es por esto que voy a explicar en más detalles cómo funciona y configura este framework.
Para ésto me basaré en el proyecto Struts2 publicado en el Grupo de Google (archivo: MVCStruts2.rar).

Lo primero que se debe hacer es editar el descriptor de despliegue (archivo web.xml) para añadir el filtro que permite que Struts2 pueda ejecutarse en nuestro proyecto.
Nuestro web.xml debiese quedar así:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

<display-name>MVCStruts2</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>


<filter>  
<filter-name>struts</filter-name>  
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  
</filter>  

<filter-mapping>  
<filter-name>struts</filter-name>  
<url-pattern>/*</url-pattern> 
</filter-mapping>

</web-app>


De esta manera el servidor web (Tomcat en éste caso) sabrá que cualquier petición realizada debe pasar por el filtro FilterDispatcher, el cual es el Controlador de nuesta aplicación Web.

Struts2 nos permite crear un archivo xml de configuración, en el cual podemos especificar qué debe hacer nuestro Controlador según la petición recibida por parte del cliente. Este archivo se llama struts.xml y debe crearse en package por defecto del proyecto Web Resources:src.
El archivo del proyecto podemos escribirlo de la siguiente manera:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">    

<struts>
<include file="login-config.xml" />
</struts>


Como se puede apreciar prácticamente no hay nada de contenido en archivo, esto es porque se está utilizando un tag xml llamado include, el cual permite importar el contenido de otros archivos de configuración xml struts2. De esta forma evitamos que a medida que nuestra aplicación crezca, lo haga al mismo ritmo nuestro archivo struts.xml. Ahora veamos el contenido del archivo login-config.xml (el cual contiene las acciones de login de nuestra aplicación).
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">    

<struts>
<package name="accesopackage" extends="struts-default">
<action name="login" method="validarUsuario" class="cl.struts2.login.action.LoginAction">  
<result name="success">/WEB-INF/home/home.jsp</result>
<result name="error">/WEB-INF/index.jsp</result>
</action>

<action name="logout" method="cerrarSessionUsuario" class="cl.struts2.login.action.LoginAction">
<result name="success">/WEB-INF/index.jsp</result>
</action>
</package>
</struts>


Este archivo lo único que nos dice es que se ejecute la clase 'cl.struts2.login.action.LoginAction' y el método 'validarUsuario()' cuando llegue la acción 'login', y la misma clase pero el método 'cerrarSessionUsuario()' cuando llegue la acción 'logout'.
En la acción 'login', si la ejecución del método es correcta se retornará la acción SUCCES, la cual nos llevará a la página '/WEB-INF/home/home.jsp', en caso contrario o ante un ERROR nos llevará a la página de inicio '/WEB-INF/index.jsp'.

Ahora podemos crear nuestra página index.jsp la cual hará de login de usuario y llamará a la acción 'login'.
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Ingresar al sistema</title>
<link rel="stylesheet" href="estilos/estilos.css" type="text/css" />
<script type="text/javascript" language="javascript">
function validar(){
var user = document.form.username.value;
var pass = document.form.password.value;
if( user!=null && pass!=null ){
document.form.submit();
}
else{
alert("Ingrese usuario y contraseña");
}
}
</script>

</head>
<body>
<form method="post" name="form" action="login">
<table class="tabla">
<tr>
<td align="center" colspan="2" class="franja-titulo">
Ingresar al Sistema
</td>
</tr>
<tr>
<td class="texto">
Usuario: 
</td>
<td>
<input type="text" name="username" id="username" class="campo-texto">
</td>
</tr>
<tr>
<td class="texto">
Contraseña: 
</td>
<td>
<input type="password" name="password" id="password" class="campo-texto">
</td>
</tr>
<tr>
<td align="center" colspan="2" class="texto-tabla">
<%
if( request.getAttribute("error")!=null ){
%>
Error al validar los datos
<%
}
%>
</td>
</tr>
<tr>
<td align="center" colspan="2">
<input type="button" value="Aceptar" onclick="validar();">
</td>
</tr>
</table>
</form>
</body>
</html>


Como se puede ver en la imagen, el formulario web de index.jsp redireccionará a la acción 'login'.
Por lo tanto ahora veamos el código de nuestra clase 'cl.struts2.login.action.LoginAction'.
public class LoginAction extends ActionSupport implements ServletRequestAware,ServletResponseAware{

private static final long serialVersionUID = 1L;

private Logger logger = Logger.getLogger( LoginAction.class );

private HttpServletRequest request;
private HttpServletResponse response;


public String validarUsuario(){
if( SessionUtil.existeSession(request, SessionUtil.SESSION_USUARIO) ){
logger.debug("[validarUsuario] usuario ya validado");
return SUCCESS;
}

String username = request.getParameter("username");
String password = request.getParameter("password");

logger.debug("[validarUsuario] se reciben parametros: {usuario = " +username+ ", password = " + password +"}");

Usuario usuario = null;

if( username!=null && password!=null ){
logger.debug("[validarUsuario] se valida usuario");
Usuario usu = new Usuario();
usu.setUsername( username );
usu.setPassword( password );

ServicioUsuarios servicio = new ServicioUsuarios();
usuario = servicio.obtenerUsuario(usu);
}

if( usuario!=null ){
logger.debug("[validarUsuario] validacion correcta");
SessionUtil.crearSession(request, SessionUtil.SESSION_USUARIO, usuario, 15);
return SUCCESS;
}

SessionUtil.cerrarSession(request);
request.setAttribute("error","1");
logger.debug("[validarUsuario] error al validar usuario");
return ERROR;
}



public String cerrarSessionUsuario(){
logger.debug("[cerrarSessionUsuario] Cerrar session de usuario");
SessionUtil.cerrarSession(request);
return SUCCESS;
}


public HttpServletRequest getServletRequest() {
return this.request;
}

public HttpServletResponse getServletResponse() {
return this.response;
}

public void setServletResponse(HttpServletResponse response) {
this.response = response;
}


public void setServletRequest(HttpServletRequest request) {
this.request = request;
}

}


En el código se puede ver la clase LoginAction y su método validarUsuario(), el cual se ejecutará con la acción 'login'. No voy a explicar en detalle el contenido de este método (ya que con el material publicado anteriormente no debiese haber problemas para entender ésto ;)), pero se entiende que de alguna manera valida el usuario y password del usuario. Si la validación es correcta retornará la acción SUCCES, en caso contrario ERROR (si tienes dudas con ésto vuelve a ver la foto del archivo login-config.xml).

Más adelante se detallará cómo funcionan los interceptores y cómo se ejecutan las llamadas AJAX.

Atento a sus dudas o consultas.
Saludos.-


1 comentarios:

ETSON dijo...

Interesante.....no tenía idea de todas las nuevas funcionalidades de struts2....excelente aporte

Publicar un comentario en la entrada

top