Bienvenido a re-orientation! Esperamos que encuentres lo que buscas

Estructura del controlador de acciones AccionProxy

Parte del Manual para la creación, paso a paso, de una aplicación web Java MVC totalmente operativa sin el uso de frameworks


Ya sabemos que en el fichero de propiedades de nuestra aplicación podemos definir para cada acción la clase java asociada a ésta (es decir, la ruta de la clase java que encapsula la funcionalidad ("clase de acción") ), y la relación con otros componentes al mismo nivel. Y que esta información de configuración es usada por AccionProxy para crear en tiempo de ejecución una instancia de la clase asociada a la acción. ¿Cómo? Lo veremos a continuación.

La clase AccionProxy

Como vimos hace ya algunos post, SPrincipal ha pasado a AccionProxy el control, invocando a su método "creaAction" con los parámetros de la conexión y el nombre de la acción solicitada desde la web (en nuestro ejemplo: listarLibrosDeCuentoDisponibles).

Descripción del método creaAction en detalles

	public void creaAction (	HttpServletRequest request, HttpServletResponse response, String actionName){
		try{
			
			Boolean otraAcc = false;
		    String nombAcc = actionName;
		    String tipoRespAccExe,valorRespAccExe = null;

		    AccionConf confAcc = new AccionConf();
		    confAcc.setPropertiesPath("com.ro.ejercicioMVC.acciones");
		    do {
		    	
		    	String nuevaAcc = confAcc.getProperty(nombAcc + ".srcAction");
		        if ( nuevaAcc != null ){ nuevaAcc = nuevaAcc.trim(); }
		        
		        Accion accion;
				accion = (Accion) Class.forName(nuevaAcc).newInstance();
				accion.setActionParams(request, response);
				Boolean RespAccExe = accion.executeAction();
				
				if (RespAccExe.equals(true))
				{   
				  ...
				} else if (RespAccExe.equals(false)) {
				  ...
				}
		    } while( otraAcc.equals(true) ) ;

		} catch (Exception ex) {System.out.println(" Exception: " + ex.getMessage() ); }	
		  
	}

Lo primero que puede llamar la atención del método es que está compuesto en primer lugar por una estructura do-while que envuelve en un bucle toda su lógica (relacionada con la ejecución de la acción y el tratamiento del flujo de navegación); lo que nos permitirá en la práctica ejecutar la sección de código contenida tantas veces como sea necesario, mientras la condición asociada al bucle se cumpla.

El bucle principal:

La estructura de iteración elegida es un do-while (y no al contrario: while-do) porque llegados a este punto la acción debe ejecutarse al menos una vez (primero se realizan las acciones y luego se evalúa el resultado).

La clave para iterar es la variable lógica local "otraAcc " que inicializamos antes de entrar en el bucle al valor "falso". Posteriormente ya dentro del loop, en función del resultado de la acción y la configuración asociada a esta, podemos cambiar esta variable para forzar una nueva ejecución.

Ejecutando la acción:

Lo primero que hacemos una vez en el bucle es recuperar del fichero de propiedades la ruta completa y el nombre de la clase de acción asociada a la variable de entrada actionName, pues en esta clase encontraremos el código de la funcionalidad que queremos ejecutar.

String nuevaAcc = confAcc.getProperty(nombAcc + ".srcAction");

Tanto para recuperar el parámetro anterior como el resto desde el fichero de propiedades, la clase AccionProxy se apoya en el método "getProperty(String clave)" de la clase AccionConf, al que le pasamos la clave y obtenemos el valor asociado. Esto es todo lo que veremos de la clase utilitaria AccionConf.java ya que no está directamente relacionada con el tema que nos ocupa. Para los interesados en profundizar el código fuente está disponible aquí.

Con la ruta de la clase que modela la acción almacenada en la variable nuevaAcc, crearemos un objeto de nuestra "clase de acción" en tiempo de ejecución. Esto se hace en tiempo real (no sabemos que acción nos pedirán desde la capa web apriori), y tener todos los objetos de este tipo desplegados en el servidor a la espera no es una buena técnica de programación por múltiples razones.

Cargaremos la clase usando el método forName(nuevaAcc) de Class, y crearemos una instancia (newInstance()), lo que nos devolverá un "Objetc" que tendremos que "castear" al tipo de nuestra "clase de acción".

En nuestro ejemplo, la clase que modela la acción etiquetada com "listarLibrosDeCuentoDisponibles" es: "com.ro.ejercicioMVC.acciones.ListarLibrosCuento.java".

Ya con el objeto creado, hacemos uso del polimorfismo para, a través del "executeAction()" de su superclase(Accion.java), ejecutar el método "execute()" de nuestra "clase de acción". Es en este método donde realmente se implementa el código específico que queremos ejecutar para nuestra funcionalidad. En el siguiente apartado veremos este paso en detalle, junto con las "clases de acción".

				Accion accion;
				accion = (Accion) Class.forName(nuevaAcc).newInstance();
				accion.setActionParams(request, response);
				Boolean RespAccExe = accion.executeAction();
Terminos Tecnología: