Framework Struts2 Pablo Cáceres F.
Introducción <ul><li>Struts 2 es un framework de presentación, basado en el patron MVC.  </li></ul><ul><li>Se distingue su...
Arquitectura – Patrón MVC
Principales componentes <ul><li>Los principles componentes de framework son:  </li></ul><ul><ul><li>DispatcherFilter  </li...
Principales componentes <ul><li>Interceptors </li></ul><ul><ul><li>Son clases que siguen el patrón interceptor.  Se encarg...
Principales Componentes <ul><li>Actions </li></ul><ul><ul><li>Los Actions serán lo encargados de ejecutar la logica necesa...
Principales Componentes <ul><li>Results </li></ul><ul><ul><li>Los Results son Objetos que encapsulan el resultado de un Ac...
En resumen <ul><li>Llega un Request a la aplicación.  </li></ul><ul><li>El Request es interpretador por el DispatcherFilte...
Configuración del framework <ul><li>Struts2 posee varios archivos de configuración:  </li></ul><ul><li>struts.xml:  Es el ...
Package <ul><li>Mediante los Packages podemos agrupar un conjunto de ActionMapping que compartan la configuración. Por eje...
ActionMapping <ul><li>Un ActionMapping es un objeto que contiene la información de configuración para el manejo de un conj...
Namespace <ul><li>A los Package se les puede asignar un namespace que indica un subcontexto de la aplicación web. El names...
Struts.xml <ul><li><struts> </li></ul><ul><li><package name= &quot;Userpackage&quot;  namespace=&quot;/dispatch&quot; exte...
Interceptors <ul><li>Stuts2 permite utilizar interceptors para los Actions. Mediante estos podemos ejecutar código antes y...
Declaración Interceptor <ul><li>public interface Interceptor extends Serializable { </li></ul><ul><ul><li>void destroy(); ...
Registro de Interceptors <ul><li><struts> ... </li></ul><ul><ul><li><package> ...  </li></ul></ul><ul><ul><ul><li><interce...
Interceptor stacks. <ul><li>Los Interceptor Stacks, nos permiten agrupar un conjunto de interceptors, en un solo paquete p...
Utilización de Interceptors <ul><li>Para utilizar los interceptors definidos, podemos:  </li></ul><ul><li>Definirlos en el...
Resumen de ejecución <ul><li>Llega un Request a la aplicación.  </li></ul><ul><li>El Request es interpretador por el Dispa...
Próxima SlideShare
Cargando en…5
×

Clase 5 struts2

1.279 visualizaciones

Publicado el

0 comentarios
1 recomendación
Estadísticas
Notas
  • Sé el primero en comentar

Sin descargas
Visualizaciones
Visualizaciones totales
1.279
En SlideShare
0
De insertados
0
Número de insertados
2
Acciones
Compartido
0
Descargas
40
Comentarios
0
Recomendaciones
1
Insertados 0
No insertados

No hay notas en la diapositiva.

Clase 5 struts2

  1. 1. Framework Struts2 Pablo Cáceres F.
  2. 2. Introducción <ul><li>Struts 2 es un framework de presentación, basado en el patron MVC. </li></ul><ul><li>Se distingue su amplia capacidad de configuración y extensibilidad. Permite el uso de plugins de componentes e integracion con otros frameworks. </li></ul>
  3. 3. Arquitectura – Patrón MVC
  4. 4. Principales componentes <ul><li>Los principles componentes de framework son: </li></ul><ul><ul><li>DispatcherFilter </li></ul></ul><ul><ul><li>Interceptors </li></ul></ul><ul><ul><li>Actions </li></ul></ul><ul><ul><li>Results </li></ul></ul><ul><li>DispatcherFilter </li></ul><ul><li>Es el punto de entrada del framework. A partir de el se lanza la ejecución del procesamiento para cada request que involucre al framework. </li></ul><ul><li>Sus principales responsabilidades son: </li></ul><ul><ul><li>Ejecutar los Actions (handlers para los request) </li></ul></ul><ul><ul><li>Comenzar la ejecución de la cadena de interceptors (interceptors chain) asociados al request </li></ul></ul><ul><ul><li>Limpiar el ActionContext ? (para evitar memory leaks). El ActionContext ? es el contexto sobre el cual se ejecuta un Action. </li></ul></ul>
  5. 5. Principales componentes <ul><li>Interceptors </li></ul><ul><ul><li>Son clases que siguen el patrón interceptor. Se encargan de interceptar la invocación a un Action. Permiten realizar operaciones antes y después de la invocación de un Action. También permiten evitar que un Action se ejecute. Nos sirve para reutilizar cierta funcionalidad que queremos aplicar a un conjunto de Actions. </li></ul></ul><ul><ul><li>Struts2 trae definidos un conjunto de interceptors por defecto, que le permite realizar un conjunto de acciones sobre los Actions, el Request y Response. Estas acciones son, por ejemplo: validaciones de los parámetros de entrada, inyección de dependencia, logueo, etc. </li></ul></ul>
  6. 6. Principales Componentes <ul><li>Actions </li></ul><ul><ul><li>Los Actions serán lo encargados de ejecutar la logica necesaria para manejar un request determinado. A diferencia de versiones anteriores de struts, los Actions no estan obligados a implementar o heredar de una interfaz o clase ya definida. Pueden ser POJOs. Igualmente, struts2 posee una interfaz Action. Esta interfaz permite definir el método por defecto que se ejecutará sobre el Action para que no tengamos que definirlo por otro medio (Existen varias formas de indicarle a Struts2 el método a invocar sobre un action). También existe una implementación de esta interfaz, denominada ActionSupport, que nos provee funcionalidad de gran utilidad necesaria por un conjunto de Interceptors para poder manipular el Action a invocar. </li></ul></ul>
  7. 7. Principales Componentes <ul><li>Results </li></ul><ul><ul><li>Los Results son Objetos que encapsulan el resultado de un Action. Los Actions de la aplicación simplemente devolverán un String en sus métodos. Un Action puede devolver diferentes resultados luego de su ejecución. Cada uno de estos resultados se corresponde con un Result, previamente configurado en Struts2. La configuración de cada Result determina principalmente: el tipo de vista a mostrar (JSP, Velocity Templates, FreeMarker, entre otros), el recurso asociado a dicha vista, el nombre asociado al Result (mediante este y el resultado del Action se determina el Result a utilizar). </li></ul></ul>
  8. 8. En resumen <ul><li>Llega un Request a la aplicación. </li></ul><ul><li>El Request es interpretador por el DispatcherFilter y determina que Action y que conjunto de Interceptors invocar. </li></ul><ul><li>Cada Interceptor ejecuta sus acciones previas a la ejecución del método de Action a invocar </li></ul><ul><li>Es invocado el método del Action. </li></ul><ul><li>Cada Interceptor ejecuta sus acciones posteriores a la ejecución del método de Action a invocar </li></ul><ul><li>Se examina el resultado obtenido del Action y se determina el Result correspondiente. </li></ul><ul><li>Mediante el Result determinado se genera la vista, y según la configuración definida sobre el se invoca el proceso de generación de la vista. </li></ul><ul><li>La vista generada retorna al cliente. </li></ul>
  9. 9. Configuración del framework <ul><li>Struts2 posee varios archivos de configuración: </li></ul><ul><li>struts.xml: Es el principal archivo de configuración del framework. Aquí definimos los ActionMapping de nuestra aplicación, su división en Package, la registración de los Interceptors, la asignación de los Interceptors a los Package, entre otras cosas. </li></ul><ul><li>struts-default.xml : Este archivo define una configuración básica de un Package del cual es conveniente que el resto de nuestro Packages hereden para obtener los beneficios del framework. Podemos redefinir esta configuración ubicando un archivo propio con el mismo nombre en el classpath. </li></ul><ul><li>struts.properties: Este es un archivo de properties que contiene un conjunto de pares key - valor que nos permiten definir un conjunto de parametros del framework. Este archivo es cargado por defecto por el framework (obteniendolo de struts-core.jar), pero podemos redefinir los parametros ubicando el mismo en el classpath de la aplicación </li></ul>
  10. 10. Package <ul><li>Mediante los Packages podemos agrupar un conjunto de ActionMapping que compartan la configuración. Por ejemplo, podemos definir los interceptors a aplicar sobre ellos, Results comunes, manejo de excepciones unificado, entre otras cosas. </li></ul><ul><li>En forma mas general, los Packages permite definir unidades reutilizables y sobreescribibles que agrupan interceptors, interceptor-stacks, action, results, result types. Se puede definir una jerarquia entre los Packages para reutilizar configuración, pueden existir package abstractos para luego reutilizar. </li></ul><ul><li>Las principales ventajas que proveen son: </li></ul><ul><ul><li>Reutilización de configuración. </li></ul></ul><ul><ul><li>Modularización de la aplicación. </li></ul></ul>
  11. 11. ActionMapping <ul><li>Un ActionMapping es un objeto que contiene la información de configuración para el manejo de un conjunto de request. Se corresponde con el elemento <action>. En el se define: </li></ul><ul><li>El/los handler/s del request, el metodo a invocar. </li></ul><ul><li>Tambien mantiene referencia a los Results definidos. A partir del atributo namespace del Package en que esta definido, su atributo name , y el postfijo utilizado (por default .action) podemos identificar la expresion regular que debe cumplir el path del Request para que el framework decida su ejecución. </li></ul>
  12. 12. Namespace <ul><li>A los Package se les puede asignar un namespace que indica un subcontexto de la aplicación web. El namespace define un prefijo para identificar al Package. Por ejemplo, dada la aplicación &quot;pruebaStruts&quot;, definiendo un package con el atributo &quot;namespace='/package1'&quot;, todas las urls del tipo &quot;http://ip:puerto/pruebaStruts/package1/*&quot; serán mapeadas a este package (o a todos los que tengan este namespace) en busca del action correspondiente. </li></ul><ul><li>Los namespace permiten evitar conflicto de nombres entre actions y modularizar nuestra aplicación. </li></ul><ul><li>Los Tags de Struts2 conocen los namespaces, asi que no es necesario incluirlos en los elementos de las paginas. </li></ul>
  13. 13. Struts.xml <ul><li><struts> </li></ul><ul><li><package name= &quot;Userpackage&quot; namespace=&quot;/dispatch&quot; extends=&quot;struts-default&quot;> </li></ul><ul><li><action name= &quot;User&quot; class=&quot;example.dispatch.user.UserAction&quot;> </li></ul><ul><li><result name= &quot;success&quot;>/dispatch/success.jsp</result> </li></ul><ul><li></action> </li></ul><ul><li><action name= &quot;addUser&quot; method=&quot;add&quot; class=&quot;example.dispatch.user.UserAction&quot;> </li></ul><ul><li><result name= &quot;success&quot;>/dispatch/success.jsp</result> </li></ul><ul><li></action> </li></ul><ul><li><action name= &quot;updateUser&quot; method=&quot;update&quot; class=&quot;example.dispatch.user.UserAction&quot;> </li></ul><ul><li><result name= &quot;success&quot;>/dispatch/success.jsp</result> </li></ul><ul><li></action> </li></ul><ul><li><action name= &quot;deleteUser&quot; method=&quot;delete&quot; class=&quot;example.dispatch.user.UserAction&quot;> </li></ul><ul><li><result name= &quot;success&quot;>/dispatch/success.jsp</result> </li></ul><ul><li></action> </li></ul><ul><li></package> </li></ul><ul><li></struts> </li></ul>
  14. 14. Interceptors <ul><li>Stuts2 permite utilizar interceptors para los Actions. Mediante estos podemos ejecutar código antes y después de la ejecución de un Action. Esto nos permite agregar funcionalidad útil para todos los Actions de nuestra aplicación. </li></ul><ul><li>Struts2 trae definidos un conjunto de interceptors por defecto, que le permite realizar un conjunto de acciones sobre los Action, el Request y el Response. Estas acciones son, por ejemplo: validaciones de los parámetros de entrada, inyección de dependencias, logueo, etc. </li></ul><ul><li>Todos los Interceptor deben implementar la interfaz Interceptor </li></ul>
  15. 15. Declaración Interceptor <ul><li>public interface Interceptor extends Serializable { </li></ul><ul><ul><li>void destroy(); </li></ul></ul><ul><ul><li>void init(); </li></ul></ul><ul><ul><li>String intercept(ActionInvocation invocation) throws Exception; </li></ul></ul><ul><li>} </li></ul><ul><li>Método init: Es llamado luego de que Interceptor sea creado. </li></ul><ul><li>Método destroy: Es utilizado para que el Interceptor libere los recursos que ha alocado. </li></ul><ul><li>Método intercept: Es el que debe contener la lógica a ejecutar antes y despues de la llamada de un método. </li></ul>
  16. 16. Registro de Interceptors <ul><li><struts> ... </li></ul><ul><ul><li><package> ... </li></ul></ul><ul><ul><ul><li><interceptors> </li></ul></ul></ul><ul><ul><ul><li><interceptor name=&quot;security&quot; class=&quot;com.company.security.SecurityInterceptor&quot;/> </interceptors> </li></ul></ul></ul><ul><ul><li>... </package> </li></ul></ul><ul><li>... </struts> </li></ul>
  17. 17. Interceptor stacks. <ul><li>Los Interceptor Stacks, nos permiten agrupar un conjunto de interceptors, en un solo paquete para ser utilizados en conjunto. (dentro de un stack podemos incluir otro stack). </li></ul><ul><li>Registro de Interceptor Stacks </li></ul><ul><li><struts> ... </li></ul><ul><li><package> ... </li></ul><ul><li><interceptors> </li></ul><ul><ul><li><interceptor name=&quot;security&quot; class=&quot;example.interceptor.SecurityInterceptor&quot;/> </li></ul></ul><ul><ul><li><interceptor name=”logueo” class=”example.interceptor.LoguerInterceptor”/> </li></ul></ul><ul><ul><li><interceptor-stack name=&quot;secureStack&quot;> </li></ul></ul><ul><ul><li><interceptor-ref name=&quot;security&quot;/> </li></ul></ul><ul><ul><li><interceptor-ref name=&quot;logueo&quot;/> </li></ul></ul><ul><li></interceptor-stack> </li></ul><ul><li></interceptors> </li></ul><ul><li>... </package> </li></ul><ul><li>... </struts> </li></ul>
  18. 18. Utilización de Interceptors <ul><li>Para utilizar los interceptors definidos, podemos: </li></ul><ul><li>Definirlos en el package como default interceptor </li></ul><ul><ul><li><struts> ... </li></ul></ul><ul><ul><li><package> ... </li></ul></ul><ul><ul><li><default-interceptor-ref name=&quot;secureStack&quot;/> </li></ul></ul><ul><ul><li>... </package> </li></ul></ul><ul><ul><li>... </struts> </li></ul></ul><ul><li>Definirlos en cada Action </li></ul><ul><li><struts> ... </li></ul><ul><ul><li><package> ... </li></ul></ul><ul><ul><ul><li><action name=&quot;loging&quot; class=&quot;example.action.Login&quot;> <result name=&quot;success&quot;> </li></ul></ul></ul><ul><ul><ul><li>...</result> </li></ul></ul></ul><ul><ul><ul><li><interceptor-ref name=&quot;secureStack&quot;/> </li></ul></ul></ul><ul><ul><ul><li></action> </li></ul></ul></ul><ul><ul><li>... </package> </li></ul></ul><ul><li>... </struts> </li></ul>
  19. 19. Resumen de ejecución <ul><li>Llega un Request a la aplicación. </li></ul><ul><li>El Request es interpretador por el DispatcherFilter ? y determina que Action y que conjunto de Interceptors invocar. </li></ul><ul><li>Cada Interceptor ejecuta sus acciones previas a la ejecución del método de Action a invocar </li></ul><ul><ul><li>Si el Interceptor el Action: Se ubicara en la session del usuario un objeto Locale para utilizar. </li></ul></ul><ul><ul><li>Si el Interceptor ValidationInterceptor intercepta el Action: Se ejecutan la reglas de validación definidas sobre el Action </li></ul></ul><ul><ul><li>Si el Interceptor AnnotationValidationInterceptor intercepta el Action: Se chequea en el método a invocar del Action si tiene la anotación @SkipValidation, en cuyo caso no se realizan validaciones </li></ul></ul><ul><li>Es ejecutado el método anotado con @Before en el Action </li></ul><ul><li>Es invocado el método del Action. </li></ul><ul><li>Es ejecutado el método anotado con @After en el Action </li></ul><ul><li>Es ejecutado el método anotado con @BeforeResult en el Action </li></ul><ul><li>Cada Interceptor ejecuta sus acciones posteriores a la ejecución del método de Action a invocar </li></ul><ul><ul><li>Si el Interceptor ModelDrivenInterceptor ? intercepta el Action: Luego de la ejecución del Action se ubicara en el value stack el modelo que provee el Action. </li></ul></ul><ul><ul><li>Si el Interceptor ParametersInterceptor ? intercepta elAction: Los parametros provenientes del Request se ubican en el value stack </li></ul></ul><ul><li>Se examina el resultado obtenido del Action y se determina el Result correspondiente. </li></ul><ul><li>Mediante el Result determinado se genera la vista, y según la configuración definida sober el se invoca el proceso de generación de la vista. </li></ul><ul><li>La vista generada retorna al cliente. </li></ul>

×