Curso J2EE (8ª semana) struts2
Aunque este fin de semana pasado ya hemos terminado el curso, a mi todavía me queda contaros por encima el contenido de algunas semanas, que espero poder liquidar pronto, aquí va la 8ª, dedicada a struts2.
Otro framework, webwork, nació como un fork de struts añadiendo nuevas ideas y funcionalidades. Allá por el 2005 se anunció la fusión de struts con webwork. En ese momento nació struts2.
El primer cambio cuando pasamos de struts a struts 2 lo encontramos en la configuración de nuestro web.xml, ahora ya no utilizamos el conocido ActionServlet, ni especificamos la ruta de nuestro fichero de configuración struts-config.xml. En struts2 lo cambiamos por un DispatcherFilter que debemos definir en web.xml y será el encargado de gestionar nuestras acciones y de selccionar los interceptores a invocar:
-
<filter>
-
<filter-name>struts2</filter-name>
-
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
-
</filter>
-
<filter-mapping>
-
<filter-name>struts2</filter-name>
-
<url-pattern>/*</url-pattern>
-
</filter-mapping>
-
</filter>
El fichero de configuración principal será struts.xml el cual podremos segmentar en tantos ficheros como deseemos para estructurar lo mejor posible nuestras acciones:
-
<include file="administracion.xml"/>
Ahora nuestras acciones extienden de ActionSupport y aunque siempre acabamos necesitándolo no tenemos que acceder a la request para obtener nuestros parámetros sino que se encarga de hacerlo struts2 mediante inyección de dependencias, ya no necesitamos ActionForm.
Results predefinidos para devolver el estado de una accion, ERRORS, SUCESS,...
Tenemos una serie de interceptores predefinidos (validaciones, login, logger, etc) y podemos definir nuestros propios interceptores, deben extender de AbstractInterceptor y ser declarados en el fichero principal struts.xml.
-
<interceptors>
-
<interceptor name="login" class="net.jsanroman.interceptors.LoginInterceptor"/>
-
<interceptor name="logger" class="net.jsanroman.interceptors.LogInterceptor"/>
-
<interceptor-stack name="comun">
-
<interceptor-ref name="login"></interceptor-ref>
-
<interceptor-ref name="logger"></interceptor-ref>
-
<interceptor-ref name="validation"></interceptor-ref>
-
</interceptor-stack>
-
</interceptors>
y los asignamos a una acción, podemos asignar un stack o conjunto de interceptores directamente:
-
<action name="doLogin" class="net.jsanroman.security.controller.LoginAction">
-
<interceptor-ref name="comun"></interceptor-ref>
-
<result name="input">/login/login.jsp</result>
-
<result name="error">/login/login.jsp</result>
-
<result>/login/login_ok.jsp</result>
-
</action>
Añadido concepto de packages y namespace en la definición de acciones en nuestro xml para agrupar acciones:
-
<package name="facturas" namespace="/facturas" extends="struts-default">
-
<action name="Pagar" class="net.jsanroman.security.controller.factura.PagarFacturaAction">
-
<result>/facturas/factura.jsp</result>
-
</action>
-
<action name="Cargar" class="net.jsanroman.common.controller.CargarFacturaAction">
-
<result name="error">/facturas/error.jsp</result>
-
<result>/facturas/factura.jsp</result>
-
</action>
-
</package>
Nuevos tags para renderizar diferentes elementos html:
-
<%@ taglib prefix="s" uri="/WEB-INF/struts-tags.tld" %>
-
<s:form action="guardar" method="post">
-
<s:textfield label="Fecha" name="fecha" />
-
<s:textarea label="Concepto" name="concepto" rows="6" cols="35" />
-
<s:textfield label="Importe" name="importe" />
-
<s:submit value="Guardar"/>
-
</s:form>
-
</body>
-
</html>
Validaciones declarativas en xml, uno por acción, PagarFacturaAction-validation.xml
-
<validators>
-
<field name="importe">
-
<field-validator type="requiredstring">
-
<param name="trim">true</param>
-
<message>Importe factura obligatorio</message>
-
</field-validator>
-
</field>
-
</validators>
o mediante anotaciones:
-
@Validation
-
public class Factura {
-
private float importe;
-
@RequiredStringValidator(message="Importe factura obligatorio", key="validation.fieldRequeried")
-
return importe;
-
}
-
...
Como veis muchos cambios, y muchos mas que nos quedan por descubrir.
http://www.infoq.com/minibooks/starting-struts2
http://struts.apache.org/2.x/














