CURSO STRUTS 2 RESUMEN Resumen de lo visto en este quinto módulo: CONCEPTOS AVANZADOS del framework Struts 2: Debes tener los conceptos muy claros sobre:

Slides:



Advertisements
Presentaciones similares
Curso de Java “Java para Web” Rogelio Ferreira Escutia.
Advertisements

Internet y tecnologías web
Programación Orientada a Objeto 1
Validación de la entrada de datos de usuario
Juan Fernández Rodríguez
Arquitectura Web en Aplicaciones Empresariales Java/J2EE
Validator Framework. Jakarta Commons Validator Paquete de clases de utilidad para la implementación de reglas de validación de datos de entrada de forma.
Patrón MVC con STRUTS.
Herramientas para el uso de AJAX
CGI I La mayor parte de los elementos HTML de que disponemos permite al visitante visualizar los contenidos de un sitio, pero no interactuar con él. Dicho.
Comunicación con el servidor, RPC GWT Google Web Toolkit Prof. Ing
Asynchronous JavaScript and XML.  No es una nueva forma de programar, es una forma de utilizar los estándares disponibles.  Es el arte de intercambiar.
"java del lado del servidor" Servlet y JSP Java Server Pages.
4ta. Reunión SpringHispano & JavaMexico Struts 2.
Servlets Servlets.
Curso de Java y Aplicaciones Web
Symfony La Vista y el Controlador (MVC)
Java 2 Platform Enterprise Edition
SISTEMA DE GENERACIÓN Y SEGUIMIENTO DE REPARACIÓN DE CONTENEDORES
Mecanismo de petición y respuesta Prof. Manuel Blázquez Ochando
CURSO STRUTS 2 CONVERSIÓN DE TIPOS
Enterprise Java Beans Rubén Trujillo Sept-Dic 2008.
RESUMENCURSO STRUTS 2 Resumen de lo visto en este tercer módulo: VISTA del framework Struts 2 Debes tener los conceptos muy claros sobre: Results UI Tags.
UNIVERSIDAD NACIONAL DE PIURA
Taller 5: Trabajo con Plantillas y uso de tecnología Ajax.
Tema 6: Clases Antonio J. Sierra.
Implementación del patrón Modelo-Vista-Controlador
Ingeniero Anyelo Quintero
Servlets, JSP, JavaBEANS,JDBC
Java Server Faces.
CURSO STRUTS 2 CONFIGURACIÓN
InfoPath Ventajas y Uso.
PHP TODO SOBRE PHP.
SPRING MVC.
AJAX Daniel Montenegro Cordero Ingeniería de Sistemas y Computación Pontificia Universidad Javeriana - Cali.
CURSO STRUTS 2 RESUMEN Resumen de lo visto en este primer módulo de INTRODUCCIÓN al framework Struts 2 Debes tener los conceptos muy claros sobre: Framework.
INTRODUCCIÓN A AJAX. ¿Qué es AJAX? Acrónimo de Asynchronous JavaScript And XML No es ninguna tecnología, ni lenguaje de programación. Es una técnica de.
CURSO STRUTS 2 PLUG-IN En el siguiente apartado se mostrará como integrar componentes (plug-in) en Struts 2, mostrando información sobre los plug-in integrados.
Enterprise Java Beans. EJBs Beans gestionados por un contenedor del servidor de aplicaciones para gestionar el acceso a recursos (bases de datos, colas.
Módulo 8: Manejo de Errores y Excepciones
Aplicaciones Web M.C. Jorge Eduardo Ibarra Esquer
CURSO STRUTS 2 INTERCEPTORS
MÓDULO 1: Introducción al framework Struts 2
Introducción al Lenguaje. ¿Qué es PHP? O Es un lenguaje de programación que es interpretado por un servidor web. O El lenguaje es genérico. PHP está orientado.
CURSO STRUTS 2 RESUMEN Resumen de lo visto en este segundo módulo: CONCEPTOS PRINCIPALES del framework Struts 2 Debes tener los conceptos muy claros sobre:
FRAMEWORK VS Código fuente
Ihr Logo PHP Parte 4 “manejo de formularios”. Your Logo Formularios  El proceso para el manejo de FORMULARIOS html requiere generalmente dos páginas,
Aplicaciones Web de Servidor
Etiquetas e Internacionalización. Recursos de String/Manejo de Errores  Recursos de String Todos los strings usados en mensajes en JSPs tanto de datos.
Servlets 10 de Mayo de 2006.
LOGO e-Learning Desktop Integración de RIA’s a objetos de Aprendizaje Alvaro Rodríguez, Darvin Orozco, Rocael Hernández Universidad Galileo {alvrodriguez,
I NGENIERÍA DE S OFTWARE L ABORATORIO IX Struts Eduardo Saavedra A. 27/10/2009.
Autores: Alejandro Teixeira Alexander Parra SOCIEDAD Y INTERNET HTML V.5 ACTIONSCRIPTAJAX HERRAMIENTAS WEB 2.0.
Jakarta Struts version Juan Manuel Zorrilla Gamarra Mario Titto Acostupa.
DIEGO ARMANDO GÓMEZ CUERVO Desarrollo de aplicaciones WEB con herramientas de software libre.
FACULTAD: CIENCIAS ECONÓMICAS Y EMPRESARIALES ASIGNATURA: GESTIÓN DE CONTENIDO ELECTRÓNICO TÍTULO: TINFOPATH - VENTAJAS Y USO. AUTORA: MARIA DANIELA TOMALÁ.
CONTRATOS DE CLIENTES Orlando Sedamano Cornejo Marco Bustinza
SOFTTEK INTERNAL © Copyright All Rights Reserved. Valores Corporativos Softtek S.A. de C.V. Struts Academia Java.
JSF (JAVA SERVER FACES)
Luis Ponce Cabello.  Primera Parte : JSF  Segunda Parte : Facelets  Tercera Parte : Icefaces.
Guadalupe Andrade Mociño.  Significa Modelo Vista Controlador  Es un patrón de diseño  Esta compuesto por tres grandes capas: modelo, vista y controlador.
Capítulo 9: Detección de Errores MSc. Alexis Cabrera Mondeja.
Your Logo ING. FREDY ALEXANDER MARTINEZ. Here comes your footer  Page 2 Este patrón fue descrito por primera vez por Trygve Reenskaug en 1979, y la implementación.
¿Qué es jQuery? jQuery es una librería gratuita y open source, que simplifica la creación de páginas web altamente interactivas. Funciona.
Centro Universitario UAEM Zumpango Ingeniería en Computación Agosto 2015.
Notario electrónico Consejería de Justicia y Administración Pública Dirección General de Organización, Inspección y Calidad de los Servicios Antonio Pedro.
Estructuras de control selectivas Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión Práctica 3.
Softlogia S.R.L. Formación de Recursos Humanos Java Server Faces Instructor: Martin R. Baspineiro.
Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Práctica 4 Versión Diseño de tipos Igualdad, representación, código,
Introducción a programación web Martin Esses. En las presentaciones anteriores, vimos como enviar datos a un controlador usando POST y como generar formularios.
Transcripción de la presentación:

CURSO STRUTS 2 RESUMEN Resumen de lo visto en este quinto módulo: CONCEPTOS AVANZADOS del framework Struts 2: Debes tener los conceptos muy claros sobre: Técnicas avanzadas AJAX Anotaciones Buenas prácticas

CURSO STRUTS 2 RESUMEN TÉCNICAS AVANZADAS Exception Mapping Struts 2 permite capturar cualquier tipo de excepción utilizando los elementos de configuración <exception-mapping> y/o <global-exception-mapping>. El interceptor Exception gestiona las excepciones producidas, además almacena en el ValueStack el valor de la excepción: exception y exceptionStack <s:property value=“exception.message”/> <s:property value=“exceptionStack”/> Ejemplo <package ...> <global-results> <result name=“error”>/jsp/Error.jsp</result> <result name=“sqlError”>/jsp/SQLError.jsp</result> </global-results> <global-exception-mappings> <exception-mapping exception=“java.sql.SQLException” result=“sqlError”/> <exception-mapping exception=“java.lang.Exception” result=“error”/> </global-exception-mappings> <action ...> <result>/jsp/Menu.jsp</result> </action> </package> Comodines Mapping Mediante el comodín "*" es posible reducir la configuración de los Actions. Los valores del comodín se obtienen mediante las sintaxis {1}, {2},...{n}; {0} representa la URL. Ejemplo <package name=“comodinMapping” namespace=“/comodin” extends=“struts-default”> <action name=“*_*” class=“ejercicio.capitulo5.{1}” method=“{2}”> <result>/jsp/{1}.jsp</result> </action> </package> Invocación de métodos dinámicamente Mediante la anotación bang, "!", permite invocar a métodos dinámicamente. La URI /Usuario!login.action invocará al método login() del Action. CURSO STRUTS 2 RESUMEN Problemas Doble Submit en Formularios Struts 2 dispone de herramientas para prevenir los errores de “doble submits” en los formularios Web, utilizando para ello la técnica del token único. Para activar el sistema que evita problemas duplicación de envíos es necesario una combinación dos componentes del framework: Configurar Interceptor token o tokenSession para la petición del formulario <package …> <interceptor-ref name="defaultStack"/> <interceptor-ref name=“token"/> <action..></action> </package> Definir el tag <s:token/> dentro del formulario Web. <s:form …> <s:token/> </s:form> TÉCNICAS AVANZADAS Algunas de las técnicas avanzadas estudiados durante el presente módulo son: Navegación Excepciones Doble Submit File Upload Struts 2 facilita la tarea de subir archivos a la aplicación, utilizando para ello el Interceptor fileUpload. Las condiciones que se deben cumplir para poder subir archivos desde un formulario Web a la aplicación son: Definir la encriptación el formulario Web como "multipart/form-data": <s:form action=“multipleUpload” enctype=“multipart/form-data”> <s:file name=“upload” label=“File Upload”/> ... <s:submit /> </s:form> Configuración los atributos Action para capturar el datos del archivo subido: stream datos, nombre archivo y el tipo de contenido (contentType), cada uno de ellos debe seguir el siguiente patrón de nombre: [nombreAtributo]File, [nombreAtributo]FileName y [nombreAtributo]ContentType. public class FileUploadAction extends ActionSupport { private uploadFile; private uploadFileName; private uploadContentType; //para el caso de varios archivos subidos, se puede recoger en un array o List private uploadFile[]; private uploadFileName[]; private uploadContentType[]; } Medidor de Progreso Struts 2 cuenta con el Interceptor execAndWait, para facilitar la tarea de emular una barra de progreso en la interfaz del usuario mientras se ejecuta en el servidor la lógica de negocio pesada. Para activarlo sólo es necesario definir el interceptor execAndWait para la ejecución de un Action <action ...> <interceptor-ref name="completeStack"/> <interceptor-ref name="execAndWait"/> <result name="wait">/jsp/wait.jsp</result> <result name="success">/jsp/success.jsp</result> </action> File Upload File Download Medidor Progreso File Download Struts 2 cuenta con herramientas para facilitar la descarga de archivos desde la aplicación, permitiendo configurarlo mediante directivas XML, o bien, utilizando mecanismos de programación. Para poder descargar el contenido de un archivo, hay que seguir los siguientes pasos: Utilizar el tipo de Result "stream" para la ejecución del Action, y establecer sus valores de configuración. <action name="..." class="..."> <result name="success" type="stream"> <param name="contentType">image/jpeg</param> <param name="contentDisposition">attachment;filename=“${nombre}.jpg"</param> <param name="allowCaching">false</param> </result> </action> Definir en el interfaz un enlace o entrada para invocar al Action que envía el stream de descarga. <s:a href=“/fileDownload.action”>Descarga archivo</s:a>

CURSO STRUTS 2 RESUMEN AJAX Plug-in AJAX Results Plug-in AJAX ¿Qué es AJAX? AJAX, acrónimo de Asynchronous JavaScript And XML (JavaScript asíncrono y XML), es una técnica de desarrollo web para crear aplicaciones interactivas o RIA (Rich Internet Applications), que permite realizar comunicaciones asíncronas con el servidor en segundo plano, de esta forma, es posible realizar cambios sobre las páginas sin necesidad de recargarlas completamente, lo que significa aumentar la interactividad, velocidad y usabilidad en las aplicaciones Web. Results Existen distintos tipos de Results que permite gestionar respuestas AJAX: stream, almacenando aquellos valores a enviar al navegador en un inputStream, para mostrarlos en la Vista. public class ListaProvinciasAjaxAction extends ActionSupport { private InputStream inputStream; public String execute() throws Exception { Provincia provincias[] = logicaPronvica.getListaProvincias(comunidad); inputStream = new StringBufferInputStream(provincias.toString()); return SUCCESS; } .... dispatcher, redirigir la salida a un recurso: JSP, Velocity o FreeMarker, que no implemente una página HTML completa sino simplemente desarrolle al estructura HTML que se desee mostrar en la Vista. <%@ taglib prexif=”s” uri=”/struts-tags”%> <table> <s:iterator value="provincias"> <tr><td><s:property value="nombre"/></td><td> </s:iterator> </table> plug-in, como puede ser el plug-in JSON, permite devolver una respuesta AJAX en formato JSON de los valores de los atributos del Action. <package name=”ajax” namespace=”/ajax” extends=”json-default”> <action name="lista-provincias" class="ejericio.capitulo5.ListaProvinciasAjaxAction"> <result type=”json”> <param name="includeProperties"> ^entries\[\d+\]\.provincias </param> </result> </action> </package> CURSO STRUTS 2 RESUMEN Plug-in AJAX Mediante el uso de plug-in Struts 2 dispone de sistemas para gestionar peticiones y respuestas AJAX. Existen distintos tipos de plug-in: - plug-in Result AJAX, gestionan las respuestas mediante Results, como pueden ser: plug-in JSON o plug-in Another JSON Result Type. <package name="ajax" namespace=”/ajax” extends="struts-default"> <result-types> <result-type name="json" default="true" class="code.google.struts2jsonresult.JSONResult"> <param name="prettyPrint">true</param> </result-type> </result-types> <action name="lista-provincias" class="ejericio.capitulo5.ListaProvinciasAjaxAction"> <result> <param name="target">listaProvincias</param> <param name="patterns"> -*.class, -gradeArticle</param> </result> </action> </package> - plug-in taglibs AJAX, añaden nuevas librerías de tags para utilizarlas en los JSPs, algunos de estos son: plug-in Dojo, plug-in jQuery, plug-in YUI, plug-in Ajax Parts, ... <%@ taglib prefix="s" uri="/struts-tags"%> <%@ taglib prefix="sj" uri="/struts-jquery-tags"%> <html> <head> <sj:head/> </head> <body> <div id="div1">Div 1</div> <s:url id="ajaxTest" value="/AjaxTest.action"/> <sj:a id="link1" href="%{ajaxTest}" target="div1"> Update Content </sj:a> </body> </html> - plug-in AJAX integran con otros frameworks AJAX, pudiendo disponer desde nuevos tipos Results a nuevas taglibs, algunos de ellos son: plug-in AJAX File Upload, plug-in GWT, plug-in DWR, plug-in LightBoxJs,... <dwr> <allow> <create creator="new" javascript="validator" class="org.apache.struts2.validators.DWRValidator"/> <convert converter="bean" match="com.opensymphony.xwork2.ValidationAwareSupport"/> </allow> </dwr> AJAX Durante el presente módulo hemos visto cómo Struts 2 ofrece soluciones AJAX, debemos tener claro los siguientes conceptos: ¿Qué es AJAX? Soluciones AJAX en Struts 2 Results Plug-in AJAX Plug-in Dojo Plug-in Dojo El plug-in Dojo es el sistema por defecto AJAX, adoptado por Struts 2. Este plug-in integrar el framework JavaScript Dojo en las apliaciones Struts 2 mediante unas nuevas taglibs AJAX. Los pasos necesarios para utilizarlo son: Copiar la librería struts2-dojo-plugin-VERSION.jar en el directorio /WEB-INF/lib de la aplicación Web. Añadir al principio de los JSPs la siguiente directiva para poder utilizar los tags de Struts2-Dojo plug-in: <%@ taglib prefix=“sx” uri=“/struts-dojo-tags” %> Definir el tag head en cada JSP que utilice las tags AJAX. <sx:head/> Los tags que se encuentran en el Struts2-Dojo plug-in son los siguientes. head div a submit bind datetimepicker tabbedpanel textarea autocompleter tree treenode

CURSO STRUTS 2 RESUMEN ANOTACIONES ¿Qué son las Anotaciones? Action Una Anotación Java es una forma de añadir metadatos al código fuente que están disponibles para la aplicación en tiempo de ejecución, se suele utilizar como una a la tecnología XML. Las Anotaciones se pueden añadirse a los elementos de programa tales como clases, métodos, campos, parámetros, variables locales, y paquetes. Tipos de Anotaciones Action Las Anotaciones Action definen la configuración del propio Action donde están definidas. Existen dos versiones distintas de Anotaciones Action, en función del plug-in que se utilice: Plug-in Codebehind, dispone de Anotaciones básicas a nivel de clase, permitiendo sólo mapear un URL para una clase Action. @Namespace @ParentPackage @Result @Results Ejemplo @Results({ @Result(name=“OK”, value=“/jsp/Menu.jsp”, type=“ServletDispatcherResult.class”), @Result(name=“FALLO”, value=“/jsp/Error.jsp”, type=“ServletDispatcherResult.class”) }) public class Login extends ActionSupport { ... } Plug-in Convention, evolución del plug-in Codebehind, permite dar una solución completa a la configuración de los Actions sin utilizar ningún archivo de configuración XML. @Action @Actions @ExceptionMapping @ExceptionMappings @InterceptorRef @InterceptorRefs @Namespaces @ResultPath public class TestAnnotation extends ActionSupport { @Actions({ @Action(“/uno/url”), @Action(value=“/dos/url”, params={“login-obligatorio”,”false”}), @Action(“/tres/url”), public String execute() { return SUCCESS; Tipos de Anotaciones Validación Campos El framework Validation de Struts 2, heredado de XWork, cuenta con Anotaciones para todas sus validaciones, lo que nos permite utilizarlo directamente en los Action para definir las reglas de validación de los campos. Para utilizar cualquiera de las Anotaciones de Validation es necesario definir al nivel de clase la Anotación @Validation, el resto de Anotaciones trabajan a nivel método. Lista de Anotaciones Validation @Validation Annotation @ConversionErrorFieldValidator Annotation @DateRangeFieldValidator Annotation @DoubleRangeFieldValidator Annotation @EmailValidator Annotation @ExpressionValidator Annotation @FieldExpressionValidator Annotation @IntRangeFieldValidator Annotation @RegexFieldValidator Annotation @RequiredFieldValidator Annotation @RequiredStringValidator Annotation @StringLengthFieldValidator Annotation @UrlValidator Annotation @VisitorFieldValidator Annotation @CustomValidator Annotation @Validations Annotation Ejemplo @Validation public class AnnotationValidatorAction extends ActionSupport { ...   @DoubleRangeFieldValidator(message = “El porcentaje está fuera de rango “, key = “porcentaje.error.rango”, shortCircuit = true, minInclusive = “0.0”, maxInclusive = “100.0”) public void setPorcentaje(Double porcentaje) { this.porcentaje = porcentaje; } @ConversionErrorFieldValidator(message = “El formato del sueldo no es válido”, key = “sueldo.validator”, shortCircuit = true) public void setSueldo(Double sueldo) { this.sueldo = sueldo; CURSO STRUTS 2 RESUMEN ANOTACIONES Las Anotaciones en Struts 2 simplifican el proceso de configuración de aplicaciones Web Java con Struts 2. Debemos recordar los siguientes conceptos de las Anotaciones en Struts 2: ¿Qué son las Anotaciones? Tipos de Anotaciones en Struts 2 Action Interceptor Workflow Conversión Validación Tipos de Anotaciones Workflow El Interceptor Workflow dispone de una Anotación propia para gestionar el flujo de navegación en caso de error de validación. <action ...> <interceptor-ref name="annotationWorkflow"/> ... </action> La lista de las Anotaciones de tipo Workflow son: @InputConfig Annotation Ejemplo public class AnnotationWorkflowAction extends ActionSupport {   @InputConfig(methodName="input") public String execute() { return SUCCESS; } public String input() { return INPUT; Tipos de Anotaciones Interceptor Las Anotaciones Interceptor se invocan gracias al Interceptor AnnotationWorkflow, el cual se encarga de lanzar aquellos métodos de los Action que tengan definida una Anotación de tipo Interceptor. <action ...> <interceptor-ref name=“annotationWorkflow”/> ... </action> Las Anotaciones de tipo Interceptor son: @After Annotation @Before Annotation @BeforeResult Annotation Ejemplo public class InterceptorAnnotationAction extends ActionSupport {   @Before public void isAutorizado() throws ValidationException { } @After public void isValid() throws ValidationException { Tipos de Anotaciones Conversión de Tipos Utilizando las Anotaciones de Conversión de Tipos se evita el uso de los archivos de configuración de conversión de tipos, ClassName-conversion.properties. Para utilizar cualquiera de las Anotaciones de Conversión de Tipos es necesario definir al nivel de clase la Anotación @Conversion, el resto de Anotaciones trabajan a nivel de atributo y método. Lista de Anotaciones de Conversión de Tipos @Conversion Annotation @CreateIfNull Annotation @Element Annotation @Key Annotation @KeyProperty Annotation @TypeConversion Annotation Ejemplo @Conversion public class AnnotationConversionAction extends ActionSupport {   @Element(value = ejercicio.capitulo5.Usuario ) private List<Usuario> listaUsuarios; private Map<String, Usuario> mapUsuarios; ... }

CURSO STRUTS 2 RESUMEN BUENAS PRÁCTICAS Seguridad en Struts 2 La seguridad en las aplicaciones Web es uno de los puntos críticos más importantes. Existen dos formas de gestionar la seguridad: utilizando directivas de configuración en el archivo descriptor de despliegue, web.xml: <web-app> ... <security-constraint> <web-resource-collection> <web-resource-name>Área Manager</web-resource-name> <url-pattern>/manager/*.action</url-pattern> </web-resource-collection> <auth-constraint> <role-name>manager</role-name> </auth-constraint> </security-constraint> <security-role> <role-name>admin</role-name> </security-role> </web-app> configurando el Interceptor roles de Struts 2: <package name=“capitulo5-secure” extends=“struts-default”> <action name=“Usuario”> <interceptor-ref name=“completeStack”/> <interceptor-ref name=“roles”> <param name=“allowedRoles”>admin,manager</param> </interceptor-ref> <result>/jsp/Usuario.jsp</result> </action> </package> mediante programación en código Java: public class SecurityAction extends ActionSupport { public void validate() { if (!isUserRegister()) { .... } Profiling en Struts 2 Struts 2 dispone de dos Interceptor como herramienta de profiling, que permite identificar los cuellos de botella de la aplicación. El Interceptor Timer, registra el tiempo que tarda en ejecutarse cada petición. <package name="timer"> <action name="test-timer"> <interceptor-ref name="timer"/> <interceptor-ref name="completeStack"/> <result name="success">/jsp/test_timer.jsp</result> </action> </package> El Interceptor Profile, registra el tiempo que tarda en ejecutarse cada petición, así como cada componente que interviene en la petición: Interceptors, Actions y Results, gracias a la clase UtilTimerStack. <package name="profile"> <interceptor-ref name="profile"/> <result name="success">/jsp/profile.jsp</result> CURSO STRUTS 2 RESUMEN Debuggin en Struts 2 Struts 2 cuenta con dos componentes que facilitan la tarea de debugging: El tag debug <%@ taglib prefix=“s” uri=“/struts-tags” %>   <s:debug/> El Interceptor debugging, para invocar al Interceptor es necesario añadir el parámetro debug=xml o debug=console en la URL que invoca a un Action. <debug> <parameters/> <context> <attr/> <report.conversion.errors>false</report.conversion.errors> <struts.actionMapping> <class>class org.apache.struts2.dispatcher.mapper.ActionMapping</class> <name>DebuggingTest</name> <namespace>/</namespace> </struts.actionMapping> </context> <request/> <session/> <valueStack> <value> <actionErrors/> <actionMessages/> ... </valueStack> </debug> BUENAS PRÁCTICAS Debes recordar distintas técnicas que se pueden aplicar al framework Struts 2 para mejorar su funcionamiento. Seguridad Testing en Struts 2 Las características de Struts 2 que facilitan la realización de test en sus componentes, Actions, Interceptors, ConversionTypes, ValidationTypes,… son Evita la dependencia del código del API Servlet. Minimizar la dependencia del código con el framework mediante el uso de interfaces. Los test se pueden realizar test de manera individual, o invocando el conjunto completo de componentes que se invocan en una petición: Actions, Interceptors, … Mediante el framework JUnit se pueden realizar distintos tipos de test de los componentes del framework: public class JUnitActionTest extends TestCase {   public void test() { .... } public class TestNGActionTest extends BaseStrutsTestCase { Debug Profile Test Rendimiento Mejoras Rendimiento Desactivar el sistema de loggin y devMode Utilizar Java Templates Utilizar las cabeceras HTTP correctas Modificar la configuración de FreeMarker Activar el cache de los templates de FreeMarker Copiar todos los templates que se sobrescriban al directorio theme No crear la sesión HTTP si no es necesario Utilizar los tags de FreeMarker mejor que los tags JSP No utilizar Interceptors si no son necesarios Copiar los contenidos estáticos de Struts 2 si se utiliza el theme AJAX