Mostrando entradas con la etiqueta java. Mostrar todas las entradas
Mostrando entradas con la etiqueta java. Mostrar todas las entradas

14/01/2012
Se añade a la interfaz JDirMonitor métodos que permiten consultar y obtener, a través del path absoluto, archivos que se encuentren dentro del directorio que se está analizando.
26/05/2012

Se añade en clase "cl.getsoftware.jdirmonitor.task.RecursiveTaskMonitor" capacidad de informar estado tanto de los archivos como de los directorios.

-----------------------------------------------------------------------------------------------------------------------


Hace unos días atrás se presentó un problema en un sistema y parte de la solución que se propuso involucraba leer información escrita en tiempo real desde múltiples archivos de bytes con objetos serializados, procesarlos y delegarlos a un sistema anexo, todo esto en Java.
Lo primero que se me ocurrió fue 'googlear' para encontrar una API que hiciera el trabajo de monitorear cambios en los archivos de un directorio y por alguna oscura razón no encontré nada...

Una vez solucionado el asunto me interesó la idea de crear una API lo suficientemente genérica, configurable y fácil de usar que solucionase dicho 'problema'.Y así nació JDirMonitor!

Entonces JDirMonitor es una API, bajo licencia LGPL que permite monitoriar y 'escuchar' los cambios que presentan todos los archivos que estén dentro de un directorio definido, avisando en su defecto cuáles han sido creados, modificados y eliminados.

Además de esto JDirMonitor posee las siguientes características:
-Definición de múltiples listeners para capturar eventos que suceden sobre los archivos.
-Definición de Filtros a aplicar sobre los archivos para, por ejemplo, discriminar cuáles deben procesarse.
-Definición de Comparators de objetos File para, por ejemplo, definir el orden en el que se deben procesar los distintos archivos.

JDirMonitor ofrece 2 tipos de monitoreos:
1) NormalTaskMonitor: analiza solamente los archivos que se encuentran en el primer nivel del directorio especificado.
2) RecursiveTaskMonitor: analiza todos los archivos que se encuentren dentro del directorio a analizar, es recursivo IN ORDEN, ya que accede a los archivos de todos los subdirectorios (en cualquier nivel de profundidad).

El siguiente código de ejemplo permite monitorear un directorio X con NormalTaskMonitor, un listener y un filtro de archivo:

import java.io.File;
import java.util.concurrent.TimeUnit;

import cl.getsoftware.jdirmonitor.DirectoryMonitor;
import cl.getsoftware.jdirmonitor.MonitorBuilder;
import cl.getsoftware.jdirmonitor.exception.DirectoryMonitorException;
import cl.getsoftware.jdirmonitor.filter.RegexNameFileFilter;
import cl.getsoftware.jdirmonitor.listener.FileListener;
import cl.getsoftware.jdirmonitor.task.NormalTaskMonitor;


public class Test {
    
    public static void main(String[] args) throws DirectoryMonitorException {
        String pathDirectory = "ruta/del/directorio/a/monitorear";
        long timeTaskExecute = 2;
        
        //Clase que permite añadir filtros a archivos y directorios
        //mediante expresiones regulares
        RegexNameFileFilter regexName = 
            new RegexNameFileFilter();
        regexName.addFileNameRegex("[a-zA-Z].*?\\.txt$");
        
        MonitorBuilder builder = new MonitorBuilder(pathDirectory,
             timeTaskExecute, new NormalTaskMonitor(),
             TimeUnit.SECONDS);
        builder.addListener(fileListener);
        builder.setFileFilter( regexName );
        DirectoryMonitor monitor = builder.build();
        monitor.start();
        
        //se deja el hilo main vivo en un ciclo infinito
        //para ver lo que imprimen los listeners en consola
        while( true ){
            try {
                Thread.sleep(10000);
            }
            catch (InterruptedException e) {}
        }
    }
    
    
    public static FileListener fileListener = new FileListener() {
        @Override
        public void fileDeleted(File file) {
            System.out.println("Archivo " + file.getAbsolutePath() + " ha sido BORRADO");
        }
        
        @Override
        public void fileCreated(File file) {
            System.out.println("Archivo " + file.getAbsolutePath() + " ha sido CREADO");
        }
        
        @Override
        public void fileChanged(File file) {
            System.out.println("Archivo " + file.getAbsolutePath() + " ha sido MODIFICADO");
        }
    };
}
Así de simple, en 4 líneas tenemos corriendo un DirectoryMonitor que revisará el directorio periódicamente cada N segundos, nos informará a través del listener los cambios que ocurren en los archivos y con la clase cl.getsoftware.jdirmonitor.filter.RegexNameFileFilter se logra filtrar solo los archivos que posean un nombre que cumpla con la expresión regular definida.

Otra ventaja es que la API te permite codificar tus propias clases de monitoreo, las cuales deben heredar de la clase cl.getsoftware.jdirmonitor.AbstractTaskMonitor.

Por ejemplo, este es el código fuente de la clase cl.getsoftware.jdirmonitor.task.NormalTaskMonitor:

/*
 * JDirMonitor a listener of files
 * Copyright (C) 2010  GetSoftware Group
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 * 
 * This library was written by Eugenio Contreras for GetSoftware Group
 * Contact email: contacto@getsoftare.cl
 */

package cl.getsoftware.jdirmonitor.task;

import java.io.File;

import cl.getsoftware.jdirmonitor.AbstractTaskMonitor;

/**
 * <p>Tarea de monitoreo de directorio que analiza solamente los archivos que se 
 * encuentran en el primer nivel del directorio especificado.</p>
 * 
 * @author egacl
 *
 */
public class NormalTaskMonitor extends AbstractTaskMonitor {
    
    /** (non-Javadoc)
     * @see cl.getsoftware.jdirmonitor.AbstractTaskMonitor#monitorRutine(java.io.File)
     */
    @Override
    public void monitorRutine(File directory) {
        this.normalRutine( this.getFilesOfDirectory(directory) );
    }
    
    public void normalRutine( File []files ){
        for( File file : files ){
            if( file.exists() ){
                if( file.isFile() ){
                    this.fileMonitor( file );
                }
            }
        }
    }
    
}
El método monitorRutine se ejecuta cada vez que el DirectoryMonitor inicia la rutina de monitoreo y le envía como parámetro el objeto java.io.File del directorio a analizar. Por lo tanto allí puedes escribir la manera en que deseas realizar el monitoreo.

Puedes descargar el archivo JDirMonitor.rar (proyecto Eclipse con javadoc incluida).
Api JAR JDirMonitor.jar

EJEMPLO DE COMO UTILIZAR LA API AQUI
 

ver post completo...


Hace unos años atrás, mientras estaba estudiando, el cuarto semestre de Ingeniería... creo, me dieron una tarea que consistía en hacer un Planarity.
El resultado fue el juego JPlanarity (la J es porque está desarrollado en lenguaje Java).

Posee un buen renderizado, selección múltiple (en beta) y permite guardar partidas, ya que no es muy entretenido avanzar a altos niveles y luego empezar todo de nuevo. A todo esto ... yo llegué al nivel 15, un profesor al 18
con la esperanza de que fallara pero no fue así xD jejeje.

Puedes descargar el juego presionando AQUI.




El juego consiste en desenredar la red formada por las distintas aristas y vértices, como se puede ver en la imagen.




Cualquier sugerencia, bugs o nueva idea se acepta y comentala aquí.

Saludos.-

ver post completo...

Hola a todos, a muchos desarrolladores se nos hace indispensable poder implementar un módulo de envío de mail en los sistemas que desarrollamos. Dependiendo del lenguaje está la complejidad o simplicidad de la codificación de éste y como muchos sabemos, Java no siempre es un precursor de lo simple.

Es por esto que quiero publicar y facilitarles a todos una clase Mail.java que permite realizar envío de correos a través de Google Apps y mediante un servidor de correos común y corriente.

El código funciona implementando la API de SUN JavaMail (así que descarguen el JAR con la API sino nunca podrán enviar correos) y proporciona 2 métodos. Uno llamado 'enviaGoogleApp' que permite enviar el correo a través de una cuenta de Google Apps y otro llamado 'envia' que envía correos a través de un servidor de correo definido.

El código de ambos métodos es idéntico, sólo cambia la forma de autenticarse en el servidor.

Los métodos de la clase Mail sólo requieren los siguientes datos:
1) Emisor del mensaje.
2) Asunto del correo.
3) Receptor(es) del correo.
4) mensaje del correo (en formato HTML o ASCII)
5) Archivos adjuntos.

Con una leve modificación y añadiendo 2 parámetros más se pueden añadir:
1) Receptores a quienes se copia el correo.
2) Receptores a quienes se les envía copia oculta.

El código es el siguiente:


package util.mail;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class Mail {
 
 private class SMTPAuthenticator extends Authenticator {
  private String dEmail;
  private String dPassword;
  
  public SMTPAuthenticator(String email, String password){
   dEmail = email;
   dPassword = password;
  }
  
  public PasswordAuthentication getPasswordAuthentication(){
   return new PasswordAuthentication(dEmail, dPassword);
  }
 }
 
 /**
  * Funci&oacute;n que permite enviar un correo electr&oacute;nico con archivos adjunto.
  * &lt;br&gt;El contenido del correo puede estar en formato HTML.
  * @param emisor Correo de qui&eacute;n emite el correo
  * @param asunto Asunto del e-mail
  * @param receptores Correos de los receptores del e-mail
  * @param mensaje Mensaje del e-mail
  * @param adjuntos Ruta de archivos adjuntos en el e-mail
  * @return TRUE si el mail fue enviado con &eacute;xito, FALSE en caso contrario
  */
 public boolean enviaGoogleApp(String emisor, String asunto, List&lt;String&gt; receptores, String mensaje, List&lt;String&gt; adjuntos){
  boolean envioExitoso = true;
  String emailGetCursos = "cuenta.googleapps@algo.cl";
  String password = "password.de.cuenta.googleapps";
  Properties props = new Properties();
  props.put("mail.smtp.user", emisor);
  props.put("mail.smtp.host", "smtp.gmail.com");
  props.put("mail.smtp.port", "465");
  props.put("mail.smtp.starttls.enable", "true");
  props.put("mail.smtp.auth", "true");
  props.put("mail.smtp.socketFactory.port", "465");
  props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
  props.put("mail.smtp.socketFactory.fallback", "false");
  
  try{
   
   Authenticator auth = new SMTPAuthenticator(emailGetCursos, password);
   Session session = Session.getInstance(props, auth);

   MimeMessage message = new MimeMessage(session);
   InternetAddress[] dest = new InternetAddress[receptores.size()];
   for (int i=0;i&lt;dest.length;i++){
    dest[i] = new InternetAddress( receptores.get(i) );
   }
   
   //Se define qui&eacute;n es el emisor del e-mail
      message.setFrom(new InternetAddress(emisor));
      InternetAddress[] replyTo = new InternetAddress[1];
      replyTo[0] = new InternetAddress( emisor );
      message.setReplyTo( replyTo );
   //Se definen el o los destinatarios
   message.addRecipients(Message.RecipientType.TO, dest);
   //message.addRecipients(Message.RecipientType.CC, dest);
   //message.addRecipients(Message.RecipientType.BCC, dest);

      
   //Se defina el asunto del e-mail
      message.setSubject(asunto);
 
      //Se seteo el mensaje del e-mail
      MimeBodyPart messageBodyPart = new MimeBodyPart();
      messageBodyPart.setContent(message,"text/html");
            
      Multipart multipart = new MimeMultipart();
      multipart.addBodyPart(messageBodyPart);
            
      //Se adjuntan los archivos al correo
      if( adjuntos!=null && adjuntos.size()>0 ){
         for( String rutaAdjunto : adjuntos ){
             messageBodyPart = new MimeBodyPart();
             File f = new File(rutaAdjunto);
             if( f.exists() ){
                DataSource source = new FileDataSource( rutaAdjunto );
                messageBodyPart.setDataHandler( new DataHandler(source) );
                messageBodyPart.setFileName( f.getName() );
                multipart.addBodyPart(messageBodyPart);
             }
         }
      }
      
      //Se junta el mensaje y los archivos adjuntos
      message.setContent(multipart);
      
      //Se env&iacute;a el e-mail
      Transport.send( message );
  }
  catch (Exception e) {
   envioExitoso = false;
  }
  finally{
   //Se eliminan del servidor los archivos adjuntos
   if( adjuntos!=null && adjuntos.size()&gt;0 ){
    for( String rutaAdjunto : adjuntos ){
     try{
      File arch = new File(rutaAdjunto);
         arch.delete();
     }
     catch (Exception e) {}
    }
   }
  }
  return envioExitoso;
 }
 
 /**
  * Funci&oacute;n que permite enviar un correo electr&oacute;nico con archivos adjunto.
  * &lt;br&gt;El contenido del correo puede estar en formato HTML.
  * @param emisor Correo de qui&eacute;n emite el correo
  * @param asunto Asunto del e-mail
  * @param receptores Correos de los receptores del e-mail
  * @param mensaje Mensaje del e-mail
  * @param adjuntos Ruta de archivos adjuntos en el e-mail
  * @return TRUE si el mail fue enviado con &eacute;xito, FALSE en caso contrario
  */
 public boolean envia(String emisor, String asunto, List&lt;String&gt; receptores, String mensaje, List&lt;String&gt; adjuntos){
  boolean envioExitoso = true;
  try{
      Properties props = System.getProperties();
 
      //Se define el servidor de correos
      props.put("mail.smtp.host", "ip.servidor.de.correos");
   props.put("mail.smtp.port", "puerto.servidor.de.correo (por defecto 25)");
 
      //Se obtiene sesi&oacute;n desde el servidor de correos
      Session session = Session.getInstance(props, null);
   session.setDebug(true);
   
      MimeMessage message = new MimeMessage(session);
   InternetAddress[] dest = new InternetAddress[receptores.size()];
   for (int i=0;i&lt;dest.length;i++){
    dest[i] = new InternetAddress( receptores.get(i) );
   }
   
   //Se define qui&eacute;n es el emisor del e-mail
      message.setFrom(new InternetAddress(emisor));
      InternetAddress[] replyTo = new InternetAddress[1];
      replyTo[0] = new InternetAddress( emisor );
      message.setReplyTo( replyTo );
   //Se definen el o los destinatarios
   message.addRecipients(Message.RecipientType.TO, dest);
   //message.addRecipients(Message.RecipientType.CC, dest);
   //message.addRecipients(Message.RecipientType.BCC, dest);
      
   //Se defina el asunto del e-mail
      message.setSubject(asunto);
 
      //Se seteo el mensaje del e-mail
      MimeBodyPart messageBodyPart = new MimeBodyPart();
      messageBodyPart.setContent(message,"text/html");
            
      Multipart multipart = new MimeMultipart();
      multipart.addBodyPart(messageBodyPart);
            
      //Se adjuntan los archivos al correo
      if( adjuntos!=null && adjuntos.size()>0 ){
         for( String rutaAdjunto : adjuntos ){
             messageBodyPart = new MimeBodyPart();
             File f = new File(rutaAdjunto);
             if( f.exists() ){
                DataSource source = new FileDataSource( rutaAdjunto );
                messageBodyPart.setDataHandler( new DataHandler(source) );
                messageBodyPart.setFileName( f.getName() );
                multipart.addBodyPart(messageBodyPart);
             }
         }
      }
      
      //Se junta el mensaje y los archivos adjuntos
      message.setContent(multipart);
      
      //Se env&iacute;a el e-mail
      Transport.send( message );
  }
  catch (Exception e) {
   envioExitoso = false;
  }
  finally{
   //Se eliminan del servidor los archivos adjuntos
   if( adjuntos!=null && adjuntos.size()&gt;0 ){
    for( String rutaAdjunto : adjuntos ){
     try{
      File arch = new File(rutaAdjunto);
         arch.delete();
     }
     catch (Exception e) {}
    }
   }
  }
  return envioExitoso;
 }
 
 public static void main(String[] args) {
  List&lt;String&gt; receptores = new ArrayList&lt;String&gt;();
  receptores.add("mail.de.alguien@gmail.com");
  String emisor = "test@test.cl";
  String asunto = "Correo de prueba";
  String mensaje = "Este es un correo de &lt;font color='red'&gt;&lt;b&gt;PRUEBA&lt;/b&gt;&lt;/font&gt;";
  List&lt;String&gt; archivos = new ArrayList&lt;String&gt;();
  Mail m = new Mail();
  //m.envia(emisor, asunto, receptor, mensaje, null);
  m.enviaGoogleApp( emisor, asunto, receptores, mensaje, archivos);
 }
 
}

ver post completo...

Java varargs y bucles for-each


Desde Java 5 se incorporaron los conceptos de varargs (argumentos variables) y bucles for-each.





El primero nos permite pasar un número variable de argumentos a un método de manera transparente. El segundo nos facilita sobre manera la manera en que se realizan los bucles for.

Ambas funcionalidades nos entregan el mismo dinamismo proporcionado por otros lenguajes como Python o PHP.

Veamos un ejemplo que mezcle éstas funcionalidades
-La mayoría de los programadores Java escribiría código como éste:


public class VarargsForEach{
public static void main(String[] args){
for( int i=0 ; i<args.lengt ; i++){
String argumento = args[i];
System.out.println( argumento );
}
}
}


-Ahora utilizando varargs y bucles for-each, nuestro código quedaría de la siguiente manera:

public class VarargsForEach{
public static void main(String... args){
foreach( String argumento : args ){
System.out.println( argumento );
}

imprimir("Hola", " como", " estas ", "...", 1,2,3, " chao");
}

public static void imprimir( Object... parametros ){
foreach( Object parametro : parametros ){
System.out.println( parametro );
}
}
}


Los varargs nos proporcionan mayor abstracción y flexibilidad en los métodos. Por otro lado los bucles for-each nos entregan simplicidad y elegancia en el código.



ver post completo...




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


ver post completo...

J2EE: Strus2 + log4j + AJAX (II)




En el post anterior se mostró los distintos frameworks utilizados para desarrollar un proyecto Web Java, el cual puede ser descargado desde el Grupo de Google (archivo: MVCStruts2.rar).





A continuación explicaré la arquitectura del proyecto y cual es la función de cada un de los componentes de éste.
En esta imagen podemos ver el diseño arquitectónico del sistema.

Esta imagen muestra cómo es la división arquitectónica de la aplicación, muestra claramente cómo se aplica el patrón MVC. Además da a conocer el flujo y la forma en que se comunican los distintos componentes que participan en el sistema.

A continuación se definirán los distintos tipos de clases que constituyen el sistema:

HTML y JSP: Básicamente son las páginas Web que muestran gráficamente el sistema al usuario. Los usuarios al ejecutar funciones sobre las páginas Web (capa vista) generan eventos, los cuales son capturados por el Controlador.

Controlador: Es el intermediario entre la capa Vista y la capa Modelo, obtiene los eventos realizados por el usuario en la capa Vista y ejecuta la acción (ActionClases) correspondiente en el Modelo, la cual responderá a la solicitud realizada por el cliente. El controlador está constituido por los archivos de configuración XML (struts.xml) que son interpretados por el framwork Struts2.

InterceptorClases: Son clases que heredan de la interfaz Interceptor que proporciona el framework Struts2. Su función es interceptar las invocaciones que realiza la capa vista sobre el controlador para invocar a las ActionClases (y viceversa), durante ésta interrupción éstas clases pueden realizar validaciones (ejemplo: validar sesión de usuario), etc. y si ésta es correcta el flujo o acción se realiza normalmente.

ActionClases: Heredan de la clase ActionSupport proporcionada por el framework Struts2. Su función (en éste proyecto) es validar la integridad de los datos recibidos e invocar a los diversos Servicios los cuáles le proveerán de la información necesaria para retornar la respuesta requerida por la capa Vista.

Servicios: Son clases de negocio, las cuáles pueden obtener datos a través de la invocación a diversas ClasesDAO, procesarlos y devolver la información solicitada por la capa Web.

ClasesDAO: Estas clases acceden "directamente" a diversos orígenes de datos (Bases de datos, archivos de texto).

ClasesTO: Estas clases proporcionan objetos de transferencia, los cuales "viajaran" a través de la aplicación. Por ejemplo: una clase DAO consultará un origen de datos, y retornará un lista de objetos TO.

ClasesUtil: Son clases utilitarias que proporcionarán funciones que podrán ser utilizadas por todos los componentes del sistema.


ver post completo...



Hola a todos,

Hace unos días me interesé en aprender cómo utilizar Struts2, la nueva versión del
framework de desarrollo web de Java Apache Struts. Me impresionó lo distinta que es ésta con respecto a su predecesor, investigando descubrí que para desarrollarla no se basaron
en Struts 1.x, sino que en otro framework llamado WebWork.




El framework Struts 2 está basado en el patrón MVC. Struts2 puede ser descargado desde éste link AQUÍ.

Por otro lado tenemos log4j, también desarrollado por la fundación Apache. Este framework permite definir la salida de los mensajes de la aplicación en tiempo de ejecución (muy util e implementado en varios lenguajes y organizaciones). Este puede ser descargado desde éste link AQUí .

Por último el proyecto utiliza AJAX, para "facilitar" su implementación y abstraerse del manejo de estado de las llamadas AJAX y de la compatibilidad con Navegadores, es que se utilizó el framework PrototypeJs.

Soy precursor de que se debe aprender haciendo.
Es por eso que he subido al Grupo de Google (archivo: MVCStruts2.rar) un proyecto Web Java hecho sobre el IDE Eclipse con un ejemplo práctico utilizando todas las herramientas nombradas anteriormente. De ésta forma todos podrán tener una base de conocimiento para comenzar cualquier proyecto.

Este proyecto Web corre sobre Tomcat 6.x y como dice el título del post, utiliza log4j, ajax (framework prototypejs) y Struts2.

Cualquier duda o consulta pueden darla a conocer acá mismo, en todo caso más adelante publicaré más información y detalles sobre cómo funcionan las tecnologías mencionadas.

Ah! acá les dejo fotos de cómo se ven las páginas del proyecto.










Para ambientar el proyecto procura tener instalada la máquina virtual de java (JDK), Eclipse IDE y Tomcat 6.x.

Cuando corras el proyecto en tu equipo recuerda editar las variables de entorno que
se definen dentro del archivo web.xml.

El usuario de prueba de la aplicación es: user = egacl; pass = sorete.
Esta información la puedes editar (o agregar más usuarios)
en el archivo usuarios.txt, el cual encontrarás dentro del proyecto.

En ESTE LINK encontrarás el proyecto [nombre archivo = MVCStruts2.rar].

Cualquier duda o consulta la puedes postear aquí.


ver post completo...

top