La verdadera sabiduría reside en conocer la propia ignorancia.
Sócrates

Archivos del día 7 de March del 2008

[Struts] - Input y Forwards de un Action

Se entiende por input es el Framework de Struts como la URL origen de una petición (request). La petición puede validarse o no; en caso de que se valide y no supere la validación, el flujo se devuelve al input, y en caso contrario se entrega la petición a la clase action que le corresponda.

El action se encargará de entregar la petición a la capa de negocio para que la procese, y en función del resultado que se obtentega de este proceso, la clase action entregará la respuesta (response) a la URL que le corresponda. Estas URLs entre las que puede elegir el action para entregar la respuesta son conocidas como forwards.

struts-flujo.JPG

Es decir, tanto input como forward son URLs: pueden ser desde una página HTML, como una imagen, un documento PDF… incluso también una acción de Struts (.do) !, que no dejan de ser URLs que apuntan a una servlet (incluso podemos pasar parámetros). Por ejemplo:

<forward name="validar" path="/comprobarValidacionBalance.do?validar=false"/>

Si utlizamos el Framework de Tiles, además de URLs podemos utilizar el nombre de una tile como input / forward. El controlador (org.apache.struts.tiles.TilesRequestProcessor) las diferencia porque el path no comienza por "/". Recomiendo que el nombre de la tile comience por mayúsculas para que los que lean el fichero struts-config.xml de tu aplicación las diferencien más fácilmente. Por ejemplo:

<forward name="firma" path="FirmaElectronica"/>

El mismo recurso puede ser considerado input de un action y forward de otro, o incluso forward del mismo action. 

Best Practice ?

Me pregunta minifreak en [Struts Validator] - input en struts-config.xml si considero que es una best practice que tanto input como forward se refieran a acciones y no a JSPs (o tiles). Entiendo que la pregunta viene sobre todo por temas de seguridad (comprobar que el usuario de navegación sea válido antes de permitirle ver una JSP) y otras posibles operaciones comunes a todas las peticiones. La respuesta es muy propia mia :ni sí ni no, simplemente responde a la necesidad.

Redirigir a una acción consume más recursos del servidor y el tiempo de respuesta se incrementa. Aunque hoy día esto no representa un gran problema por la gran capacidad y mínimo tiempo de proceso de los servidores, YO únicamente pongo una acción si ese consumo de recursos es justificado y necesario. No todo tiene que pasar por Struts obligatoriamente.

Por ejemplo, en una típica pantalla de login, en el input de la acción que comprueba si el usuario es válido yo pondría simplemente la URL de la pantalla o el nombre de la Tile: no es necesario procesar nada en el servidor.

Si una pantalla es mi input es porque el usuario de navegación ya ha llegado allí, por tanto ha sido autorizado previamente. Y si nos referimos al forward, el action acaba de comprobarlo. Si quieres ser totalmente estricto con la seguridad SÍ necesitarías pasar por el servidor, y como complemento, podrías evitar mediante un filtro en tu web.xml los accesos a todos los recursos que no fuesen actions (.do) de tu aplicación.

En el típico formulario partido de varias páginas, si quieres guardar e ir a la siguiente pantalla, necesitas que la salida del action de guardar la pantalla actual apunte a un action que carge los datos del siguiente formulario.

Technorati Tags: , ,