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

Pedro del Gallego's Weblog

« Revisado : El patron... | Main | Sobre Kuhn, aristote... »

20030819 martes agosto 19, 2003

Front Controller + gestor de eventos ( 2ª parte )

En los post anteriores hablabamos sobre el patron front controller, ( tambien hablaron Al y Álvaro). Este post es un poco largo y contiene bastante codigo. Para ver un esquema que sigue el flujo de una peticion ver esta secuencia y para ver un diagrama de las clases finales ver aqui. En este post seguire con dos aspectos que deje fuera:

Antes que nada decir que este ejemplo no pretende ser un framework real, ni nada parecido, sino solo un conjunto de clases que muestren de la manera mas sencilla posible algunos conceptos del front controller (por esto no he querido utilizar XML y minimizar la configuracion en archivos properties ya que no son en si mismo parte del patron)

Redireccionamiento


En la implementacion anterior solo podiamos ir a una vista o a otra accion mediante el metodo sendRedirect. En este caso el primer paso era crear una estructura que almacenase el tipo de respuesta que se debia ejecutar.

public class AccionResult { private String nombre="";
private String path="";
private boolean forward=true;
/**
* Constructores
*/
public AccionResult(String nombre, boolean forward){ this.nombre=nombre;
this.forward=forward;
}

public AccionResult(String nombre, String path, boolean forward){ this.nombre=nombre;
this.path=path;
this.forward=forward;
}

..... Metodos Getters y Setters


Cambiamos el metodo accion de la interfaz Accion para que en vez de una cadena ahora nos devuelva una instancia de la clase AccionResult

public AccionResult accion();

Y despues añadir a la clase Controlador el metodo enrutar

public void enrutar(AccionResult aResult, HttpServletRequest request, HttpServletResponse response){
if (aResult.isForward()){ // Lanzo un forward con la request y un response
try { this.getServletContext().getRequestDispatcher(response.encodeURL(aResult.getNombre())).forward(request,response); } catch (ServletException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
}else{ // Redirecciono a la nueva URL
try { response.sendRedirect(aResult.getNombre()); } catch (IOException e) { e.printStackTrace(); }
}
}


Y ahora solo con cambiar la accion req.sendRedirect por this.enrutar(aResult,rep,res) del metodo procesar del controlador podemos elegir el tipo de redireccionamiento. El problema de esta solucion es que los valores del la clase AccionResult son introducidos directamente enel codigo, cuando lo ideal seria poder definirlos en un fichero (xml o properties), por ejemplo algo como [forward value="true" result="exito" direccion="/RegistroExito.jsp"] para desacoplar las JSPs de las Acciones algo mas.

Gestion de eventos


El segundo punto, creo que va a ser mas polemico (ya que aqui si que he encontrado cierta dificultad en cuanto al concepto en si mismo). A priori habia dos casos que se podrian tratar: El esquema basico del funcionamiento del front controller que he diseñado viene dado por esta secuencia. Como vemos existen unas clases que ejecutaran cada evento particular, estas clases implementan la interfaz AccionListener:

public interface AccionListener { public String doBeforeAccion() throws ServletException;
public String doAfterAccion() throws ServletException;
}
Existe una clase abstracta apartir de la que heredan todos los eventos AccionEvent : public abstract class AccionEvent implements AccionListener { public static final int BEFORE_ACCION=0,AFTER_ACCION=1; int tipoEvento;
public AccionEvent(int tipoEvento) { this.tipoEvento=tipoEvento; }
.....Metodos Getters y Setters
}


Y la interfaz accion se amplia con los metodos necesarios para añadir, eliminar y disparar los eventos.

public void dispararEvents(int tipoEvento);
public void addEventListener(AccionListener aListener);
public void removeEvent(AccionListener aListener);

Asi mismo estos metodos son implementados por la clase AbstracAccion, del que heredaran ahora las acciones.
protected List eventListeners = new ArrayList(); public void dispararEvents(int tipoEvento) { Iterator i = eventListeners.iterator(); AccionEvent aListener = null; while (i.hasNext()) { aListener =(AccionEvent) i.next(); try{ if (aListener.getTipoEvento()==tipoEvento) aListener.doBeforeAccion(); else if (aListener.getTipoEvento()==tipoEvento) aListener.doAfterAccion(); }catch(ServletException se){ System.out.println("Error al lanzar un Evento del tipo " + tipoEvento); } } }
.... Los otros dos metdos .....
}

Resumiendo el esquema de las clases queda asi. Ya podeis despedazarme por los errores que he cometido. ¿Algun problema de concepto?. ¿Alguna sugerencia? ( ago 19 2003, 06:31:30 PM CEST ) Permalink Comentarios [3]

URL de la referencia: http://weblogs.javahispano.org/akuma/entry/front_controller_gestor_de_eventos
Comentarios:

Bueno, he tardado y no estoy en perfectas condiciones para examinar este post con todo detalle, pero tiene buena pinta. La verdad, algún día puedes ir reuniendo el resultado de esto en un documento más completo.

Enviado por Al en agosto 23, 2003 a las 10:36 AM CEST #

Acabo de ver el texto que has puesto invitando a asistir al congreso. Joder, así que eso e slo que tu esperas del congreso?, Cervezas?. Que desilusión! ;-)

Enviado por Al en agosto 23, 2003 a las 10:38 AM CEST #

Hombre tambien esperaba algunos potes :-P, que no solo de cerveza vive el hombre.

Ya sabia yo cuando estaba posteando que no iba a dar tanto juego como el anterior, porque este ha salido un poco espesito. Y el tema resulta mas complejo, y con demasiado codigo.

En cuanto al documento ... ummm ... de acuerdo, eso si cuando lo tenga esbozado , espero una lluvia criticas en la lista de drafts, sobre todo por no sacar algo con muchas tonterias.

De todas formas al menos tengo pensado otros dos post: uno sobre AccionForms(o algun sistema parecido) y otro sobre una especie de clase de AbstractCache que ayude al cacheado (a cual mas pesado :-), pero la verdad es que he aprendido mucho con los dos que llevo y como soy muy curioso.

PD : Eso si espero criticas mas duras, que es como mas se aprende. Y eso va para todos.

Enviado por Akuma en agosto 23, 2003 a las 03:53 PM CEST #

Enviar un comentario:

Nombre:
Correo electrónico:
URL:

Su comentario:

Sintaxis HTML: Deshabilitado