Você está na página 1de 61

3ra.

Reunin 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 patrn de diseo MVC Spring MVC


Componentes Funcionamiento Configurar una Aplicacin con Spring MVC

Ms componentes de Spring MVC Ms de Spring MVC...

SpringFramework

Spring es una tecnologa dedicada para permitir construir aplicaciones usando POJOs, 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 patrn de diseo MVC


MVC = Model View Controller Provee de un mecanismo para construir una delgada y limpia capa web Claramente separa el negocio, la navegacin y la lgica de presentacin

El patrn de diseo MVC

Los tres componentes que colaboran son:

Controller(Controlador)

Maneja la lgica de navegacin e interactua con la capa de servicio para la lgica 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

El patrn de diseo MVC

Motivaciones

Facilita la carga de mantenimiento


Los cambios a la lgica de negocio son menos probables de romper la lgica de la presentacin Viceversa

Motivaciones

Facilita el desarrollo en un equipo multidisciplinario


Los desarrolladores pueden concentrarse en en crear cdigo de negocio robusto sin tener que preocuparse por afectar la Interfaz de Usuario Los diseadores 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 lgica de negocio Los lenguajes de plantillas y etiquetado son ms apropiados para crear layouts HTML.

Motivaciones

Facilita las pruebas


La lgica de navegacin y de negocio estn separadas de la lgica de presentacin lo que sugiere que pueden ser probadas independiemtemente. Practicamente: podemos probar ms cdigo fuera del contendor de servlets

Spring MVC

Spring provee de una solucin simple y eficaz para usar el patrn MVC Y ahora con la versin 2.5 ofrece tambin 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 implementacin del controller frontal de Spring Controller Componente que maneja los request del usuario Encapsula la lgica de navegacin Delega a los objetos de los servicios la lgica 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 implementacin de una vista fsica o el nombre de una vista lgica ViewResolver Usado para mapear nombres de vistas lgicas 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 DispatcherServlet


Como muchos frameworks MVC, tambien SpringMVC es Request Driven(Manejado por Solicitudes) DispatcherServlet.- Es el servlet central que atiende todas esta solicitudes y las gestiona Ofrece mucha ms funcionalidad para facilitar el desarrollo Esta completamente integrado con el contenedor de Spring, con todo lo que esto implica

Spring MVC DispatcherServlet


<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>

WebApplicationContext

Cada DispatcherServlet tiene su propio ApplicationContext, a este se le denomina WebApplicationContext El WebAppCtx va a contener la configuracin de los elementos para que SpringMVC funcione El WebAppCtx va a poder usar los beans(DAOs, Servicios, etc.) que se declararon en el contexto de la aplicacin

Elementos del WebAppCtx


Controllers Handler Mappings View Resolvers Locale Resolvers Theme Resolver Interceptors Handler Exception Resolver

Controller y AbstractController

El tipo de Controller ms simple Solo requiere implementar el mtodo handlerRequestInternal() Le enva un ModelAndView al WebAppCtx para que determine el view y alimente con el modelo su contenido

SimpleUrlHandlerMapping

Es un tipo de HandlerMapping Vncula directamente la URL con el controller que se ejecutar Se pueden usar Ant Paths para vincular varias URLs a un Controller

InternalResourceViewResolver

Es un tipo de ViewResolver Se le debe indicar a travs de un prefijo la ubicacin de los archivos de views o JSP

Permite poner detrs de WEB-INF las JSPs

Se le indica con un sufijo de que tipo son las vistas que va a utilizar para mostrar

Ahora si...

Hola Mundo con SpringMVC

Ms controllers
Controller
AbstractController
MultiActionController BaseCommandController
AbstractCommandController AbstractFormController SimpleFormController AbstractWizardFormController

ThrowawayController ParameterizableViewController

Ms Handler Mappings
BeanNameUrlHandlerMapping SimpleUrlHandlerMapping CommonsPathHandlerMapping ControllerClassNameHandlerMapping DefaultAnnotationHandlerMapping

Ms View Resolvers..
AbstractCachingViewResolver XmlViewResolver XsltViewResolver ResourceBundleViewResolver UrlBasedViewResolver BeanNameViewResolver InternalResourceViewResolver VelocityViewResolver / FreeMarkerViewResolver

Otros conceptos...

Command: Clase que ser modificada mediante un formulario, generalmente un Java Bean, es parte del Modelo Bind: Es la accin de asignar los parmetros de un request a un Java Bean y vicecersa

Qu ms provee Spring MVC?


Spring's form tag library

Spring provee para las views de una librera que ayuda a facilitar el binding de objetos de un formulario Cada tag provee un conjunto de atributos correspondientes al tipo de elemento para no dejar de lado la funcionalidad Solo hay que agregar la taglib al encabezado de la View:
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

Otro controller util: MultiActionController

Un controller que maneja diferentes tareas

Multiples metodos para manejar


Cada

mtodo maneja un request diferente en un parametro o en otro criterio

MethodNameResolver determina el mtodo


Basado

Los mtodos 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>

Integracin con vista

Spring MVC provee de la integracin con otras tecnologas de vista como:


JSP & JSTL Tiles Velocity & Freemarker XSLT PDF JasperReports

Let's code...

Veamos un ejemplo...

Qu ms puedo hacer?

Manejar Beans en formularios con SimpleFormController Agregar lgica de binding en los datos tratados desde la vista Agregar lgica de desplegado de errores en la vista Definir un objeto Command para la forma Agregar lgica en el Submit de la forma Adems Agregar lgica de validacin

Cmo funciona SimpleFormController?

Su funcionamiento depende del mtodo del request(modificable):

GET => Implica mostrar el formulario por lo que se carga el modelo para desplegar la view indicada en un parametro denominado formView POST => Sucede cuando hay un envo de formulario implicado, por lo que se procede a ejecutar las acciones necesarias con el Command, y mostrar la View indicada en 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 sesin si es necesario Muestra la forma a trabajar

Request GET Envo de la forma

onBind() Llamado despus del bind pero antes de la validacin Permite manualmente hacer el bind de los parametros del request del objeto Command antes de la validacin formBackingObject() Entrega el objeto Command Quiz de la sesi, o quiz de base de datos Si la validacin falla entonces se agregan los errores al ModelAndView y son mostrados en la forma

Request GET Envo de la forma

Si la validacin es satisfactoria, es decir, no hay errores, entonces se llama onSubmit()

Muchos mtodos no?

Veremos una forma ms efectiva de hacer esto... :D Afortunadamente tenemos a Spring 2.5 con las nuevas caractersticas... Pero ms adelante...

Arquitectura de Validacin

No est atada a HttpServletRequest No esta atada a la capa Web


Validacin de objetos de dominio Entrada de los clientes remotos tambin necesita validacin Puede ser probada desde fuera del contenedor

Implemenetacin independente Conversin 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 objeto Cliente cliente = (Cliente)obj; // Validaciones ValidationUtils.rejectIfEmpty(errors, "nombre", "nombre.empty","El nombre no puede ir vaco..."); ValidationUtils.rejectIfEmpty(errors, "direccion", "direccion.empty","La direccion no puede ir vaco..."); ValidationUtils.rejectIfEmpty(errors, "RFC", "RFC.empty","El RFC no puede ir vaco..."); 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 tambin...

Existe un proyecto de Spring llamado Spring Modules Validations Basado en anotaciones, como: @NotNull @Email @Length @MinLength @MaxLength @NotBlank Otras ms...

SpringMVC 2.5

Basados en anotaciones:
@Controller @RequestMapping

@SessionAttributes @RequestParam

@InitBinder @ModelAttribute

@Controller

Habilita que cierta clase declarada actue como Controller No hay necesidar de heredar alguna otra clase El proposito bsico de @Controller es actuar como estereotipo para la clase anotada Para complementar la configuracin nos ayudaremos de @RequestMapping

@RequestMapping

Es usada para mapear las URLs como por ejemplo: /forma.spring, hi.form, etc. Tipicamente el tipo de nivel de la anotacin mapea un request en un FormController Y adicionalmente le dicta su comportamiento en base al acceso de la URL con ayuda de los metodos GET y POST

@RequestParam

Permite Mapear un atributo a travs el mtodo GET de la aplicacin Se declara por lo general dentro de la firma del mtodo como un parametro ms Hace el binding por s solo

@ModelAttribute

Permite Mapear un atributo o bien un Command completo de un formulario Html Tambien permite enviar un modelo de datos al view Se declara en la firma del mtodo como un parametro ms del mismo

@SessionAttributes

Lista los nombres de los atributos del modelo que deben ser almacenados en sesin Permite que dichos objetos puedan ser utilizados en request posteriores, si es el caso...

Un ejemplo al fin...

Ya era hora !!!

Resumen tcnico

Ms de SpringMVC

Usar todos los HandlerMappings, ViewResolvers Implementar velocity, freemarker, tiles... Aplicar interceptores Manejar excepciones Usar otros controllers Internacionalizacin Temas Ajax: Dojo, Prototype, Script.aculo.us,DWR BTW, si hay tiempo veamos DWR

Ms de SpringMVC

Integracin con: JSF Struts 1.x y 2.x Webwork Tapestry WebFlow 2(Subproyecto de Spring) Portlet's Algunos WebServices Nos gustara 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...