3ra. Reunión de SpringHispano
How to run Spring MVC por neodevelop
Acerca de mi...
La referencia total: SpringHispano.org y grails.org.mx
Agenda
Vista general de SpringFramework El patrón de diseño MVC Spring MVC
Componentes Funcionamiento Configurar una Aplicación con Spring MVC
Más componentes de Spring MVC Más de Spring MVC...
SpringFramework
“Spring es una tecnología dedicada para permitir construir aplicaciones usando
POJO’s…”, Rod Johnson – The Server Side
SpringFramework
Spring es un poderoso framework de aplicaciones que resuelve muchos
problemas comunes en el desarrollo de aplicaciones Java (SDK y EE).
Vista general de SpringFramework
El patrón de diseño MVC
MVC = Model – View – Controller Provee de un mecanismo para construir
una delgada y limpia capa web Claramente separa el negocio, la
navegación y la lógica de presentación
El patrón de diseño MVC
Los tres componentes que colaboran son: Controller(Controlador)
Maneja la lógica de navegación e interactua con la capa de servicio para la lógica de negocio
Model(Modelo) El contrato entre el controller y la vista Contiene los datos necesarios para mostrarlos en
la vista Es manejado y poblado por el controller
View(Vista) Muestra la respuesta a la solicitud previamente
hecha Obtiene los datos del modelo previamente
manejado por el controller
El patrón de diseño MVC
Motivaciones
Facilita la carga de mantenimiento Los cambios a la lógica de negocio son
menos probables de romper la lógica de la presentación
Viceversa
Motivaciones
Facilita el desarrollo en un equipo multidisciplinario Los desarrolladores pueden concentrarse en
en crear código de negocio robusto sin tener que preocuparse por afectar la Interfaz de Usuario
Los diseñadores pueden concentrarse en construir usables y atractivas Interfaces de Usuario sin preocuparse por Java
Motivaciones
Usa la mejor herramienta para tu trabajo Java es apropiado para crear lógica de
negocio Los lenguajes de plantillas y etiquetado son
más apropiados para crear layouts HTML.
Motivaciones
Facilita las pruebas La lógica de navegación y de negocio están
separadas de la lógica de presentación lo que sugiere que pueden ser probadas independiemtemente.
Practicamente: podemos probar más código fuera del contendor de servlets
Spring MVC
Spring provee de una solución simple y eficaz para usar el patrón MVC
Y ahora con la versión 2.5 ofrece también el uso de anotaciones
Hay quienes dicen que es un framework de la ola anterior...
¿será cierto?, ya veremos ahora que SS esta dentro del JCP
MVC en Spring
Un solo servlet que maneja solicitudes a controllers individuales, con ayuda de un controller principal.
El ruteo de solicitudes es completamente controlado por el Controller Frontal o principal. Controllers individuales pueden ser usados ara
manejar varias y diferentes URL's Los controllers son POJO's Y los controllers son manejados como cualquier
otro bean de Spring en el AppCtx
Componentes de Spring MVC DispatcherServlet
La implementación del controller frontal de Spring
Controller Componente que maneja los request del usuario Encapsula la lógica de navegación Delega a los objetos de los servicios la lógica de
negocio View
Responsable para mostrar la salida, sea cual sea...
Componentes de Spring MVC ModelAndView
Creado por el controller Almacena los datos del Modelo Asocia una vista al Request
Puede ser la implementación de una vista física o el nombre de una vista lógica
ViewResolver Usado para mapear nombres de vistas lógicas
a implementaciones de vista actuales
Componentes de Spring MVC HandlerMapping
Interface usada por el DispatcherServlet para mapear los request entrantes hacia los controllers individuales
Funcionamiento de Spring MVC
MVC y D.I.
Todos los componentes MVC son configurados en el AppCtx de Spring
Y como tal, todos los componentes de Spring se benefician y pueden ser configurados usando D.I.
Configurar una App con Spring MVC
Spring MVC - Spring MVC - DispatcherServletDispatcherServlet Como muchos framework’s MVC, tambien Como muchos framework’s MVC, tambien
SpringMVC es Request Driven(Manejado por SpringMVC es Request Driven(Manejado por Solicitudes)Solicitudes)
DispatcherServlet.- Es el servlet central que DispatcherServlet.- Es el servlet central que atiende todas esta solicitudes y las gestionaatiende todas esta solicitudes y las gestiona
Ofrece mucha más funcionalidad para facilitar Ofrece mucha más funcionalidad para facilitar el desarrolloel desarrollo
Esta completamente integrado con el Esta completamente integrado con el contenedor de Spring, con todo lo que esto contenedor de Spring, con todo lo que esto implicaimplica
Spring MVC - Spring MVC - DispatcherServletDispatcherServlet
<servlet><servlet-name>springhispanoServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet>
<servlet-mapping><servlet-name>springhispanoServlet</servlet-name><url-pattern>*.html</url-pattern></servlet-mapping>
WebApplicationContextWebApplicationContext
Cada DispatcherServlet tiene su propio Cada DispatcherServlet tiene su propio ApplicationContext, a este se le denomina ApplicationContext, a este se le denomina WebApplicationContextWebApplicationContext
El WebAppCtx va a contener la El WebAppCtx va a contener la configuración de los elementos para que configuración de los elementos para que SpringMVC funcioneSpringMVC funcione
El WebAppCtx va a poder usar los El WebAppCtx va a poder usar los beans(DAO’s, Servicios, etc.) que se beans(DAO’s, Servicios, etc.) que se declararon en el contexto de la aplicacióndeclararon en el contexto de la aplicación
Elementos del WebAppCtxElementos del WebAppCtx
ControllersControllers Handler MappingsHandler Mappings View ResolversView Resolvers Locale ResolversLocale Resolvers Theme ResolverTheme Resolver InterceptorsInterceptors Handler Exception ResolverHandler Exception Resolver
Controller y AbstractController El tipo de Controller más simpleEl tipo de Controller más simple Solo requiere implementar el método Solo requiere implementar el método
handlerRequestInternal()handlerRequestInternal() Le envía un ModelAndView al WebAppCtx Le envía un ModelAndView al WebAppCtx
para que determine el view y alimente para que determine el view y alimente con el modelo su contenidocon el modelo su contenido
SimpleUrlHandlerMappingSimpleUrlHandlerMapping
Es un tipo de HandlerMappingEs un tipo de HandlerMapping Víncula directamente la URL con el Víncula directamente la URL con el
controller que se ejecutarácontroller que se ejecutará Se pueden usar Ant Path’s para vincular Se pueden usar Ant Path’s para vincular
varias URL’s a un Controllervarias URL’s a un Controller
InternalResourceViewResolverInternalResourceViewResolver
Es un tipo de ViewResolverEs un tipo de ViewResolver Se le debe indicar a través de un prefijo Se le debe indicar a través de un prefijo
la ubicación de los archivos de views o la ubicación de los archivos de views o JSPJSP Permite poner detrás de WEB-INF las JSP’sPermite poner detrás de WEB-INF las JSP’s
Se le indica con un sufijo de que tipo son Se le indica con un sufijo de que tipo son las vistas que va a utilizar para mostrarlas vistas que va a utilizar para mostrar
Ahora si...
Hola Mundo con SpringMVC
Más controllers…Más controllers…• ControllerController
– AbstractControllerAbstractController• MultiActionControllerMultiActionController
• BaseCommandControllerBaseCommandController– AbstractCommandControllerAbstractCommandController
– AbstractFormControllerAbstractFormController
» SimpleFormControllerSimpleFormController
» AbstractWizardFormControllerAbstractWizardFormController
– ThrowawayControllerThrowawayController
– ParameterizableViewControllerParameterizableViewController
Más Handler Mappings…Más Handler Mappings…
• BeanNameUrlHandlerMappingBeanNameUrlHandlerMapping
• SimpleUrlHandlerMappingSimpleUrlHandlerMapping
• CommonsPathHandlerMappingCommonsPathHandlerMapping
• ControllerClassNameHandlerMappingControllerClassNameHandlerMapping
• DefaultAnnotationHandlerMappingDefaultAnnotationHandlerMapping
Más View Resolvers..Más View Resolvers..• AbstractCachingViewResolverAbstractCachingViewResolver
• XmlViewResolverXmlViewResolver
• XsltViewResolverXsltViewResolver
• ResourceBundleViewResolverResourceBundleViewResolver
• UrlBasedViewResolverUrlBasedViewResolver
• BeanNameViewResolverBeanNameViewResolver
• InternalResourceViewResolverInternalResourceViewResolver
• VelocityViewResolverVelocityViewResolver / / FreeMarkerViewResolverFreeMarkerViewResolver
Otros conceptos...
Command: Clase que será modificada Command: Clase que será modificada mediante un formulario, generalmente un mediante un formulario, generalmente un Java Bean, es parte del ModeloJava Bean, es parte del Modelo
Bind: Es la acción de asignar los Bind: Es la acción de asignar los parámetros de un request a un Java Bean parámetros de un request a un Java Bean y vicecersay vicecersa
¿Qué más provee Spring MVC?
• Spring's form tag librarySpring's form tag library Spring provee para las views de una librería que Spring provee para las views de una librería que
ayuda a facilitar el binding de objetos de un ayuda a facilitar el binding de objetos de un formularioformulario
Cada tag provee un conjunto de atributos Cada tag provee un conjunto de atributos correspondientes al tipo de elemento para no dejar correspondientes al tipo de elemento para no dejar de lado la funcionalidadde lado la funcionalidad
Solo hay que agregar la taglib al encabezado de la Solo hay que agregar la taglib al encabezado de la View:View:– <%@ taglib prefix="form" <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>uri="http://www.springframework.org/tags/form" %>
Otro controller util: MultiActionController Un controller que maneja diferentes
tareas Multiples metodos para manejar
Cada método maneja un request diferente MethodNameResolver determina el método
Basado en un parametro o en otro criterio Los métodos regresan un ModelAndView
Muy bueno para agrupar tareas relacionadas en una sola clase
Creando un MultiActionController
public class ReportController extends MultiActionController {
public ModelAndView handleSimpleReport(HttpServletRequest request,HttpServletResponse response) throws Exception {
return new ModelAndView("simpleReport", getModel());}
public ModelAndView handleSimpleReportPost(HttpServletRequest request,HttpServletResponse response) throws Exception {
String reportTitle = request.getParameter("reportTitle");Map model = getModel();model.put("ReportTitle", reportTitle);
return new ModelAndView("simpleReportCompile", model);}...
Configurando un MultiActionController
<bean id="controller" class="org.springframework.samples.jasperdemo.web.ReportController">
<property name="methodNameResolver"><ref local="resolver"/></property>
</bean>
<bean id="resolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
<property name="mappings"><props>
<prop key="/simpleReport.pdf">handleSimpleReport</prop><prop key="/simpleReportPost.pdf">handleSimpleReportPost</prop></props>
</property></bean>
Integración con vista
Spring MVC provee de la integración con otras tecnologías de vista como: JSP & JSTL Tiles Velocity & Freemarker XSLT PDF JasperReports
Let's code...
Veamos un ejemplo...
¿Qué más puedo hacer?
Manejar Beans en formularios con SimpleFormController
Agregar lógica de “binding” en los datos tratados desde la vista
Agregar lógica de desplegado de errores en la vista
Definir un objeto Command para la forma Agregar lógica en el Submit de la forma Además
Agregar lógica de validación
¿Cómo funciona SimpleFormController? Su funcionamiento depende del método del Su funcionamiento depende del método del
request(modificable):request(modificable): GET => Implica mostrar el formulario por lo que GET => Implica mostrar el formulario por lo que
se carga el modelo para desplegar la view se carga el modelo para desplegar la view indicada en un parametro denominado indicada en un parametro denominado ‘formView’‘formView’
POST => Sucede cuando hay un envío de POST => Sucede cuando hay un envío de formulario implicado, por lo que se procede a formulario implicado, por lo que se procede a ejecutar las acciones necesarias con el ejecutar las acciones necesarias con el Command, y mostrar la View indicada en Command, y mostrar la View indicada en ’successView’’successView’
Request GET – Desplegar la forma
formBackingObject() Prepara y entrega el objeto Command Permite el pre-llenado de la forma
referenceData() Carga los datos de referencia necesarios para
desplegar la forma showForm()
Completa el ModelAndView y lo regresa Poner el objeto Command en sesión si es necesario Muestra la forma a trabajar
Request GET – Envío de la forma
onBind() Llamado después del bind pero antes de la validación Permite manualmente hacer el bind de los
parametros del request del objeto Command antes de la validación
formBackingObject() Entrega el objeto Command
Quizá de la sesió, o quizá de base de datos Si la validación falla entonces se agregan los errores al
ModelAndView y son mostrados en la forma
Request GET – Envío de la forma Si la validación es satisfactoria, es decir,
no hay errores, entonces se llama onSubmit()
¿Muchos métodos no?
Veremos una forma más efectiva de hacer esto... :D
Afortunadamente tenemos a Spring 2.5 con las nuevas características...
Pero más adelante...
Arquitectura de Validación
No está atada a HttpServletRequest No esta atada a la capa Web
Validación de objetos de dominio Entrada de los clientes remotos también
necesita validación Puede ser probada desde fuera del
contenedor Implemenetación independente Conversión de errores son no-fatal
Creando un validador
public class ClienteValidator implements Validator {
public boolean supports(Class clazz) {return Cliente.class.equals(clazz);
}
public void validate(Object obj, Errors errors) {//Casting del objetoCliente cliente = (Cliente)obj;// ValidacionesValidationUtils.rejectIfEmpty(errors, "nombre", "nombre.empty","El nombre no puede ir
vacÂ’o...");ValidationUtils.rejectIfEmpty(errors, "direccion", "direccion.empty","La direccion no puede ir
vacÂ’o...");ValidationUtils.rejectIfEmpty(errors, "RFC", "RFC.empty","El RFC no puede ir vacÂ’o...");if(cliente.getNombre().length()<=2)
errors.rejectValue("nombre", "nombre.length", "El nombre debe ser mayor de dos caracteres");
}
}
Configurando un validador
<bean id="clienteForm" class="org.springhispano.web.FormaCliente"> <property name="formView" value="editCliente"/> <property name="successView" value="redirect:list.htm"/> <property name="service" ref="service"/> <property name="validator" ref="clienteValidator"/></bean>
Pero también...
Existe un proyecto de Spring llamado Spring Modules Validations
Basado en anotaciones, como: @NotNull @Email @Length @MinLength @MaxLength @NotBlank Otras más...
SpringMVC 2.5
Basados en anotaciones:Basados en anotaciones: @Controller@Controller @RequestMapping@RequestMapping @SessionAttributes@SessionAttributes @RequestParam@RequestParam @InitBinder@InitBinder @ModelAttribute@ModelAttribute
@Controller@Controller
Habilita que cierta clase declarada actue Habilita que cierta clase declarada actue como Controllercomo Controller
No hay necesidar de heredar alguna otra No hay necesidar de heredar alguna otra claseclase
El proposito básico de @Controller es El proposito básico de @Controller es actuar como estereotipo para la clase actuar como estereotipo para la clase anotadaanotada
Para complementar la configuración nos Para complementar la configuración nos ayudaremos de @RequestMappingayudaremos de @RequestMapping
@RequestMapping@RequestMapping
Es usada para mapear las URL’s como por Es usada para mapear las URL’s como por ejemplo: ‘/forma.spring’, ‘hi.form’, etc.ejemplo: ‘/forma.spring’, ‘hi.form’, etc.
Tipicamente el tipo de nivel de la Tipicamente el tipo de nivel de la anotación mapea un request en un anotación mapea un request en un FormControllerFormController
Y adicionalmente le dicta su Y adicionalmente le dicta su comportamiento en base al acceso de la comportamiento en base al acceso de la URL con ayuda de los metodos GET y URL con ayuda de los metodos GET y POSTPOST
@RequestParam@RequestParam
Permite Mapear un atributo a través el Permite Mapear un atributo a través el método GET de la aplicaciónmétodo GET de la aplicación
Se declara por lo general dentro de la Se declara por lo general dentro de la firma del método como un parametro firma del método como un parametro másmás
Hace el binding por sí soloHace el binding por sí solo
@ModelAttribute@ModelAttribute
Permite Mapear un atributo o bien un Permite Mapear un atributo o bien un Command completo de un formulario Command completo de un formulario HtmlHtml
Tambien permite enviar un modelo de Tambien permite enviar un modelo de datos al viewdatos al view
Se declara en la firma del método como Se declara en la firma del método como un parametro más del mismoun parametro más del mismo
@SessionAttributes
Lista los nombres de los atributos del modelo que deben ser almacenados en sesión
Permite que dichos objetos puedan ser utilizados en request posteriores, si es el caso...
Un ejemplo al fin...
Ya era hora !!!
Resumen técnico
Más de SpringMVC
Usar todos los HandlerMappings, ViewResolvers Implementar velocity, freemarker, tiles... Aplicar interceptores Manejar excepciones Usar otros controllers Internacionalización Temas Ajax: Dojo, Prototype, Script.aculo.us,DWR BTW, si hay tiempo veamos DWR
Más de SpringMVC
Integración con: JSF Struts 1.x y 2.x Webwork Tapestry
WebFlow 2(Subproyecto de Spring) Portlet's Algunos WebServices Nos gustaría mucho que alguno de ustedes
propusiera y expusiera un tema... ?:)
Referencias
SpringHispano.org SpringFramework.org http://delicious.com/neodevelop
Tag de Spring y Spring MVC
Gracias!!!
Y sigamos haciendo comunidad...