Spring Mvc Final

10,163
-1

Published on

Brief presntation about SpringMVC

Published in: Technology
1 Comment
2 Likes
Statistics
Notes
  • puedes pasar el código fuente de los ejemplos!!!
    Gracias.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
10,163
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
495
Comments
1
Likes
2
Embeds 0
No embeds

No notes for slide

Spring Mvc Final

  1. 1. 3ra. Reunión de SpringHispano How to run Spring MVC por neodevelop
  2. 2. Acerca de mi... La referencia total: SpringHispano.org y grails.org.mx
  3. 3. Agenda <ul><li>Vista general de SpringFramework </li></ul><ul><li>El patrón de diseño MVC </li></ul><ul><li>Spring MVC </li></ul><ul><ul><li>Componentes </li></ul></ul><ul><ul><li>Funcionamiento </li></ul></ul><ul><ul><li>Configurar una Aplicación con Spring MVC </li></ul></ul><ul><li>Más componentes de Spring MVC </li></ul><ul><li>Más de Spring MVC... </li></ul>
  4. 4. SpringFramework <ul><ul><li>“ Spring es una tecnología dedicada para permitir construir aplicaciones usando POJO’s…”, Rod Johnson – The Server Side </li></ul></ul>
  5. 5. SpringFramework Spring es un poderoso framework de aplicaciones que resuelve muchos problemas comunes en el desarrollo de aplicaciones Java (SDK y EE).
  6. 6. Vista general de SpringFramework
  7. 7. El patrón de diseño MVC <ul><li>MVC = Model – View – Controller </li></ul><ul><li>Provee de un mecanismo para construir una delgada y limpia capa web </li></ul><ul><li>Claramente separa el negocio, la navegación y la lógica de presentación </li></ul>
  8. 8. El patrón de diseño MVC <ul><li>Los tres componentes que colaboran son: </li></ul><ul><ul><li>Controller(Controlador)‏ </li></ul></ul><ul><ul><ul><li>Maneja la lógica de navegación e interactua con la capa de servicio para la lógica de negocio </li></ul></ul></ul><ul><ul><li>Model(Modelo)‏ </li></ul></ul><ul><ul><ul><li>El contrato entre el controller y la vista </li></ul></ul></ul><ul><ul><ul><li>Contiene los datos necesarios para mostrarlos en la vista </li></ul></ul></ul><ul><ul><ul><li>Es manejado y poblado por el controller </li></ul></ul></ul><ul><ul><li>View(Vista)‏ </li></ul></ul><ul><ul><ul><li>Muestra la respuesta a la solicitud previamente hecha </li></ul></ul></ul><ul><ul><ul><li>Obtiene los datos del modelo previamente manejado por el controller </li></ul></ul></ul>
  9. 9. El patrón de diseño MVC
  10. 10. Motivaciones <ul><li>Facilita la carga de mantenimiento </li></ul><ul><ul><li>Los cambios a la lógica de negocio son menos probables de romper la lógica de la presentación </li></ul></ul><ul><ul><li>Viceversa </li></ul></ul>
  11. 11. Motivaciones <ul><li>Facilita el desarrollo en un equipo multidisciplinario </li></ul><ul><ul><li>Los desarrolladores pueden concentrarse en en crear código de negocio robusto sin tener que preocuparse por afectar la Interfaz de Usuario </li></ul></ul><ul><ul><li>Los diseñadores pueden concentrarse en construir usables y atractivas Interfaces de Usuario sin preocuparse por Java </li></ul></ul>
  12. 12. Motivaciones <ul><li>Usa la mejor herramienta para tu trabajo </li></ul><ul><ul><li>Java es apropiado para crear lógica de negocio </li></ul></ul><ul><ul><li>Los lenguajes de plantillas y etiquetado son más apropiados para crear layouts HTML. </li></ul></ul>
  13. 13. Motivaciones <ul><li>Facilita las pruebas </li></ul><ul><ul><li>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. </li></ul></ul><ul><ul><li>Practicamente: podemos probar más código fuera del contendor de servlets </li></ul></ul>
  14. 14. Spring MVC <ul><li>Spring provee de una solución simple y eficaz para usar el patrón MVC </li></ul><ul><li>Y ahora con la versión 2.5 ofrece también el uso de anotaciones </li></ul><ul><li>Hay quienes dicen que es un framework de la ola anterior... </li></ul><ul><li>¿será cierto?, ya veremos ahora que SS esta dentro del JCP </li></ul>
  15. 15. MVC en Spring <ul><li>Un solo servlet que maneja solicitudes a controllers individuales, con ayuda de un controller principal. </li></ul><ul><li>El ruteo de solicitudes es completamente controlado por el Controller Frontal o principal. </li></ul><ul><ul><li>Controllers individuales pueden ser usados ara manejar varias y diferentes URL's </li></ul></ul><ul><li>Los controllers son POJO's </li></ul><ul><li>Y los controllers son manejados como cualquier otro bean de Spring en el AppCtx </li></ul>
  16. 16. Componentes de Spring MVC <ul><li>DispatcherServlet </li></ul><ul><ul><li>La implementación del controller frontal de Spring </li></ul></ul><ul><li>Controller </li></ul><ul><ul><li>Componente que maneja los request del usuario </li></ul></ul><ul><ul><li>Encapsula la lógica de navegación </li></ul></ul><ul><ul><li>Delega a los objetos de los servicios la lógica de negocio </li></ul></ul><ul><li>View </li></ul><ul><ul><li>Responsable para mostrar la salida, sea cual sea... </li></ul></ul>
  17. 17. Componentes de Spring MVC <ul><li>ModelAndView </li></ul><ul><ul><li>Creado por el controller </li></ul></ul><ul><ul><li>Almacena los datos del Modelo </li></ul></ul><ul><ul><li>Asocia una vista al Request </li></ul></ul><ul><ul><ul><li>Puede ser la implementación de una vista física o el nombre de una vista lógica </li></ul></ul></ul><ul><li>ViewResolver </li></ul><ul><ul><li>Usado para mapear nombres de vistas lógicas a implementaciones de vista actuales </li></ul></ul>
  18. 18. Componentes de Spring MVC <ul><li>HandlerMapping </li></ul><ul><ul><li>Interface usada por el DispatcherServlet para mapear los request entrantes hacia los controllers individuales </li></ul></ul>
  19. 19. Funcionamiento de Spring MVC
  20. 20. MVC y D.I. <ul><li>Todos los componentes MVC son configurados en el AppCtx de Spring </li></ul><ul><li>Y como tal, todos los componentes de Spring se benefician y pueden ser configurados usando D.I. </li></ul>
  21. 21. Configurar una App con Spring MVC
  22. 22. Spring MVC - DispatcherServlet <ul><li>Como muchos framework’s MVC, tambien SpringMVC es Request Driven(Manejado por Solicitudes)‏ </li></ul><ul><li>DispatcherServlet.- Es el servlet central que atiende todas esta solicitudes y las gestiona </li></ul><ul><li>Ofrece mucha más funcionalidad para facilitar el desarrollo </li></ul><ul><li>Esta completamente integrado con el contenedor de Spring, con todo lo que esto implica </li></ul>
  23. 23. 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>
  24. 24. WebApplicationContext <ul><li>Cada DispatcherServlet tiene su propio ApplicationContext, a este se le denomina WebApplicationContext </li></ul><ul><li>El WebAppCtx va a contener la configuración de los elementos para que SpringMVC funcione </li></ul><ul><li>El WebAppCtx va a poder usar los beans(DAO’s, Servicios, etc.) que se declararon en el contexto de la aplicación </li></ul>
  25. 25. Elementos del WebAppCtx <ul><li>Controllers </li></ul><ul><li>Handler Mappings </li></ul><ul><li>View Resolvers </li></ul><ul><li>Locale Resolvers </li></ul><ul><li>Theme Resolver </li></ul><ul><li>Interceptors </li></ul><ul><li>Handler Exception Resolver </li></ul>
  26. 26. Controller y AbstractController <ul><li>El tipo de Controller más simple </li></ul><ul><li>Solo requiere implementar el método handlerRequestInternal()‏ </li></ul><ul><li>Le envía un ModelAndView al WebAppCtx para que determine el view y alimente con el modelo su contenido </li></ul>
  27. 27. SimpleUrlHandlerMapping <ul><li>Es un tipo de HandlerMapping </li></ul><ul><li>Víncula directamente la URL con el controller que se ejecutará </li></ul><ul><li>Se pueden usar Ant Path’s para vincular varias URL’s a un Controller </li></ul>
  28. 28. InternalResourceViewResolver <ul><li>Es un tipo de ViewResolver </li></ul><ul><li>Se le debe indicar a través de un prefijo la ubicación de los archivos de views o JSP </li></ul><ul><ul><li>Permite poner detrás de WEB-INF las JSP’s </li></ul></ul><ul><li>Se le indica con un sufijo de que tipo son las vistas que va a utilizar para mostrar </li></ul>
  29. 29. Ahora si... Hola Mundo con SpringMVC
  30. 30. Más controllers… <ul><li>Controller </li></ul><ul><ul><li>AbstractController </li></ul></ul><ul><ul><ul><li>MultiActionController </li></ul></ul></ul><ul><ul><ul><li>BaseCommandController </li></ul></ul></ul><ul><ul><ul><ul><li>AbstractCommandController </li></ul></ul></ul></ul><ul><ul><ul><ul><li>AbstractFormController </li></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>SimpleFormController </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>AbstractWizardFormController </li></ul></ul></ul></ul></ul><ul><ul><li>ThrowawayController </li></ul></ul><ul><ul><li>ParameterizableViewController </li></ul></ul>
  31. 31. Más Handler Mappings… <ul><li>BeanNameUrlHandlerMapping </li></ul><ul><li>SimpleUrlHandlerMapping </li></ul><ul><li>CommonsPathHandlerMapping </li></ul><ul><li>ControllerClassNameHandlerMapping </li></ul><ul><li>DefaultAnnotationHandlerMapping </li></ul>
  32. 32. Más View Resolvers.. <ul><li>AbstractCachingViewResolver </li></ul><ul><li>XmlViewResolver </li></ul><ul><li>XsltViewResolver </li></ul><ul><li>ResourceBundleViewResolver </li></ul><ul><li>UrlBasedViewResolver </li></ul><ul><li>BeanNameViewResolver </li></ul><ul><li>InternalResourceViewResolver </li></ul><ul><li>VelocityViewResolver / FreeMarkerViewResolver </li></ul>
  33. 33. Otros conceptos... <ul><li>Command: Clase que será modificada mediante un formulario, generalmente un Java Bean, es parte del Modelo </li></ul><ul><li>Bind: Es la acción de asignar los parámetros de un request a un Java Bean y vicecersa </li></ul>
  34. 34. ¿Qué más provee Spring MVC? <ul><li>Spring's form tag library </li></ul><ul><li>Spring provee para las views de una librería que ayuda a facilitar el binding de objetos de un formulario </li></ul><ul><li>Cada tag provee un conjunto de atributos correspondientes al tipo de elemento para no dejar de lado la funcionalidad </li></ul><ul><li>Solo hay que agregar la taglib al encabezado de la View: </li></ul><ul><ul><li><%@ taglib prefix=&quot;form&quot; uri=&quot;http://www.springframework.org/tags/form&quot; %> </li></ul></ul>
  35. 35. Otro controller util: MultiActionController <ul><li>Un controller que maneja diferentes tareas </li></ul><ul><ul><li>Multiples metodos para manejar </li></ul></ul><ul><ul><ul><li>Cada método maneja un request diferente </li></ul></ul></ul><ul><ul><li>MethodNameResolver determina el método </li></ul></ul><ul><ul><ul><li>Basado en un parametro o en otro criterio </li></ul></ul></ul><ul><ul><li>Los métodos regresan un ModelAndView </li></ul></ul><ul><li>Muy bueno para agrupar tareas relacionadas en una sola clase </li></ul>
  36. 36. Creando un MultiActionController public class ReportController extends MultiActionController { public ModelAndView handleSimpleReport(HttpServletRequest request, HttpServletResponse response) throws Exception { return new ModelAndView(&quot;simpleReport&quot;, getModel()); } public ModelAndView handleSimpleReportPost(HttpServletRequest request, HttpServletResponse response) throws Exception { String reportTitle = request.getParameter(&quot;reportTitle&quot;); Map model = getModel(); model.put(&quot;ReportTitle&quot;, reportTitle) ; return new ModelAndView(&quot;simpleReportCompile&quot;, model); } ...
  37. 37. Configurando un MultiActionController <bean id= &quot;controller&quot; class= &quot;org.springframework.samples.jasperdemo.web.ReportController&quot; > <property name= &quot;methodNameResolver&quot; > <ref local= &quot;resolver&quot; /> </property> </bean> <bean id= &quot;resolver&quot; class= &quot;org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver&quot; > <property name= &quot;mappings&quot; > <props> <prop key= &quot;/simpleReport.pdf&quot; >handleSimpleReport</prop> <prop key= &quot;/simpleReportPost.pdf&quot; >handleSimpleReportPost</prop> </props> </property> </bean>
  38. 38. Integración con vista <ul><li>Spring MVC provee de la integración con otras tecnologías de vista como: </li></ul><ul><ul><li>JSP & JSTL </li></ul></ul><ul><ul><li>Tiles </li></ul></ul><ul><ul><li>Velocity & Freemarker </li></ul></ul><ul><ul><li>XSLT </li></ul></ul><ul><ul><li>PDF </li></ul></ul><ul><ul><li>JasperReports </li></ul></ul>
  39. 39. Let's code... Veamos un ejemplo...
  40. 40. ¿Qué más puedo hacer? <ul><li>Manejar Beans en formularios con SimpleFormController </li></ul><ul><li>Agregar lógica de “binding” en los datos tratados desde la vista </li></ul><ul><li>Agregar lógica de desplegado de errores en la vista </li></ul><ul><li>Definir un objeto Command para la forma </li></ul><ul><li>Agregar lógica en el Submit de la forma </li></ul><ul><li>Además </li></ul><ul><ul><li>Agregar lógica de validación </li></ul></ul>
  41. 41. ¿Cómo funciona SimpleFormController? <ul><li>Su funcionamiento depende del método del request(modificable): </li></ul><ul><ul><li>GET => Implica mostrar el formulario por lo que se carga el modelo para desplegar la view indicada en un parametro denominado ‘formView’ </li></ul></ul><ul><ul><li>POST => Sucede cuando hay un envío de formulario implicado, por lo que se procede a ejecutar las acciones necesarias con el Command, y mostrar la View indicada en ’successView’ </li></ul></ul>
  42. 42. Request GET – Desplegar la forma <ul><li>formBackingObject()‏ </li></ul><ul><ul><li>Prepara y entrega el objeto Command </li></ul></ul><ul><ul><li>Permite el pre-llenado de la forma </li></ul></ul><ul><li>referenceData()‏ </li></ul><ul><ul><li>Carga los datos de referencia necesarios para desplegar la forma </li></ul></ul><ul><li>showForm()‏ </li></ul><ul><ul><li>Completa el ModelAndView y lo regresa </li></ul></ul><ul><ul><li>Poner el objeto Command en sesión si es necesario </li></ul></ul><ul><ul><li>Muestra la forma a trabajar </li></ul></ul>
  43. 43. Request GET – Envío de la forma <ul><li>onBind()‏ </li></ul><ul><ul><li>Llamado después del bind pero antes de la validación </li></ul></ul><ul><ul><li>Permite manualmente hacer el bind de los parametros del request del objeto Command antes de la validación </li></ul></ul><ul><li>formBackingObject()‏ </li></ul><ul><ul><li>Entrega el objeto Command </li></ul></ul><ul><ul><ul><li>Quizá de la sesió, o quizá de base de datos </li></ul></ul></ul><ul><li>Si la validación falla entonces se agregan los errores al ModelAndView y son mostrados en la forma </li></ul>
  44. 44. Request GET – Envío de la forma <ul><li>Si la validación es satisfactoria, es decir, no hay errores, entonces se llama onSubmit()‏ </li></ul>
  45. 45. ¿Muchos métodos no? <ul><li>Veremos una forma más efectiva de hacer esto... :D </li></ul><ul><li>Afortunadamente tenemos a Spring 2.5 con las nuevas características... </li></ul><ul><li>Pero más adelante... </li></ul>
  46. 46. Arquitectura de Validación <ul><li>No está atada a HttpServletRequest </li></ul><ul><li>No esta atada a la capa Web </li></ul><ul><ul><li>Validación de objetos de dominio </li></ul></ul><ul><ul><li>Entrada de los clientes remotos también necesita validación </li></ul></ul><ul><ul><li>Puede ser probada desde fuera del contenedor </li></ul></ul><ul><li>Implemenetación independente </li></ul><ul><li>Conversión de errores son no-fatal </li></ul>
  47. 47. 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, &quot;nombre&quot;, &quot;nombre.empty&quot;,&quot;El nombre no puede ir vacÂ’o...&quot;); ValidationUtils .rejectIfEmpty(errors, &quot;direccion&quot;, &quot;direccion.empty&quot;,&quot;La direccion no puede ir vacÂ’o...&quot;); ValidationUtils .rejectIfEmpty(errors, &quot;RFC&quot;, &quot;RFC.empty&quot;,&quot;El RFC no puede ir vacÂ’o...&quot;); if (cliente.getNombre().length()<=2)‏ errors.rejectValue(&quot;nombre&quot;, &quot;nombre.length&quot;, &quot;El nombre debe ser mayor de dos caracteres&quot;); } }
  48. 48. Configurando un validador <bean id=&quot;clienteForm&quot; class=&quot;org.springhispano.web.FormaCliente&quot;> <property name=&quot;formView&quot; value=&quot;editCliente&quot;/> <property name=&quot;successView&quot; value=&quot;redirect:list.htm&quot;/> <property name=&quot;service&quot; ref=&quot;service&quot;/> <property name=&quot;validator&quot; ref=&quot;clienteValidator&quot;/> </bean>
  49. 49. Pero también... <ul><li>Existe un proyecto de Spring llamado Spring Modules Validations </li></ul><ul><li>Basado en anotaciones, como: </li></ul><ul><ul><li>@NotNull </li></ul></ul><ul><ul><li>@Email </li></ul></ul><ul><ul><li>@Length </li></ul></ul><ul><ul><li>@MinLength </li></ul></ul><ul><ul><li>@MaxLength </li></ul></ul><ul><ul><li>@NotBlank </li></ul></ul><ul><ul><li>Otras más... </li></ul></ul>
  50. 50. SpringMVC 2.5 <ul><li>Basados en anotaciones: </li></ul><ul><ul><li>@Controller </li></ul></ul><ul><ul><li>@RequestMapping </li></ul></ul><ul><ul><li>@SessionAttributes </li></ul></ul><ul><ul><li>@RequestParam </li></ul></ul><ul><ul><li>@InitBinder </li></ul></ul><ul><ul><li>@ModelAttribute </li></ul></ul>
  51. 51. @Controller <ul><li>Habilita que cierta clase declarada actue como Controller </li></ul><ul><li>No hay necesidar de heredar alguna otra clase </li></ul><ul><li>El proposito básico de @Controller es actuar como estereotipo para la clase anotada </li></ul><ul><li>Para complementar la configuración nos ayudaremos de @RequestMapping </li></ul>
  52. 52. @RequestMapping <ul><li>Es usada para mapear las URL’s como por ejemplo: ‘/forma.spring’, ‘hi.form’, etc. </li></ul><ul><li>Tipicamente el tipo de nivel de la anotación mapea un request en un FormController </li></ul><ul><li>Y adicionalmente le dicta su comportamiento en base al acceso de la URL con ayuda de los metodos GET y POST </li></ul>
  53. 53. @RequestParam <ul><li>Permite Mapear un atributo a través el método GET de la aplicación </li></ul><ul><li>Se declara por lo general dentro de la firma del método como un parametro más </li></ul><ul><li>Hace el binding por sí solo </li></ul>
  54. 54. @ModelAttribute <ul><li>Permite Mapear un atributo o bien un Command completo de un formulario Html </li></ul><ul><li>Tambien permite enviar un modelo de datos al view </li></ul><ul><li>Se declara en la firma del método como un parametro más del mismo </li></ul>
  55. 55. @SessionAttributes <ul><li>Lista los nombres de los atributos del modelo que deben ser almacenados en sesión </li></ul><ul><li>Permite que dichos objetos puedan ser utilizados en request posteriores, si es el caso... </li></ul>
  56. 56. Un ejemplo al fin... Ya era hora !!!
  57. 57. Resumen técnico
  58. 58. Más de SpringMVC <ul><li>Usar todos los HandlerMappings, ViewResolvers </li></ul><ul><li>Implementar velocity, freemarker, tiles... </li></ul><ul><li>Aplicar interceptores </li></ul><ul><li>Manejar excepciones </li></ul><ul><li>Usar otros controllers </li></ul><ul><li>Internacionalización </li></ul><ul><li>Temas </li></ul><ul><li>Ajax: Dojo, Prototype, Script.aculo.us,DWR </li></ul><ul><li>BTW, si hay tiempo veamos DWR </li></ul>
  59. 59. Más de SpringMVC <ul><li>Integración con: </li></ul><ul><ul><li>JSF </li></ul></ul><ul><ul><li>Struts 1.x y 2.x </li></ul></ul><ul><ul><li>Webwork </li></ul></ul><ul><ul><li>Tapestry </li></ul></ul><ul><li>WebFlow 2(Subproyecto de Spring)‏ </li></ul><ul><li>Portlet's </li></ul><ul><li>Algunos WebServices </li></ul><ul><li>Nos gustaría mucho que alguno de ustedes propusiera y expusiera un tema... ?:)‏ </li></ul>
  60. 60. Referencias <ul><li>SpringHispano.org </li></ul><ul><li>SpringFramework.org </li></ul><ul><li>http://delicious.com/neodevelop </li></ul><ul><ul><li>Tag de Spring y Spring MVC </li></ul></ul>
  61. 61. Gracias!!! Y sigamos haciendo comunidad...
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×