lunes, julio 23, 2007

Struts 2 - ServletRequestAware y SessionAware

Me han pedido un ejemplo del uso de ServletRequestAware, así que aquí va el action correpondiente usando sesiones y el request.
Prometo para una próxima entrega, la manipulación de archivos.
Pueden copiar la clase directamente al proyecto de "Struts 2 - Round 1", no debería ser complicado para nada. Perdón por el código sin tabulaciones, no encuentro la forma de mostrar código en blogger, tal vez alguno me pueda ayudar.


package prueba;

import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.SessionAware;
import business.User;
import com.opensymphony.xwork2.ActionSupport;

public class Login extends ActionSupport implements SessionAware, ServletRequestAware{

private String usuario;
private String password;
private Map sesion;
private HttpServletRequest request;

@Override
public String execute() throws Exception {
User user = new User();
user.setName(usuario);
user.setPassword(password);

//sesion se llena automáticamente
//con el método setSession(Map m)
sesion.put("_USER", user);

//request se llena automáticamente
//con el método setServletRequest(...)
String btn = request.getParameter("btnAceptar");

//Si lo valido correctamente...
if(true){
addActionMessage("Este es un ActionMessage de SUCCESS");
addActionMessage("El botón presionado es: "+btn);
return SUCCESS;
}
return ERROR;
}

public String getUsuario() {
return usuario;
}
public void setUsuario(String usuario) {
this.usuario = usuario;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}

//Agregado al implementar SessionAware
@Override
public void setSession(Map s) {
sesion = s;
}

//Agregado al implementar ServeltRequestAware
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
}

Saludos

La caja negra de Sun MicroSystems

¿Se acerca tu cumpleaños? ¿Tus padres se ganaron la lotería? ¿Eres un magnate poderoso?. Entonces puedes tener la gran e impresionante "Black Box" de Sun. ¿Qué es esto, te preguntas?.
Bueno, para que desperdiciar letras si una foto vale más que mil palabras...



Y aquí tienen un par de links adicionales:
-Poject Black Box
-Galería de fotos
-Más fotos

Saludos

lunes, julio 16, 2007

Struts 2 - Round 2 - Accediendo a la sesión

Seré breve. En el post anterior vimos que los nuevos Action de Struts son clases bastantes simples, lo único que hubo que tener en cuenta es que heredaba funcionalidad de la clase ActionSupport.
También sabemos que aplicando el patrón "dependency injection", Struts 2 automáticamente llenaba todos los atributos de mi clase (siempre y cuando tuvieran el mismo nombre que en el form y su correspondiente método set).
Bien, pero el método execute() no recibe ningún parámetro como lo recibíamos en Struts 1. ¿Cómo accederemos a la sesión, al request, al response, a cookies, a los objetos de mensajes y errores?

La respuesta se encuentra en las interfaces y los interceptors que el framework nos proporciona, por ejemplo:
  • org.apache.struts2.interceptor.ApplicationAware
  • org.apache.struts2.interceptor.CookiesAware
  • org.apache.struts2.interceptor.ParameterAware
  • org.apache.struts2.interceptor.ServletRequestAware
  • org.apache.struts2.interceptor.ServletResponseAware
  • org.apache.struts2.interceptor.SessionAware
  • com.opensymphony.xwork2.ValidationAware
Como ven, todo lo que diga "Aware" hace que nuestro action pueda acceder a una variedad de objetos adicionales con los cuales trabajar. Recuerden que los action deberían ser una capa intermedia entre la capa de negocio y la de presentación y nunca deberíamos utilizarlos como objetos de negocio.

Cada una de estas interfaces nos hará agregar métodos adicionales para recibir de Struts, el objeto deseado (nuevamente por dependency injection). Por supuesto, la mayoría de estos métodos son del tipo set.

Esto es bastante fácil de utilizar, si necesitan código de ejemplo, sólo deben solicitarlo.

Saludos

viernes, julio 13, 2007

Struts 2 - Round 1

Bien, aquí va el primer intento de correr Struts 2. He tratado de empezar a interactuar con un formulario, pasando por alto el Hola Mundo. Para los que quieran más información, les recomiendo el Core Developers Guide y este tutorial.
El objetivo del ejercicio es simplemente hacer el formulario de login de una aplicación. Esto va a requerir copiar librerías, conocer la arquitectura de Struts 2 y escribir 3 JSP, 1 clase y un XML.

1. Arquitectura básica
Este gráfico muestra sólo una parte de la arquitectura de Struts 2 (la que nos sirve para ahora). Si quieren ver algo un poco más detallado, hacer click aquí.

2. Estructura del Proyecto
Vamos a hacer 3 páginas JSP:
  • index.jsp: contendrá simplemente un link y un botón.
  • login.jsp: el formulario de entrada de usuario.
  • principal.jsp: la página de resultado de comprobación.
También vamos a necesitar de una clase:
  • Login.java: esta será nuestra Action. Struts 2 no requiere que herede funcionalidad de ninguna otra clase o implemente alguna interfaz, pero para no darle trabajo al reflection, voy a hacer que herede funcionalidad de ActionSupport.
3. Los paquetes JAR a instalar en el lib del proyecto
  • struts2-core-2.0.8.jar
  • xwork-2.0.3.jar
  • freemaker-2.3.8.jar
  • ognl-2.6.11.jar
  • commons-logging-1.1.jar
4. login.jsp
Voy a utilizar aquí los tags de Struts, para lo cual, necesito la directiva tag:
<%@ taglib prefix="s" uri="/struts-tags" %>
Y entre las etiquetas :
<s:form action="Login">
<s:textfield key="usuario" label="Usuario registrado :">
<s:password key="password" label="Contraseña">
<s:submit/>
</s:form>

La única consideración importante aquí es action="Login". Sucede que para que Struts pueda verificar que se está invocando a un Action, se debería invocar (por GET o POST) a Login.action, sin embargo, y debido a que estamos usando las etiquetas de Struts, esto Login aparecerá de forma correcta cuando sea procesada la JSP. Pero esto no es del todo cierto, ya que si la página JSP no es mostrada al usuario como resultado de la invocación a alguna acción, seguirá saliendo en el HTML resultante un action="Login" y esto resultará en un error 404. ¿Te preguntas por qué? Yo también, aunque por el momento no tengo respuesta...

Las páginas index.jsp y principal.jsp no tienen nada de especial, así que las saltearé casi con desprecio.

4. La clase Login.java
Esta es la acción propiamente dicha, aquí va el código:





Lo importante de desatacar es que ya no necesitamos ActionForms ni ningún otro tipo de clase que represente el formulario a tratar. Aquí Struts 2 utiliza el patrón Dependency Injection para rellenar los atributos que se necesiten, por esa razón, si tenemos que tener en cuenta la creación de un get/set para cada componente de presentación que queramos tratar.
Con respecto al método execute(), como ven no recibe parámetros y retorna un String representando el resultado de la acción (error, exito o cualquier otro string).

4. Todo muy lindo, pero ¿cómo configuro esto?. El archivo struts.xml



Lo importante a destacar son las etiquetas:
  • package: simboliza una unidad de trabajo, es exactamente el mismo concepto que paquetes en UML y en Java.
  • action: la acción propiamente dicha
  • result: el resultado posible. Si no incluimos un nombre, será utilizado por defecto cuando la acción resulte en SUCCESS.
OK, estoy ya se hizo muy largo, les dejo los fuentes para que jueguen un poco y en próximos post veremos cómo acceder a la sesión, al request, etc.

Saludos

martes, julio 10, 2007

Struts 2: Abajo lo viejo, arriba lo nuevo

Creo que es la primera vez que no siento la famosa "resistencia al cambio". He estado leyendo un poco qué es lo nuevo de Struts 2 y la verdad es que me ha convencido hasta el momento. Investigaré más a fondo e intentaré escribir un poco más de detalle.
Por el momento, les puedo comentar que es lo nuevo de Struts 2:
  • La arquitectura: no más el ActionServlet, ahora es un filtro, FilterDispatcher. Además incorpora interceptors (como filtros adicionales)
  • Tags: soporte para AJAX con tags propios (en realidad, usa DOJO), ahora soporta validación dentro del mismo tag. Y por supuesto, tags específicos para JSP, Velocity y Freemaker.
  • Compatibilidad con Spring
  • Configuración: todavía podemos realizar la configuración mediante XML (aunque ha cambiado la nomenclatura), pero además, podemos utilizar annotations, wildcards en los archivos xml, e incluso NINGUNA CONFIGURACIÓN!! (esto, por supuesto, en estado experimentar y para que funcione debemos seguir una serie de reglas de nomenclatura).
  • Nuevo enfoque de validación: ya no utiliza el framework de jakarta commons, sino el enfoque de webwork.
  • Mejor manejo de los checkbox: al fin!!
  • Adiós a los FormBeans: ahora los forms estarán basados en POJOs.
La primera impresión (apenas hice el Hello World y analicé las aplicaciones de ejemplo), fue que realmente me pareció muy fácil de implementar, más fácil que Struts 1, es realmente muy rápido de entender y aplicar (hasta el momento). Pero sólo el tiempo podrá formar una opinión sólida. La contra es que no se encuentran tutoriales en español, por el momento todo en inglés, así que en próximos post, iré detallando más, como una humilde contribución.

Saludos

viernes, julio 06, 2007

El evangelio de Roger Pressman

Finalmente, ha llegado a mis manos el famoso libro de Roger Pressman "Ingeniería del Software". Siempre he considerado que es como la "biblia del desarrollo de software" y que no podía terminar mi tesis de ingeniería sin haberlo leído. [En este punto muchos no estarán de acuerdo, acepto sugerencias de otros libros y autores]
Por el momento no puedo dar una crítica exhaustiva del libro, apenas he comenzado a leerlo, pero habiendo dado un vistazo general a los contenidos, puedo decir que son 992 páginas de pura ingeniería que cubren todo el ciclo de vida del SW. Me ha interesado mucho una sección especial cubre la "Aplicación de la ingeniería Web", muy útil para estos días, y por supuesto, un tema que siempre me ha resultado de especial interés, las métricas de software.

Saludos