martes agosto 19, 2003 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:
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
public AccionResult accion();
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();
}
}
}
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
}
public void dispararEvents(int tipoEvento);
public void addEventListener(AccionListener aListener);
public void removeEvent(AccionListener aListener);
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]
miércoles agosto 13, 2003
public class AccionFactory {
// tabla para guardar las acciones
private static Hashtable mapaAcciones = new Hashtable();
public static Accion getAccion(String accion){
Accion action = (Accion) mapaAcciones.get(accion);
if (action==null){
try {
action = (Accion)Class.forName(accion).newInstance();
mapaAcciones.put(accion, action);
} catch (InstantiationException e) {
System.out.println("Error al instanciar la clase");
e.printStackTrace();
} catch (IllegalAccessException e) {
System.out.println("Acceso Ilegal a no se que ¿?");
e.printStackTrace();
} catch (ClassNotFoundException e) {
System.out.println("Tas tonto esa clase no existe");
e.printStackTrace();
}
}
return action;
}
}private String getClassName(String nombre){
int barra = nombre.lastIndexOf("/");
int punto = nombre.lastIndexOf(".");
if ((barra<=0)&&(punto<=0)) return nombre;
return nombre.substring(barra+1,punto);
}
martes agosto 12, 2003
public class MiServlet extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response) {
String action = request.getParameter("action");
if(action.equals("alta")){
// codigo del alta
}else if(action.equals("baja")){
// codigo para dar de baja
else if (....){
}....
}
}
public interface Accion {
public String accion();
}
public class AccionFactory {
public static Accion getAccion(String accion){
Accion action = null;
try {
action = (Accion)Class.forName(accion).newInstance();
} catch (InstantiationException e) {
System.out.println("Error al instanciar la clase");
e.printStackTrace();
} catch (IllegalAccessException e) {
System.out.println("Acceso Ilegal a no se que ¿?");
e.printStackTrace();
} catch (ClassNotFoundException e) {
System.out.println("Tas tonto esa clase no existe");
e.printStackTrace();
}
return action;
}
}
public class MapeoAccionesDAO {
private Properties mapa;
public MapeoAccionesDAO(String configuracion){
mapa = new Properties();
try {
InputStream iStream = new FileInputStream(configuracion);
mapa.load(iStream);
} catch (FileNotFoundException e) {
System.out.println("Error fichero no encontrado");
e.printStackTrace();
} catch (IOException e) {
System.out.println("Error IOException no se porque da este error");
e.printStackTrace();
}
}
public String getNombreAccion(String requesURI){
return mapa.getProperty(requesURI);
}
}
public class Controlador extends HttpServlet {
/*
* Usaremos un objeto que nos mapee las URI con las
* clases accion asociadas a esa URI
*/
private MapeoAccionesDAO acciones;
public void init(ServletConfig config) throws ServletException {
super.init(config);
/*
* Inicializamos el mapeo usando un patron DAO
*/
ServletContext sc = config.getServletContext();
String configuracion = sc.getRealPath("configuracion.properties");
acciones = new MapeoAccionesDAO(configuracion);
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
this.procesar(request,response);
}
protected void doPost( HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
this.procesar(request,response);
}
private void procesar( HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException{
Accion action = null;
/*
* Extraemos la URI de la solicitud
* y se la pasamos al properties como clave
*/
String accion = acciones.getNombreAccion(request.getRequestURI());
System.out.println("Voy a realizar la accion : " + accion);
/*
* Instanciamos la clase que nos devuelve el properties
* y usamos este como zona de mapeo
* y todo esto usando un patron Factory
*/
action = AccionFactory.getAccion(accion);
String nuevaURL = action.accion();
response.sendRedirect(nuevaURL);
}
}
comprar.do=comprarAccion
/mittienda/elegir.do=org.mitienda.elegirAccion
/mittienda/devolver.do=org.mitienda.devolveAccion
/mittienda/buscar.do=org.mitienda.buscarAccion
/mittienda/inicio.do=inicioAccion