Ejemplo básico de Spring MVC con Maven.docx

Embed Size (px)

Text of Ejemplo básico de Spring MVC con Maven.docx

Ejemplo bsico de Spring MVC con MavenPosted by :hop2croft| On :10/09/2011Category:Spring,Spring MVCTags:GitHub,i18n,Maven,Selenium,Spring,Spring MVC

En el siguiente post vamos a hablar un poco deSpring MVC. Pero antes comentar que tengo pensado hacer una serie de post (el primero es este) sobre Spring. En concreto intentar hablar un poco de proyecto de SpringSource comoSpring MVC,Spring Web Flow,Spring Security(O Auth) Spring Faces. Adems voy a hablar un poco de desarrollo e integracin continua y pruebas (Hudson/Jenkins,Sonar,Cobertura,Selenium,Checkstyles,PMD, ). Tambin me gustara tratar temas deCloud Computing, siempre como absoluto novato en la materia, analizando herramientas comoGoogle App Engine(GAE) Micro Cloud Foundry. Pero para ello todava queda . as que empezar conSpring MVC.Introduccin aSpring MVC.Spring MVCes un proyecto de Springsource que nos permite utilizar elpatrn MVCde una forma sencilla dentro de nuestras aplicaciones desarrolladas conSpring. En la siguiente imagen vemos el esquema de cmo funcionaSpring MVC.

Si hemos realizado previamente desarrollo web podemos identificar claramente que enSpring MVC, nuestroDispatcherServletfunciona bajo elpatrn front controller. Elpatrn front controllernos da un punto de entrada nico a nuestras peticiones. De manera que todas ellas van a pasar por un mismoServlet, en el caso deSpring MVC, se trata deDispatcherServlet. Este Servlet se va a encargar de gestionar toda la lgica en nuestra aplicacin.El flujo bsico en una aplicacin bajo Spring MVC es el siguiente: La peticin llega a nuestroDispatcherServlet(1) ElDispatcherServlettendr que encontrar que controlador va a tratar la peticin. Para ello elDispatcherServlettiene que encontrar el manejador asociado a la url de la peticin. Todo esto se realiza en la fase de HandlerMapping(2). Una vez encontrado eseController, nuestroDispatcherServletle dejar gestionar a ste la peticin(3). En nuestro controlador se deber realizar todo la lgica de negocio de nuestra aplicacin, es decir, aqu llamaremos a nuestra capa de servicios. El controlador devolver alDispatcherun objeto de tipoModelAndView(4). Qu quiere decir esto? En pocas palabras Modelser los valores que obtengamos de nuestra capa de servicio yView ser el nombre de la vista en la que queremos mostrar la informacin que va contenida dentro de ese Model. Una vez pasado este objetoModelAndViewalDispatcherServlet, ser ste el que tendr que asociar el nombre de la vista retornada por el controlador a una vista concreta (pgina jsp, jsf, ). Este proceso viene indicado en la imagen comoViewResolver(4). Finalmente y una vez resuelta la vista, nuestroDispatcherServlettendr que pasar nuestro Model (los valores recogidos en el controlador a travs de nuestra capa de servicios) a la vista concretaView (5).En los pasos deHandlerMapping, seleccin deControlleryViewResolver podemos indicarle a nuestroDispatcherServletqu estrategia queremos seguir. Os dejo unaentrada del blogdeAlex Fuentesdonde explica de manera bastante concisa los tipos de estrategias disponibles.Proyecto deSpring MVCconMavenPor qe utilizarGitHub?.Bueno, el punto anterior era teora, vamos a ver un proyecto donde explicar las clases Java y los ficheros de configuracin bsica para empezar conSpring MVC. Como siempre los proyectos estarn gestionados conMaven(2.2.1). Como novedad voy a subir el cdigo a GitHub, as quien quiera probar los ejemplos simplemente tendr que acceder mi repositorio pblico en la siguiente direccin:git@github.com:IvanFernandez/hop2croftRepository.gitSi no conoces todavaGit, puedes empezar echando un vistazo a los siguientes post: Git como herramienta de control deversiones Arquitectura deGit GitHub , repositorio remoto deGitLas razones por la que subo el cdigo aGitHubson varias. Por un lado creo que facilita seguir el post tener todo el cdigo disponible y poder probarlo por uno mismo. Adems, y personalmente no me gusta nada, cuando estoy leyendo un post y veo que por ejemplo no estn incluidos los imports en el cdigo poner todo el cdigo de un mtodo . Subiendo el cdigo aGitHubse puede escribir un post sin necesidad de poner losimports slo parte de una clase (y no hacer un post kilomtrico), pero a la vez la persona que lo est leyendo no se pierde. Finalmente y se alguien se anima conGitHubse puede hacer unforkde los distintos proyectos, aadir funcionalidad y que est a disposicin de todos.Explicacin del cdigoYendo ya al proyecto concreto y para hacer ms claro una imagen general del proyecto creo que es bueno poner una imagen con la estructura del proyecto vista desdeEclipse.

Como podemos ver en la anterior imagen al estar creado nuestro proyecto con Mavense ha creado laestructura tpicade un proyectoMaven, es decir:Carpeta src/main/javaAqu vamos a guardar nuestras clases Java. En concreto tenemos cuatro paquetes: Controller. estar asociado a nuestros controladores. En nuestro caso vamos a tener dos controladores.CarControllerque se ejecutar cuando se solicite la pgina car.html yCarFormControllerque se ejecutar cuando se solicite carForm.html Domain. nuestras clases de dominio. Vamos a utilizar una clase que modela un coche,Car.java. Ya hemos visto en otros post los servicios para crear, modificar y eliminar un coche (y por ende cualquier clase) en una base de datos. Exception. en este paquete estarn las clases que tratarn las posibles excepciones que se generen por nuestro codigo. Interceptor. en este paquete tenemos los interceptores deSpring MVC. Los interceptores sirven enSpringpara tratar las peticiones y aadirles cierta lgica. Services. las clases que llaman a nuestro servicio. En lugar de utilizar los servicios implementados en otros post, por sencillez y sobre todo para no sobrecargar los ficheros de configuracin vamos a hacer que nuestros servicios no vayan contra la base de datos. As el servicioCarServiceva a devolver una lista fija indicada en la propia clase.Carpeta src/main/resourcesEn este paquete vamos a guardar los ficheros necesarios en nuestro proyecto. Locale. Nuestra aplicacin va a escribir sus pginas jsp en el idioma que por defecto que venga indicado en el navegador usado. Para ello habr una serie de ficheros de propiedades nombrados comomessage*.properties. En estos ficheros estarn declaradas una serie de cadenas de texto y su valor. Cuando la pgina se pinte har uso de estos ficheros de propiedades para escribir el texto. Spring. En esta carpeta tendremos nuestro fichero de contexto de la aplicacin,applicationContext.xml. En este fichero simplemente vamos a cargar en nuestro contexto la carpeta locale que acabamos de explicar. view_es.properties. Este fichero todava no lo vamos a utilizar. La idea es utilizar este fichero para hacer redirecciones en nuestros navegadores.Carpeta src/main/testDe momento slo he creado una clase de test. Esta clase de test est realizada usando el frameworkSelenium. Este test nos permite hacer pruebas de regresin, es decir, nuestra clase de test abrir nuestro navegador y ejecutar una secuencia de acciones (rellenar una caja de texto, pulsar un botn, irnos de una pgina a otra, ). El siguiente post que escribir ser una pequea explicacin de como empezar conSelenium.Carpeta src/main/webapp/WEB-INFTenemos una serie de carpetas y ficheros de configuracin que vamos a explicar a continuacin: carpeta jsp. Aqu vamos a guardar nuestras pginas jsp. Por el momento vamos a escribir nuestra parte de vista lo ms sencilla posible. Ms adelante quiz se utilice otro framework comoZKoss alguna de las implementaciones deJSF. carpeta spring. Dentro de esta carpeta tenemos el ficherocar-service.xml. En este fichero lo nico que vamos a hacer es crear un bean que usar la clase de servicio CarService. car-servlet.xml. Vamos a explicar el contenido de este fichero a continuacin.Este fichero incluir en el contexto de nuestroDispatcherServletuna serie de beans. Lo primero que vemos es que cargamos el ficherocar-service.xml. De manera que en el contexto de nuestroDispatcherServlettendremos a nuestra disposicin un beanCarService.El siguiente fragmento nos permite entre otras cosas poder acceder a nuestrocarServicedesde nuestros controller utilizando para ello la anotacin@Autowired.1

El siguiente bean se encargar de mapear las peticiones hechas desde car.html con el controlador implementado en la claseCarController. Para el resto de peticiones utilizaremos el mapeo hecho directamente por la claseControllerClassNameHandlerMapping.1

2

3

Como hemos visto las vistas tienen que resolverse en un paso intermedio entre la llamada al controlador y la generacin de la vista. Para ello vamos a utilizar el servletInternalResourceViewResolver. Este servlet buscar las pginas con formato jsp en la url /WEB-INF/jsp.1

3

4

5

6

En la siguiente parte declaramos la parte de interceptores. Vamos a declarar un interceptor en la clase TimeResponseInterceptor que simplemente aadir un valor a nuestra peticin el tiempo que ha pasado desde que se inicia hasta que termina. Este valor podr ser ms tarde usado por nuestra vista. Para usar nuestro interceptor lo tenemos que declarar utilizando la clase BeanNameUrlHandlerMapping para poderlo usar en nuestras peticiones.1

2

4

5

6

7

8

9

Este bean lo utilizaremos para resolver las excepciones. Si salta una exception de tipo CarException se mostrar la pgina indicada, en este caso carsNotAvailable. Si se genera una excepcin de java.lang se mostar la pgina error.jsp. Dentro de esta pgina podremos acceder a la excepcin usando ${exception}.1

2

3

4carsNotAvailable

5error

6

7

8

Finalmente el siguiente bean se encargar de gestionar un formulario para crear nuevos coches. En lugar de inyectar el carService con @Autowired en la clase CarFormController la pasaremos como referencia en nuestro bean. La vista de formulario ser carForm y la vista cuando se haga e