tel./fax: +34 91 675 33 06
[email protected] - www.autentia.com
Somos su empresa de Soporte a Desarrollo Informático.
Ese apoyo que siempre quiso tener...
1. Desarrollo de componentes y
proyectos a medida
Tecnología Desarrollo SistemasGran Empresa
Producción
autentia Certificación o Pruebas Verificación previaRFP
Concurso
Consultora 1
Consultora 2
Consultora 3
Equipo propio desarrollo
Piloto
3a
3b
1. Definición de frameworks corporativos.
2. Transferencia de conocimiento de nuevas arquitecturas.
3. Soporte al arranque de proyectos.
4. Auditoría preventiva periódica de calidad.
5. Revisión previa a la certificación de proyectos.
6. Extensión de capacidad de equipos de calidad.
7. Identificación de problemas en producción.
3. Arranque de proyectos basados en nuevas
tecnologías
¿Qué ofrece Autentia Real
Business Solutions S.L?
Gestor portales (Liferay)
Gestor de contenidos (Alfresco)
Aplicaciones híbridas
Tareas programadas (Quartz)
Gestor documental (Alfresco)
Inversión de control (Spring)
BPM (jBPM o Bonita)
Generación de informes (JasperReport)
ESB (Open ESB)
Control de autenticación y
acceso (Spring Security)
UDDI
Web Services
Rest Services
Social SSO
SSO (Cas)
Spring MVC, JSF-PrimeFaces /RichFaces,
HTML5, CSS3, JavaScript-jQuery
JPA-Hibernate, MyBatis
Motor de búsqueda empresarial (Solr)
ETL (Talend)
Dirección de Proyectos Informáticos.
Metodologías ágiles
Patrones de diseño
TDD
2. Auditoría de código y recomendaciones de mejora
Home | Quienes Somos | Empleo | Tutoriales | Contacte
Lanzado
TNTConcept versión 0.6
( 12/07/2007)Desde Autentia ponemos a vuestra disposición el software que hemos construido (100% gratuito y sin restricciones funcionales) para nuestra gestión interna, llamado TNTConcept (auTeNTia).
Construida con las últimas tecnologías de desarrollo Java/J2EE (Spring, JSF, Acegi, Hibernate, Maven, Subversion, etc.) y disponible en licencia GPL, seguro que a muchos profesionales independientes y PYMES os ayudará a organizar mejor vuestra operativa.
Las cosas grandes empiezan siendo algo pequeño ... Saber más en:
http://tntconcept.sourceforge.net/
Tutorial desarrollado por: Javier Antoniucci
Puedes encontrarme en Autentia
Somos expertos en Java/J2EE Contacta en: NUEVO CATÁLOGO DE SERVICIOS DE AUTENTIA (PDF 6,2MB) www.adictosaltrabajo.com es el Web de difusión de conocimiento de www.autentia.com Catálogo de cursos
Descargar este documento en formato PDF mbasicoSpringWebFlow.pdf
Firma en nuestro libro de Visitas <---> Asociarme al grupo AdictosAlTrabajo en eConozco
Fecha de creación del tutorial: 2007-11-26
Manual Básico de Spring WebFlow
Spring WebFlow es un Controlador (http://es.wikipedia.org/wiki/Modelo_Vista_Controlador) que orienta a procesos los flujos de navegación de una aplicación definiéndolos mediante estados y transiciones.
A medida que aplicamos Spring WebFlow a nuestros proyectos, nos acostumbramos a sus virtudes y un día nos damos cuenta de que no podríamos volver a trabajar como antes. Más o menos como nos pasó cuando descubrimos Struts o cualquier MVC. Y cuando más avanzamos, más queremos y Spring es casi inagotable.
El objetivo de este tutorial es facilitar el primer contacto con esta tecnología y analizar su aplicabilidad, recomendar algunos links y comentaros nuestras conclusiones.
Preparación del proyecto
Comenzaremos creando un proyecto y para este tutorial utilizaremos Eclipse:
Seleccionamos proyecto web:
Programadores Java Un empleo de Informático te espera aquí, ofertas por Tecnologías
www.informaticos.com
cursos java
Aprende de una forma fácil y rápida Elige tu curso y ¡Especialízate!
www.Solocursos.net/Cursos
Juegos Java Gratuitos Divertidos Juegos Java en Regalo iDate Prisa! Los Juegos son por 0 €
www.JuegoJavaGratis.Dindo.es
Alojamiento Web - 7,90€ 1GB Web, 20GB Transferencia, PHP4/5, ASP .NET, MySQL, SQL Server
Seleccionamos un nombre y un servidor:
Y completamos los nombres de las carpetas antes de dar a Finalizar:
Copiamos en la carpeta /pruebaWebFlowSimple/web/WEB-INF/lib los JAR los jar que se encuentran en los zip que descargamos y los añadimos al proyecto:
Configuración del contexto
Comenzaremos editando /pruebaWebFlowSimple/web/WEB-INF/web.xml para dejarlo como se muestra a continuación:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
<context-param>
<param-name>webAppRootKey</param-name> <param-value>swf-pruebaWebFlow.root</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet>
<servlet-name>JspRedirector</servlet-name> <jsp-file>/WEB-INF/test/jspRedirector.jsp</jsp-file> </servlet>
<servlet>
<servlet-name>pruebaWebFlow</servlet-name> <servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class> <init-param>
<param-name>contextConfigLocation</param-name> <param-value>
/WEB-INF/pruebaWebFlow-servlet-config.xml
</param-value> </init-param>
</servlet>
<servlet-mapping>
<servlet-name>JspRedirector</servlet-name> <url-pattern>/JspRedirector</url-pattern> </servlet-mapping>
<servlet-mapping>
<servlet-name>pruebaWebFlow</servlet-name> <url-pattern>*.do</url-pattern>
</servlet-mapping>
<jsp-config> <taglib>
<taglib-uri>http://www.adesis.com/cm/oi/2</taglib-uri>
<taglib-location>/WEB-INF/tld/adesis-cm-io-2.tld</taglib-location> </taglib>
</jsp-config> <welcome-file-list>
<welcome-file>index.jsp</welcome-file> </welcome-file-list>
</web-app>
También crearemos un fichero /pruebaWebFlowSimple/web/WEB-INF/pruebaWebFlowSimple-servlet-config.xml como se muestra a continuación:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:flow="http://www.springframework.org/schema/webflow-config" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/webflow-config http://www.springframework.org/schema/webflow-config/spring-webflow-config-1.0.xsd">
<bean name="/asistente.flow"
class="org.springframework.webflow.executor.mvc.FlowController"> <property name="flowExecutor" ref="pruebaFlowExecutor" /> <property name="defaultFlowId" value="asistente-flow" /> <property name="cacheSeconds" value="5" />
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" /> </bean>
<flow:registry id="flowRegistry">
<flow:location path="/WEB-INF/flows/**-flow.xml" /> </flow:registry>
<flow:executor id="pruebaFlowExecutor" registry-ref="flowRegistry"> <flow:execution-attributes>
<flow:alwaysRedirectOnPause value="false" /> </flow:execution-attributes>
</flow:executor>
</beans>
Definición del flujo
Creamos un fichero /pruebaWebFlowSimple/web/WEB-INF/flows/asistente-flow.xml como se muestra a continuación:
<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow-1.0.xsd">
<start-actions>
<action bean="formAction" method="setupForm" /> </start-actions>
<start-state idref="mostrarPaso1" />
<view-state id="mostrarPaso1" view="paso1"> <transition on="siguiente" to="avanzaAPaso2"> <action bean="formAction" method="bind" /> </transition>
</view-state>
<action-state id="avanzaAPaso2">
<action bean="formAction" method="validarPaso1YPrepararPaso2" /> <transition on="success" to="mostrarPaso2" />
<transition on="error" to="mostrarPaso1" /> </action-state>
<view-state id="mostrarPaso2" view="paso2"> <transition on="siguiente" to="avanzaAPaso3"> <action bean="formAction" method="bind" /> </transition>
<transition on="anterior" to="mostrarPaso1"> <action bean="formAction" method="bind" /> </transition>
</view-state>
<action-state id="avanzaAPaso3">
<action bean="formAction" method="validarPaso2YPrepararPaso3" /> <transition on="success" to="mostrarPaso3" />
<transition on="error" to="mostrarPaso2" /> </action-state>
<end-state id="mostrarPaso3" view="paso3" />
<import resource="asistente-beans.xml" />
</flow>
Vemos cómo el flujo queda determinado por estados desde donde se realizan transiciones a otros estados. Los estados pueden ser de visualización o de ejecución de operaciones, y utilizan beans definidos en asistente-beans.xml:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="formAction" class="es.autentia.tutoriales.manualBasicoSpringWebFlow.controller.action.AsistenteAction"> <property name="formObjectScope" value="FLOW" />
<property name="formObjectName" value="form" /> <property name="formObjectClass"
value="es.autentia.tutoriales.manualBasicoSpringWebFlow.controller.form.AsistenteForm" /> </bean>
</beans>
Definición de las clases
En el flujo se define el bean donde se implementarán las acciones y el form que es un JavaBean donde se almacenan o recuperan los datos que se le muestran al usuario y/o que éste completa. Cuando en asistente-flow.xml se invoca al método bind en una transición, se está indicando a Spring que realice la copia de los valores de formulario enviados desde el navegador del usuario al formulario del flujo.
package es.autentia.tutoriales.manualBasicoSpringWebFlow.controller.form;
import java.io.Serializable;
publicclass AsistenteForm implements Serializable {
privatestaticfinallongserialVersionUID = 3849222383843518624L;
private Integer numero1 = 1;
private String mensaje;
public String getMensaje() {
returnmensaje; }
publicvoid setMensaje(String mensaje) {
this.mensaje = mensaje; }
public Integer getNumero1() {
returnnumero1; }
publicvoid setNumero1(Integer numero1) {
this.numero1 = numero1; }
public Integer getNumero2() {
returnnumero2; }
publicvoid setNumero2(Integer numero2) {
this.numero2 = numero2; }
}
Crearemos también un Action como el siguiente:
package es.autentia.tutoriales.manualBasicoSpringWebFlow.controller.action;
import org.springframework.webflow.execution.RequestContext;
import org.springframework.webflow.action.FormAction;
import org.springframework.webflow.execution.Event;
import es.autentia.tutoriales.manualBasicoSpringWebFlow.controller.form.AsistenteForm;
publicclass AsistenteAction extends FormAction {
public AsistenteAction() {
setFormObjectClass(AsistenteForm.class); }
@Override
public Event setupForm(RequestContext context) throws Exception { AsistenteForm form = (AsistenteForm) getFormObject(context); form.setNumero1(1);
form.setNumero2(2);
form.setMensaje("Introduzca los números a sumar");
returnsuper.setupForm(context); }
public Event validarPaso1YPrepararPaso2(RequestContext context)
throws Exception {
AsistenteForm form = (AsistenteForm) getFormObject(context); Event resultado = null;
if (form.getNumero1() < 0 || form.getNumero2() < 0) { form.setMensaje("Los números a sumar deben ser positivos"); resultado = error();
} else {
form.setMensaje("El resultado de la suma es "
+ (form.getNumero1() + form.getNumero2())); resultado = success();
}
return resultado; }
public Event validarPaso2YPrepararPaso3(RequestContext context)
throws Exception {
AsistenteForm form = (AsistenteForm) getFormObject(context); form.setMensaje("Fin de la operación");
return success(); }
}
En el mismo vemos que es muy simple acceder a los datos que se le muestran o que introduce el usuario con la ayuda del form indicado en la configuración.
Definición de las páginas
Las páginas son muy simples. En /pruebaWebFlowSimple/web/WEB-INF/jsp/paso1.jsp vemos:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head>
<title>Asistente sumador</title> </head>
<body>
<h1>Asistente sumador: Paso 1</h1> <form>
<input type="hidden" name="_flowId" value="asistente-flow" /> <input type="hidden" name="_eventId" value="siguiente" />
<input type="hidden" name="_flowExecutionKey" value="${flowExecutionKey}" /> <p>${form.mensaje}</p>
<p>Primer número: <input type="text" name="numero1" value="${form.numero1}"/></p> <p>Segundo número: <input type="text" name="numero2" value="${form.numero2}"/></p> <input type="submit" value="siguiente" />
</form> </body> </html>
Donde en los campos del formulario se indican el identificador de flujo, de evento y la clave de ejecución que utiliza WebFlow para mantener el estado de un usuario. En /pruebaWebFlowSimple/web/WEB-INF/jsp/paso2.jsp ponemos:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head>
<title>Asistente sumador</title> </head>
<body>
<h1>Asistente sumador: Paso 2</h1> <form>
<input type="hidden" name="_flowId" value="asistente-flow" /> <input type="hidden" name="_eventId" value="siguiente" />
<input type="hidden" name="_flowExecutionKey" value="${flowExecutionKey}" /> <p>${form.mensaje}</p>
<input type="submit" value="siguiente" />
<input type="submit" value="anterior" onclick="document.forms[0]._eventId.value='anterior';return true;"/> </form>
</body> </html>
Y en /pruebaWebFlowSimple/web/WEB-INF/jsp/paso3.jsp:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head>
<title>Asistente sumador</title> </head>
<body>
<h1>Asistente sumador: Paso 3</h1> <form> <p>${form.mensaje}</p> </form> </body> </html>
Ejecutando la aplicación
Lanzamos el servidor con la URL http://localhost:8080/pruebaWebFlowSimple/asistente.flow y veremos en funcionamiento el ejemplo del asistente sumador.
Una mejora que podemos implementar es utilizar el envío del formulario mediante Post, para conservar limpia la url del navegador del usuario.
Algunos links interesantes
Sitio oficial de Spring, http://www.springframework.org/webflow
Documentación oficial de Referencia , http://static.springframework.org/spring-webflow/docs/1.0.x/reference/index.html
Conclusiones
Tras utilizarlo en proyectos de envergadura concluimos que:
El Spring WebFlow es un Controlador que orienta a procesos el flujo de navegación, que no se debe confundir con un BPM (Ver http://en.wikipedia.org/wiki/Business_process_management) ya que el proceso de negocio puede diferir con la navegación de su interfaz de usuario, los BPM son independientes de las tecnologías de interfaz de usuario y muchos etcéteras..
Lo vemos especialmente útil en aplicaciones con flujos de mediana a gran complejidad cuyo mantenimiento sea relativamente periódico.
Permite generar documentación actualizada del flujo de navegación mediante una simple XSD. Puede convivir con otros MVC como el Spring MVC o Struts.
Securiza la ejecución de flujos, evitnado re-call y ataques deny-of-service o cross-site-scripting.
Desde Autentia contamos con los conocimientos y experiencia para ayudarle a sacar la máxima ventaja de las tecnologías más innovadoras y mejorar la calidad de sus desarrollos software.
No dude en contactarse con nosotros mediante www.autentia.com .
This work is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 2.5 License.
Puedes opinar sobre este tutorial aquí
Recuerda
que el personal de Autentia te regala la mayoría del conocimiento aquí compartido (Ver todos los tutoriales) ¿Nos vas a tener en cuenta cuando necesites consultoría o formación en tu empresa?
¿Vas a ser tan generoso con nosotros como lo tratamos de ser con vosotros? [email protected]
Somos pocos, somos buenos, estamos motivados y nos gusta lo que hacemos ...
Autentia = Soporte a Desarrollo & Formación
Autentia S.L. Somos expertos en:
J2EE, Struts, JSF, C++, OOP, UML, UP, Patrones de diseño ..
y muchas otras cosas
Nuevo servicio de notificaciones
Si deseas que te enviemos un correo electrónico cuando introduzcamos nuevos tutoriales, inserta tu dirección de correo en el siguiente formulario.
Subscribirse a Novedades
Otros Tutoriales Recomendados (
También ver todos)
Nombre Corto Descripción
conocimiento.
Los contenidos y comentarios de los tutoriales son responsabilidad de sus respectivos autores.
En algún caso se puede hacer referencia a marcas o nombres cuya propiedad y derechos es de sus respectivos dueños. Si algún afectado desea que incorporemos alguna reseña específica, no tiene más que solicitarlo.
Si alguien encuentra algún problema con la información publicada en este Web, rogamos que informe al administrador [email protected] para su resolución.
Patrocinados por enredados.com .... Hosting en Castellano con soporte Java/J2EE