Manual de Spring

84
Desarrollo de una aplicación Spring Framework MVC paso a paso utilizando NetBeans y GlassFish Autores Thomas Risberg , Rick Evans , Portia Tung Adaptado por Arulazi Dhesiaseelan para NetBeans / GlassFish 2.5 Las copias de este documento se pueden hacer para su propio uso y para su distribución a otros, siempre y cuando usted no carga ninguna cuota por las copias y que, además de que cada copia contenga este Aviso de copyright, ya sea distribuido en forma impresa o electrónica. Visión de conjunto 1. ¿Qué está cubierto 2. Requisitos previos de software 3. La aplicación que estamos construyendo 1. Aplicación Básico y Configuración del entorno 1.1. Crear el proyecto de NetBeans Primavera 1.2. Crear 'index.jsp' 1.3. Desplegar la aplicación de GlassFish 1.4. Compruebe funciona la aplicación 1.5. Descargue el Spring Framework 1.6. Modificar 'web.xml' en el 'WEB-INF' directorio 1.7. Bibliotecas Copiar a 'WEB-INF / lib' 1.8. Cree el controlador 1.9. Escribe una prueba para el controlador 1.10. Cree la Vista 1.11. Compilar y desplegar la aplicación 1.12. Pruebe la aplicación 1.13. Resumen 2. El desarrollo y configuración de las vistas y el controlador 2.1. Configure JSTL y añadir el archivo de cabecera JSP

description

Manual completo de Spring frameword

Transcript of Manual de Spring

Desarrollo de una aplicacin Spring Framework MVC paso a paso utilizando NetBeans y GlassFishAutoresThomasRisberg,RickEvans,PortiaTungAdaptado porArulazi Dhesiaseelanpara NetBeans / GlassFish2.5Las copias de este documento se pueden hacer para su propio uso y para su distribucin a otros, siempre y cuando usted no carga ninguna cuota por las copias y que, adems de que cada copia contenga este Aviso de copyright, ya sea distribuido en forma impresa o electrnica.

Visin de conjunto1. Qu est cubierto2. Requisitos previos de software3. La aplicacin que estamos construyendo1. Aplicacin Bsico y Configuracin del entorno1.1.Crear el proyecto de NetBeans Primavera1.2.Crear'index.jsp'1.3.Desplegar la aplicacin de GlassFish1.4.Compruebe funciona la aplicacin1.5.Descargue el Spring Framework1.6.Modificar'web.xml'en el'WEB-INF'directorio1.7.Bibliotecas Copiar a'WEB-INF / lib'1.8.Cree elcontrolador1.9.Escribe una prueba para elcontrolador1.10.Cree laVista1.11.Compilar y desplegar la aplicacin1.12.Pruebe la aplicacin1.13.Resumen2. El desarrollo y configuracin de las vistas y el controlador2.1.Configure JSTL y aadir el archivo de cabecera JSP2.2.Mejorar el controlador2.3.Disociar la vista desde el controlador2.4.Resumen3. El desarrollo de la lgica de negocios3.1.Revisar el modelo de negocio del Sistema de Gestin de Inventario3.2.Aadir algunas clases de lgica de negocios3.3.Resumen4. El desarrollo de la Interfaz Web4.1.Aadir referencia a la lgica de negocio en el controlador4.2.Modificar la vista para mostrar los datos de negocio y aadir soporte para mensaje paquete4.3.Aadir algunos datos de prueba para rellenar automticamente algunos objetos de negocio4.4.Agregue el grupo de mensajes4.5.Adicin de un formulario4.6.Adicin de un controlador de forma4.7.Resumen5. Implementacin de persistencia de base de datos5.1.Crear base de datos de secuencia de comandos de inicio5.2.Crear tablas y secuencias de comandos de prueba de datos5.3.Ejecutar secuencias de comandos y datos de ensayos de carga5.4.Crear un objeto de acceso a datos (DAO) aplicacin para JDBC5.5.Implementar pruebas para la aplicacin JDBC DAO5.6.Resumen6. La integracin de la aplicacin Web con la Capa de Persistencia6.1.Modificar capa de servicio6.2.Fijar las pruebas fallan6.3.Crear nuevo contexto de aplicacin para la configuracin de capa de servicio6.4.Aadir configuracin de transaccin y agrupacin de conexiones de contexto de aplicacin6.5.Prueba final de la solicitud completa6.6.ResumenA. Crear ScriptsVisin de conjuntoEste documento es una gua paso a paso sobre cmo desarrollar una aplicacin web desde cero usando Spring Framework.Slo se asume un conocimiento superficial de la misma primavera, y como tal, este tutorial es ideal si usted est aprendiendo o la investigacin de la primavera. Esperemos que el tiempo que ha trabajado su camino a travs del material tutorial vers cmo las partes constituyentes de la Spring Framework, a saber Inversin de Control (IoC), Aspect-Oriented Programming (AOP), y las diversas bibliotecas de servicios Primavera (como la biblioteca JDBC) todos encajan en el contexto de una aplicacin web Spring MVC.Primavera ofrece varias opciones para configurar la aplicacin.El ms popular es el uso de archivos XML.Esta es tambin la forma tradicional que ha sido apoyado desde el primer lanzamiento de la primavera.Con la introduccin de Anotaciones en Java 5, ahora tenemos una forma alternativa de configurar nuestras aplicaciones de primavera.La nueva versin de Primavera 2.5 introduce un amplio soporte para el uso de anotaciones para configurar una aplicacin web.En este documento se utiliza el estilo tradicional de XML para la configuracin.Estamos trabajando en una"Anotacin Edition"de este documento y esperamos publicarlo en un futuro prximo.Tenga en cuenta que no vamos a cubrir cualquier informacin de fondo o la teora en este tutorial;hay un montn de libros disponibles que cubren las reas de profundidad;cada vez que se utiliza una nueva clase o funcin en el tutorial, se proporcionan punteros hacia adelante a la seccin correspondiente (s) de la documentacin de referencia de la primavera donde la clase o funcin se cubre en profundidad.1. Qu est cubiertoLa lista siguiente detalla todas las diversas partes de la Spring Framework que estn cubiertos en el transcurso del tutorial.Inversin de Control (IoC)El framework Spring Web MVCAcceso a los datos con JDBCUnidad e integracin de pruebasGestin de operaciones2. Requisitos previos de softwareSe supone que el siguiente software y el entorno de configuracin prerrequisito.Tambin debe ser razonablemente cmodo utilizando las siguientes tecnologas.Java SDK 1.5 / 1.6Ant 1.7Primavera Netbeans Mdulo Release 1.1GlassFish V2 UR1NetBeans 6.0NetBeans IDE 6.0 Pack Full (http://www.netbeans.org) ofrece un excelente ambiente para el desarrollo de aplicaciones web.Los scripts de creacin Ant se omiten en este debate, ya que son generados automticamente por el IDE.El mdulo plugin de primavera para NetBeans se debe instalar antes del inicio de este proyecto,Usted puede por supuesto utilizar casi cualquier variacin o versin del software anterior.Si desea utilizar IntelliJ lugar de NetBeans o embarcadero en lugar de GlassFish, entonces muchos de los pasos del tutorial no se traducir directamente en su entorno, sino que debe ser capaz de seguir a lo largo de todos modos.3. La aplicacin que estamos construyendoLa aplicacin estaremos construyendo desde cero en el transcurso de este tutorial es unmuy bsicosistema de gestin de inventario.Este sistema de gestin de inventario est severamente restringida en trminos de alcance;A continuacin te presentamos un diagrama de casos de uso que ilustra los casos simples de uso que estaremos implementando.La razn por la cual la aplicacin es tan limitado es para que usted pueda concentrarse en los detalles de la primavera Web MVC y la primavera, y no los detalles ms finos de la gestin de inventarios.

Utilice el diagrama caso del sistema de gestin de inventarioVamos aempezarpor la creacin de la estructura bsica de directorios del proyecto para nuestra aplicacin, la descarga de las bibliotecas necesarias, la creacin de nuestros scripts de construccin Ant, etc. El primer paso nos da una base slida sobre la que desarrollar la aplicacin correcta de las piezas2,3, y4.Una vez que la configuracin bsica est fuera del camino, s primavera se introducir, a partir del framework Spring Web MVC.Usaremos la primavera Web MVC para visualizar el stock inventariado, que involucrar a escribir algunas clases de Java simples y algunas pginas JSP.Luego nos trasladaremos a la introduccin de acceso a datos persistentes en nuestra aplicacin, utilizando el soporte de JDBC simple de la primavera.Por el momento hemos terminado todos los pasos del tutorial, vamos a tener una aplicacin que hace la gestin del inventario bsico, incluyendo la lista de valores y permitiendo el aumento de precios de este stock.Captulo 1. Aplicacin Bsico y Configuracin del entorno1.1.Crear el proyecto de NetBeans PrimaveraVamos a necesitar un lugar para guardar toda la fuente y otros archivos estaremos creando, as que vamos a crear un proyecto llamado'springapp'.La decisin sobre el lugar de crear este proyecto es totalmente de usted;Yo cre el mo en un'Proyectos'directorio que ya tena en mi'Usuarios'directorio por lo que la ruta completa en nuestro directorio del proyecto es ahora'C: \ Users \ aruld \ Projects \ springapp'.Crear un nuevo proyecto Web desde Archivo -> Nuevo proyecto y haga clic en Siguiente.

Proyecto Creacin Asistente: paso 1 de 3Introduzca el nombre del proyecto como "springapp" y seleccione "GlassFish V2 UR1" como el servidor y haga clic en Siguiente.

Proyecto Creacin Asistente: Paso 2 de 3Seleccione el marco como "Spring Framework 2.5" y escriba "springapp" como nombre despachador y haga clic en Finalizar.

Proyecto Creacin Asistente: paso 3 de 3Ponemos a tu disposicin una captura de pantalla de lo que su estructura de directorios del proyecto debe ser similar despus de seguir las instrucciones anteriores.(La captura de pantalla muestra la estructura de directorios del proyecto en el IDE NetBeans: no es necesario utilizar el IDE NetBeans para completar este tutorial con xito, pero utilizando NetBeans har que sea mucho ms fcil seguir adelante.)

La estructura de directorios del proyecto1.2.Crear'index.jsp'Desde que estamos creando una aplicacin web, vamos a empezar por actualizar la pgina JSP bsica'index.jsp'que consigui crear en el'web'del directorio como parte de la creacin del proyecto.El'index.jsp'es el punto de partida para nuestra aplicacin.'Springapp / build / web / index.jsp':

Ejemplo :: Primavera Aplicacin Ejemplo - Aplicacin de Primavera Esta es mi prueba.

Slo para tener una aplicacin web completa, vamos a actualizar la'web.xml'ubicado en'WEB-INF'directorio dentro de la'web'directorio con el contenido se muestra a continuacin.'Springapp / build / web / WEB-INF / web.xml': index.jsp

Haga clic en la ficha Archivos en el proyecto para ver el directorio web y su contenido.archivos web.xml y index.jsp se encuentran en este directorio.

Proyecto Archivos Explorador1.3.Desplegar la aplicacin de GlassFishHaga clic derecho en el proyecto y haga clic en Generar.Se basa la aplicacin web.

Construir la aplicacin webHaga clic derecho en el proyecto y haga clic en Deploy.Se despliega la aplicacin Web en el servidor GlassFish.

Implementar la aplicacin web1.4.Compruebe funciona la aplicacinEl servidor ya se ha iniciado cuando la aplicacin se despleg en el paso anterior.Ahora puede abrir un navegador y vaya a la pgina de inicio de nuestra aplicacin en la siguiente URL:http: // localhost: 8080 / springapp / index.jsp.

Pgina de inicio de la aplicacin1.5.Descargue el Spring FrameworkSi an no lo ha descargado el Spring Framework, ahora es el momento para hacerlo.Actualmente estamos utilizando el 'Spring Framework 2.5' de liberacin que se puede descargar desdehttp://www.springframework.org/download.Descomprimir este archivo en algn lugar, ya que vamos a utilizar varios archivos desde este audio ms adelante.Esto completa la configuracin del entorno que sea necesario, y ahora podemos realmente empezar a desarrollar nuestra aplicacin Spring Framework MVC.1.6.Modificar'web.xml'en el'WEB-INF'directorioIr a la'springapp / build / web / WEB-INF'directorio.Modifique la mnima'web.xml'archivo que actualizamos antes.Vamos a definir unaDispatcherServlet(tambin conocido como'Front Controller'(Crupi et al)).Se va a controlar dnde todas nuestras peticiones se dirigen basan en la informacin vamos a entrar en un momento posterior.Esta definicin servlet tambin tiene un asistenteentrada que se asigna a los patrones de URL que vamos a utilizar.Hemos decidido dejar cualquier URL con un'.htm'extensin se dirige a la'springapp'servlet (elDispatcherServlet).'Springapp / web / WEB-INF / web.xml': springapp org.springframework.web.servlet.DispatcherServlet 1 springapp *. Htm index.jsp

A continuacin, actualizar el archivo'springapp-servlet.xml'situado en el'springapp / build / web / WEB-INF'directorio.Este archivo contiene las definiciones de frijol (objetos antiguos llanos Java) utilizados por elDispatcherServlet.Es laWebApplicationContextdonde todos los componentes relacionados con la web van.El nombre de este archivo se determina por el valor de laelemento de la'web.xml', con'-servlet'anexa a ella (por lo tanto'springapp-servlet.xml').Esta es la convencin de nomenclatura estndar usada con Web framework MVC de Primavera.Ahora, agregue una entrada de frijol llamado'/hello.htm'y especificar la clase comospringapp.web.HelloController.Esto define el controlador que nuestra aplicacin va a utilizar para dar servicio a una peticin con el mapeo URL correspondiente de'/hello.htm'.El framework Spring Web MVC utiliza una clase de implementacin de la interfaz llamadaHandlerMappingpara definir la asignacin entre un URL de solicitud y el objeto que se va a manejar esa peticin (el controlador).A diferencia de laDispatcherServlet, elHelloControlleres responsable de manejar una solicitud de una pgina en particular de la pgina web y tambin se conoce como un'Controlador Pgina'(Fowler).El valor predeterminadoHandlerMappingque elDispatcherServletutiliza es elBeanNameUrlHandlerMapping;esta clase utilizar el nombre de frijol para asignar a la URL en el pedido, por lo que elDispatcherServletsabe qu controlador debe ser invocada para el manejo de diferentes URL.'Springapp / build / web / WEB-INF / springapp-servlet.xml':

1.7.Bibliotecas de primaveraLas bibliotecas de la primavera se copian cuando se cre por primera vez el proyecto.Estos frascos sern desplegados en el servidor y que tambin se utilizan durante el proceso de construccin.

Bibliotecas de la primavera1.8.Cree elcontroladorCrea tucontroladorde clase - estamos nombrarloHelloController, y se define en el'springapp.web'paquete.Haga clic derecho en "Source Packages 'y crear una clase Java'HelloController.java'con el nombre del paquete'springapp.web'.'Springapp / src / java / springapp / web / HelloController.java':springapp.web paquete;org.springframework.web.servlet.mvc.Controller importacin;org.springframework.web.servlet.ModelAndView de importacin;javax.servlet.ServletException importacin;javax.servlet.http.HttpServletRequest importacin;javax.servlet.http.HttpServletResponse importacin;org.apache.commons.logging.Log importacin;org.apache.commons.logging.LogFactory importacin;java.io.IOException importacin;public class HelloController implementa Controller { registrador Iniciar ltima protegida = LogFactory.getLog (getClass ()); pblica ModelAndView handleRequest (HttpServletRequest request, HttpServletResponse respuesta) lanza ServletException, IOException { logger.info ("Volviendo la vista hola"); volver nueva ModelAndView ("hello.jsp"); }}Este es un muy bsicoControlleraplicacin.Estaremos ampliando esto ms adelante, as como la ampliacin de algunas de las implementaciones de controladores de base proporcionada por la primavera.En la primavera de Web MVC, elcontroladorse encarga dela solicitud y devuelve unaModelAndView- en este caso, uno nombrado'hello.jsp'que es tambin el nombre del archivo JSP crearemos siguiente.El modelo que devuelve esta clase se resuelve en realidad a travs de unViewResolver.Puesto que no hemos definido explcitamente unViewResolver, vamos a ser dado un defecto de uno en primavera que simplemente remite a una direccin URL que coincida con el nombre de la vista especificada.Vamos a modificar esta tarde.Tambin hemos especificado un registrador para que podamos verificar que en realidad nos dieron en el manejador.1.9.Escribe una prueba para elcontroladorLas pruebas son una parte vital del desarrollo de software.Tambin es una prctica fundamental en el desarrollo Agile.Hemos encontrado que el mejor momento para escribir pruebas es durante el desarrollo, y no despus, por lo que a pesar de que nuestro controlador no contiene lgica compleja, vamos a escribir una prueba.Esto nos permitir hacer cambios a la misma en el futuro con confianza.Vamos a utilizar los "Paquetes de prueba 'para esto.Aqu es donde todas nuestras pruebas irn en una estructura de paquete que reflejar el rbol de fuentes en'springapp / src / java'.Crear una clase de prueba llamada'HelloControllerTests'y hacer que se extienda clase de prueba de JUnitTestCase.Es una prueba de unidad que verifica el nombre de vista devuelta porhandleRequest ()coincide con el nombre de la vista se espera:'hello.jsp'.'Springapp / test / springapp / web / HelloControllerTests.java':springapp.web paquete;org.springframework.web.servlet.ModelAndView de importacin;springapp.web.HelloController importacin;junit.framework.TestCase importacin;HelloControllerTests clase pblica se extiende TestCase { public void testHandleRequestView () throws Exception { Controlador HelloController = new HelloController (); ModelAndView ModelAndView = controller.handleRequest (null, null); assertEquals ("hello.jsp", modelAndView.getViewName ()); }}Podemos usar el IDE para ejecutar la prueba JUnit (y todas las pruebas que vamos a escribir).Asegrese de que los frascos junit estn presentes en el lugar 'Bibliotecas de prueba' del proyecto.Ahora ejecuta el JUnit haciendo clic derecho en el caso de prueba y seleccione 'Archivo Ejecutar "y la prueba debe pasar.

Ejecucin de prueba JUnit en el IDEOtra de las mejores prcticas de desarrollo gil esintegracin continua.Es una buena idea para asegurarse de que sus pruebas se ejecutan con cada generacin (lo ideal es que se basa el proyecto automatizado) de modo que usted sabe que su lgica de la aplicacin se comporta como se esperaba ya que el cdigo evoluciona.1.10.Cree laVistaAhora es el momento de crear nuestra primera vista.Como hemos mencionado anteriormente, le redireccionaremos a una pgina JSP llamado'hello.jsp'.Para empezar, vamos a poner en el'web'del directorio.'Springapp / build / web / hello.jsp':

Hola :: Aplicacin primavera Hola - Aplicacin de Primavera Saludos.

1.11.Compilar y desplegar la aplicacinConsulte la seccin 1.3 para la construccin y despliegue de la aplicacin web desde un IDE.1.12.Pruebe la aplicacinVamos a tratar de esta nueva versin de la aplicacin.Abra un navegador y vaya ahttp: // localhost: 8080 / springapp / hello.htm.

La aplicacin actualizada1.13.ResumenEchemos vistazo rpido a las partes de nuestra aplicacin que hemos creado hasta ahora.Una pgina de introduccin,'index.jsp', la pgina de bienvenida de la aplicacin.Fue utilizado para probar nuestra configuracin es correcta.Despus nos vamos a cambiar esta realidad para proporcionar un enlace en nuestra aplicacin.UnDispatcherServlet(controlador frontal) con el correspondiente'springapp-servlet.xml'archivo de configuracin.Un controlador de pgina,HelloController, con funcionalidad limitada - slo devuelve unModelAndView.Actualmente contamos con un modelo vaco y estaremos proporcionando un modelo completo ms adelante.Una clase de prueba de unidad para el controlador de la pgina,HelloControllerTests, para verificar el nombre de la vista es el que esperamos.Un punto de vista,'hello.jsp', que de nuevo es extremadamente bsico.La buena noticia es que el conjunto de las obras de instalacin y que ahora est listo para aadir ms funcionalidad.Ponemos a tu disposicin una captura de pantalla de lo que su estructura de directorios del proyecto debe ser similar despus de seguir las instrucciones anteriores.

La estructura de directorios del proyecto al final de la parte 1Captulo 2. Desarrollo y configuracin de las vistas y el controladorEsta es la parte 2 de un tutorial paso a paso sobre cmo desarrollar una aplicacin web desde cero usando Spring Framework.Enla Parte 1hemos configurado el entorno y establecer una aplicacin bsica que ahora vamos a profundizar en.Esto es lo que hemos puesto en marcha hasta el momento:Una pgina de introduccin,'index.jsp', la pgina de bienvenida de la aplicacin.Fue utilizado para probar nuestra configuracin es correcta.Despus nos vamos a cambiar esta realidad para proporcionar un enlace en nuestra aplicacin.UnDispatcherServlet(controlador frontal) con el correspondiente'springapp-servlet.xml'archivo de configuracin.Un controlador de pgina,HelloController, con funcionalidad limitada - slo devuelve unModelAndView.Actualmente contamos con un modelo vaco y estaremos proporcionando un modelo completo ms adelante.Una clase de prueba de unidad para el controlador de la pgina,HelloControllerTests, para verificar el nombre de la vista es el que esperamos.Un punto de vista,'hello.jsp', que de nuevo es extremadamente bsico.La buena noticia es que el conjunto de las obras de instalacin y que ahora est listo para aadir ms funcionalidad.2.1.Configure JSTL y aadir el archivo de cabecera JSPVamos a utilizar la JSP Standard Tag Library (JSTL), as que vamos a asegurarnos dejstl.jarystandard.jarexisten en'Bibliotecas'directorio.Vamos a crear un archivo de 'cabecera' que se incluye en cada pgina JSP que vamos a escribir.Aseguramos las mismas definiciones se incluyen en todas nuestras pginas JSP simplemente incluyendo el archivo de cabecera.Tambin vamos a poner todas las JSP en un directorio llamado'jsp'bajo el'WEB-INF'directorio.Esto asegurar que las opiniones slo se puede acceder a travs del controlador, ya que no ser posible acceder a estas pginas directamente a travs de una URL.Esta estrategia podra no funcionar en algunos servidores de aplicaciones y si este es el caso con la persona que est usando, mueva el'jsp'directorio de un nivel.A continuacin, utilice'springapp / web / jsp'como el directorio en lugar de'springapp / web / WEB-INF / jsp'en todos los ejemplos de cdigo que seguirn.En primer lugar vamos a crear el archivo de cabecera para su inclusin en todas las pginas JSP que creamos.'Springapp / build / web / WEB-INF / jsp / include.jsp':

Ahora podemos actualizar'index.jsp'para utilizar este archivo de inclusin y ya que estamos utilizando JSTL, podemos utilizar eletiqueta para volver a dirigir a nuestro frenteController.Esto significa que todas las solicitudes de'index.jsp'pasar a travs de nuestro marco de aplicacin.Simplemente elimine el contenido actual de 'index.jsp' y sustituirlo por el siguiente:'Springapp / build / web / index.jsp':

Mover'hello.jsp'a la'WEB-INF / jsp'directorio.Aadir la misma directiva include hemos aadido a'index.jsp'a'hello.jsp'.Tambin vamos a aadir la fecha y la hora actual como la salida a recuperarse desde el modelo pas a la vista que se representa utilizando el JSTL etiqueta.'Springapp / build / web / WEB-INF / jsp / hello.jsp':

Hola :: Aplicacin primavera Hola - Aplicacin de Primavera Saludos, ahora es

2.2.Mejorar el controladorAntes de que actualizamos la ubicacin del JSP en nuestro controlador, vamos a actualizar nuestra clase de prueba de unidad primero.Sabemos que tenemos que actualizar la referencia de recursos de la vista con su nueva ubicacin'WEB-INF / jsp / hello.jsp'.Sabemos tambin debe haber un objeto en el modelo asignado a la tecla"ahora".'Springapp / pruebas / HelloControllerTests.java':springapp.web paquete;org.springframework.web.servlet.ModelAndView de importacin;springapp.web.HelloController importacin;junit.framework.TestCase importacin;HelloControllerTests clase pblica se extiende TestCase { public void testHandleRequestView () throws Exception { Controlador HelloController = new HelloController (); ModelAndView ModelAndView = controller.handleRequest (null, null); assertEquals ("WEB-INF / jsp / hello.jsp", modelAndView.getViewName ()); assertNotNull (modelAndView.getModel ()); Cadena nowValue = (String) modelAndView.getModel () conseguir ("ahora."); assertNotNull (nowValue); }}A continuacin, se corre el JUnit haciendo clic derecho en el caso de prueba y seleccionamos 'Archivo Ejecutar' y la prueba debe fallar.

Ejecucin de prueba JUnit en el IDEAhora actualizamosHelloControllerestableciendo referencia de recursos de la vista a su nueva ubicacin'WEB-INF / jsp / hello.jsp', as como establecer el par clave / valor de la fecha actual y el valor del tiempo en el modelo con el identificador de clave:" ahora "y el valor de cadena:'ahora'.'Springapp / src / java / springapp / web / HelloController.java':springapp.web paquete;org.springframework.web.servlet.mvc.Controller importacin;org.springframework.web.servlet.ModelAndView de importacin;javax.servlet.ServletException importacin;javax.servlet.http.HttpServletRequest importacin;javax.servlet.http.HttpServletResponse importacin;org.apache.commons.logging.Log importacin;org.apache.commons.logging.LogFactory importacin;java.io.IOException importacin;java.util.Date importacin;public class HelloController implementa Controller { registrador Iniciar ltima protegida = LogFactory.getLog (getClass ()); pblica ModelAndView handleRequest (HttpServletRequest request, HttpServletResponse respuesta) lanza ServletException, IOException { Cadena ahora = (new Date ()) toString ().; logger.info ("Volviendo la vista hola con" + ahora); volver nueva ModelAndView ("WEB-INF / jsp / hello.jsp", "ahora", ahora); }}Nos volver a ejecutar nuestra JUnit y pasa la prueba.Recuerde que elcontroladorya se ha configurado en'springapp-servlet.xml'archivo, por lo que estn dispuestos a probar nuestros mejoras despus de crear e implementar este nuevo cdigo.Cuando entramos enhttp: // localhost: 8080 / springapp /en un navegador, debe levantar el archivo de bienvenida'index.jsp', que debera redirigir a'hello.htm'y es manejado por elDispatcherServlet, que a su vez delega nuestra peticin al controlador de la pgina que pone la fecha y hora en el modelo y luego hace que el modelo disponible a la vista'hello.jsp'.

La aplicacin actualizada2.3.Disociar la vista desde el controladorEn este momento el controlador especifica la ruta completa de la vista, lo que crea una dependencia innecesaria entre el controlador y la vista.Idealmente nos gustara asignar a la vista con un nombre lgico, lo que nos permite cambiar la vista sin tener que cambiar el controlador.Puede establecer esta asignacin en un archivo de propiedades si te gusta usar unResourceBundleViewResolverySimpleUrlHandlerMappingclase.Para el mapeo bsico de una vista a una ubicacin, basta con establecer un prefijo y un sufijo en elInternalResourceViewResolver.Este segundo enfoque es el que vamos a implementar ahora, para que modificamos el'springapp-servlet.xml'y declaramos una'ViewResolver'entrada.Al elegir elJstlView, que nos permitir utilizar JSTL en combinacin con paquetes de recursos de mensajes, as como proporcionarnos el apoyo a la internacionalizacin.'Springapp / build / web / WEB-INF / springapp-servlet.xml':

Actualizamos el nombre de la vista en la clase de prueba del controladorHelloControllerTestsa'hola'y vuelva a ejecutar la prueba para comprobar que falle.'Springapp / test / springapp / web / HelloControllerTests.java':springapp.web paquete;org.springframework.web.servlet.ModelAndView de importacin;springapp.web.HelloController importacin;junit.framework.TestCase importacin;HelloControllerTests clase pblica se extiende TestCase { public void testHandleRequestView () throws Exception { Controlador HelloController = new HelloController (); ModelAndView ModelAndView = controller.handleRequest (null, null); assertEquals ("hola", modelAndView.getViewName ()); assertNotNull (modelAndView.getModel ()); Cadena nowValue = (String) modelAndView.getModel () conseguir ("ahora."); assertNotNull (nowValue); }}Entonces nos quitamos el prefijo y el sufijo del nombre de la vista en el controlador, dejando el controlador para hacer referencia a la vista por su nombre lgico"hola".'Springapp / src / java / springapp / web / HelloController.java':springapp.web paquete;org.springframework.web.servlet.mvc.Controller importacin;org.springframework.web.servlet.ModelAndView de importacin;javax.servlet.ServletException importacin;javax.servlet.http.HttpServletRequest importacin;javax.servlet.http.HttpServletResponse importacin;org.apache.commons.logging.Log importacin;org.apache.commons.logging.LogFactory importacin;java.io.IOException importacin;java.util.Date importacin;public class HelloController implementa Controller { registrador Iniciar ltima protegida = LogFactory.getLog (getClass ()); pblica ModelAndView handleRequest (HttpServletRequest request, HttpServletResponse respuesta) lanza ServletException, IOException { Cadena ahora = (new Date ()) toString ().; logger.info ("Volviendo la vista hola con" + ahora); volver nueva ModelAndView ("hola", "ahora", ahora); }}Vuelva a ejecutar la prueba y ahora debe pasar.Vamos a compilar y desplegar la aplicacin y verificar la aplicacin sigue funcionando.2.4.ResumenEchemos vistazo rpido a lo que hemos creado en la Parte 2.Un archivo de cabecera'include.jsp', la JSP que contiene las directivas taglib para las bibliotecas de cdigos que usaremos en nuestras pginas JSP.Estos son los artefactos existentes que hemos cambiado en la parte 2.LosHelloControllerTestsse ha actualizado varias veces a medida que hacemos el controlador de referencia el nombre lgico de una vista en lugar de su nombre codificado y la ubicacin.El controlador de la pgina,HelloController, ahora hace referencia a la vista por su lgica nombre de la vista a travs del uso de la'InternalResourceViewResolver'definido en'springapp-servlet.xml'.Ponemos a tu disposicin una captura de pantalla de lo que su estructura de directorios del proyecto debe ser similar despus de seguir las instrucciones anteriores.

La estructura de directorios del proyecto al final de la parte 2Captulo 3. Desarrollo de la lgica de negociosEsta es la parte 3 de un tutorial paso a paso sobre cmo desarrollar una aplicacin de Primavera.En esta seccin, vamos a adoptar un enfoque pragmtico Test-Driven Development (TDD) para la creacin de los objetos de dominio y la aplicacin de la lgica de negocio para nuestrosistema de gestin de inventario.Esto significa que vamos a "codificar un poco, probar un poco, un poco ms de cdigo a continuacin, probar un poco ms".Enla Parte 1hemos configurado el entorno y establecer una aplicacin bsica.Enla Parte 2refinamos la aplicacin desacoplando la vista desde el controlador.La primavera est en hacer las cosas simples y fciles las cosas difciles posible.El constructo fundamental que hace esto posible es el uso de la primavera dePlain Old Java Objects (POJO).POJOs son esencialmente llano viejas clases Java gratis desde cualquier contrato generalmente forzada por una arquitectura marco o componente a travs de subclases o la implementacin de interfaces.POJOs son objetos antiguos de civil que estn libres de estas limitaciones, por lo que la programacin orientada a objetos es posible una vez ms.Cuando se trabaja con la primavera, los objetos de dominio y servicios implementados sern POJOs.De hecho, casi todo lo que implemente debe ser un POJO.Si no es as, usted debe estar seguro que preguntarse por qu.En esta seccin, vamos a empezar a ver la sencillez y el poder de la primavera.3.1.Revisar el modelo de negocio del Sistema de Gestin de InventarioEn nuestro sistema de gestin de inventario, tenemos el concepto de un producto y un servicio para el manejo de ellos.En particular, la empresa ha solicitado la posibilidad de aumentar los precios en todos los productos.Cualquier disminucin se har sobre una base producto individual, pero esta caracterstica se encuentra fuera del alcance de nuestra aplicacin.Las reglas de validacin para aumento de precios son los siguientes:El aumento mximo se limita al 50%.El incremento mnimo debe ser mayor que 0%.Ponemos a tu disposicin un diagrama de clases de nuestro sistema de gestin de inventario.

El diagrama de clases para el sistema de gestin de inventario3.2.Aadir algunas clases de lgica de negociosAhora vamos a aadir un poco de lgica de negocio en la forma de unproductode clase y un servicio llamadoProductManagerservicio que se encargar de todos los productos.Con el fin de separar la lgica dependiente web desde la lgica de negocio, colocaremos clases relacionadas con la capa web de la'web'del paquete y crear dos nuevos paquetes: uno para objetos de servicio denominadas"servicio"y otro para los objetos de dominio llamado"dominio '.Primero implementamos elProductoclase como un POJO con un constructor por defecto (siempre de forma automtica si no se especifica ningn constructor) y captadores y definidores por sus propiedades'descripcin'y'precio'.Tambin vamos a hacer esSerializable, no es necesario para nuestra aplicacin, pero podra ser til ms adelante, cuando persistimos y almacenar su estado.La clase es un objeto de dominio, por lo que pertenece en el'dominio'paquete.'Springapp / src / java / springapp / dominio / Product.java':springapp.domain paquete;java.io.Serializable importacin;clase Product pblica implementa Serializable { Descripcin private String; Precio Doble privado; public String getDescription () { Descripcin de vuelta; } public void setDescription (descripcin String) { this.description = descripcin; } Doble getPrice pblica () { Precio regresar; } pblica setPrice void (Precio Doble) { this.price = precio; } public String toString () { Tampn StringBuffer = new StringBuffer (); buffer.append ("Descripcin:" + Descripcin + ";"); buffer.append ("Precio:" + precio); volver buffer.toString (); }}Ahora escribimos las pruebas unitarias para nuestroproductode clase.Algunos desarrolladores no se molestan en pruebas de escritura para captadores y definidores o llamado cdigo 'auto-generada ".Por lo general toma mucho ms tiempo para participar en el debate (como demuestra este prrafo) sobre la conveniencia o no captadores y definidores tienen que ser unidad de prueba, ya que son tan "trivial".Les escribimos porque: a) no son triviales para escribir;b) que tiene las pruebas paga dividendos en trminos de ahorro de tiempo para el tiempo de cada cien puede ser atrapado por un captador chunga o colocador;yc) que mejoran la cobertura de la prueba.Creamos unproductode cdigo auxiliar y probamos cada getter y setter como un par en una sola prueba.Por lo general, usted va a escribir uno o ms mtodos de prueba por mtodo de clase, con cada mtodo de prueba probando una condicin particular en un mtodo de la clase, como la comprobacin de unnulovalor de un argumento pasado al mtodo.'Springapp / test / springapp / dominio / ProductTests.java':springapp.domain paquete;junit.framework.TestCase importacin;ProductTests clase pblica se extiende TestCase { producto privado; void Protected Setup () throws Exception { producto = nuevo producto (); } pblica testSetAndGetDescription void () { TestDescription String = "aDescription"; assertNull (product.getDescription ()); product.setDescription (testDescription); assertEquals (testDescription, product.getDescription ()); } pblica testSetAndGetPrice void () { doble testPrice = 100,00; assertEquals (0, 0, 0); product.setPrice (testPrice); assertEquals (testPrice, product.getPrice (), 0); } }Siguiente creamos elProductManager.Este es el servicio responsable de productos de manipulacin.Contiene dos mtodos: un mtodo de negocioincreasePrice ()que aumentan los precios de todos los productos y un mtodo gettergetProducts ()para recuperar todos los productos.Hemos elegido para que sea una interfaz en lugar de una clase concreta para un nmero de razones.En primer lugar, hace que las pruebas unitarias de escritura paralos controladoresms fcil (como veremos en el siguiente captulo).En segundo lugar, el uso de interfaces significa JDK proxy (una caracterstica del lenguaje Java) se puede utilizar para hacer que el transaccional servicio en lugar de CGLIB (una biblioteca de generacin de cdigo).'Springapp / src / java / springapp / servicio / ProductManager.java':springapp.service paquete;java.io.Serializable importacin;java.util.List importacin;springapp.domain.Product importacin;ProductManager interfaz pblica se extiende Serializable { pblica increasePrice void (int porcentaje); Lista pblica getProducts (); }Vamos a crear elSimpleProductManagerclase que implementa laProductManagerinterfaz.'Springapp / src / java / springapp / servicio / SimpleProductManager.java':springapp.service paquete;java.util.List importacin;springapp.domain.Product importacin;public class SimpleProductManager implementa ProductManager { Lista pblico getProducts () { throw new UnsupportedOperationException (); } public void increasePrice (int porcentaje) { throw new UnsupportedOperationException (); } setProducts public void (Lista productos) { throw new UnsupportedOperationException (); }}Antes de implementar los mtodos enSimpleProductManager, vamos a definir algunas pruebas primero.La definicin ms estricta deTest Driven Development(TDD) es escribir siempre las pruebas primero, luego el cdigo.Una interpretacin ms laxa de la misma es ms afn a laPrueba de Desarrollo Orientado(TOD), donde alternamos entre el cdigo escrito y pruebas como parte del proceso de desarrollo.Lo ms importante es para una base de cdigo para tener tan completa un conjunto de pruebas de unidad como sea posible, as que cmo lograr que se convierte en algo acadmico.La mayora de los desarrolladores de TDD, sin embargo, no estn de acuerdo en que la calidad de las pruebas es siempre mayor cuando se escriben en torno al mismo tiempo que el cdigo que se est desarrollando, as que ese es el enfoque que vamos a tomar.Para escribir pruebas eficaces, hay que considerar todas las posibles condiciones pre y post de un mtodo se est probando, as como lo que sucede en el mtodo.Vamos a empezar por probar una llamada agetProducts ()devuelvenulo.'Springapp / test / springapp / servicio / SimpleProductManagerTests.java':springapp.service paquete;junit.framework.TestCase importacin;public class SimpleProductManagerTests extiende TestCase { privada ProductManager SimpleProductManager; void Protected Setup () throws Exception { ProductManager = new SimpleProductManager (); } testGetProductsWithNoProducts public void () { ProductManager = new SimpleProductManager (); assertNull (productManager.getProducts ()); }}Vuelva a ejecutar todas las pruebas JUnit y la prueba debe fallar comogetProducts ()an no se ha implementado.Por lo general es una buena idea para marcar mtodos no implementados por conseguir que lanzar unaUnsupportedOperationException.Siguiente implementamos una prueba para recuperar una lista de productos de cdigo auxiliar pobladas con datos de prueba.Sabemos que tendremos que rellenar la lista de productos en la mayora de nuestros mtodos de ensayo enSimpleProductManagerTests, por lo que definimos la lista trozo de JUnit enConfiguracin (), un mtodo que se invoca antes de llamar a cada mtodo de ensayo.'Springapp / test / springapp / servicio / SimpleProductManagerTests.java':springapp.service paquete;java.util.ArrayList importacin;java.util.List importacin;springapp.domain.Product importacin;junit.framework.TestCase importacin;public class SimpleProductManagerTests extiende TestCase { privada ProductManager SimpleProductManager; Lista privada productos; private int PRODUCT_COUNT esttica = 2; esttica CHAIR_PRICE privado Doble = new Double (20,50); CHAIR_DESCRIPTION static String privada = "Presidente"; TABLE_DESCRIPTION static String privada = "Tabla"; esttica TABLE_PRICE privado Doble = new Double (150,10);void Protected Setup () throws Exception { ProductManager = new SimpleProductManager (); productos = new ArrayList (); // Stub una lista de productos Producto = nuevo producto (); product.setDescription ("Presidente"); product.setPrice (CHAIR_PRICE); products.add (producto); producto = nuevo producto (); product.setDescription ("Tabla"); product.setPrice (TABLE_PRICE); products.add (producto); productManager.setProducts (productos); } testGetProductsWithNoProducts public void () { ProductManager = new SimpleProductManager (); assertNull (productManager.getProducts ()); } testGetProducts public void () { Lista de productos>

4.4.Agregue el grupo de mensajesCreamos un'messages.properties'archivo en el'/ classes web / WEB-INF'directorio.Estas propiedades agrupar hasta ahora tiene tres entradas que coincidan las claves especificadas en losetiquetas que hemos aadido a'hello.jsp'.'springapp / build / web / WEB-INF / classes / messages.properties':title = SpringApprbrica = Hola :: SpringAppfelicitacin = Saludos, es ahoraAhora volver a generar la aplicacin y desplegarla.Vamos a tratar de acceder a esta nueva versin de la aplicacin y usted debera ver lo siguiente:

La aplicacin actualizada4.5.Adicin de un formularioPara proporcionar una interfaz en la aplicacin web para exponer la funcionalidad de aumento de precios, aadimos una forma que permita que el usuario introduzca un valor de porcentaje.Este formulario utiliza una biblioteca de etiquetas llamado"primavera-form.tld 'que se proporciona con el Spring Framework.Tenemos que copiar este archivo de la distribucin de la primavera ("spring-marco-2.5 / dist / resources / primavera-form.tld ') a la'springapp / web / WEB-INF / tld'directorio que tambin tenemos que crear.Siguiente tambin hay que aadir unentrada a la'web.xml'archivo.'Springapp / build / web / WEB-INF / web.xml': springapp org.springframework.web.servlet.DispatcherServlet 1 springapp *. Htm index.jsp / primavera /WEB-INF/tld/spring-form.tld

Tambin tenemos que declarar este taglib en una directiva de pgina en el archivo jsp y, a continuacin, empezar a utilizar las etiquetas por lo tanto hemos importado.Aadir la pgina JSP'priceincrease.jsp'a la'build / web / WEB-INF / jsp'directorio.'Springapp / build / web / WEB-INF / jsp / priceincrease.jsp':

.Error {color: red; }

Aumento (%):

Inicio

Esta prxima clase es una clase JavaBean muy simple, y en nuestro caso hay una sola propiedad con un getter y setter.Este es el objeto de que el formulario se rellenar y que nuestra lgica de negocio que va a extraer el porcentaje de incremento de los precios.'Springapp / src / java / springapp / servicio / PriceIncrease.java':springapp.service paquete;org.apache.commons.logging.Log importacin;org.apache.commons.logging.LogFactory importacin;public class PriceIncrease { / ** Logger para esta clase y subclases * / registrador Iniciar ltima protegida = LogFactory.getLog (getClass ()); porcentaje int privado; public void setPercentage (int i) { porcentaje = i; logger.info ("Porcentaje configurado en" + i); } public int getPercentage () { volver porcentaje; }}La siguiente clase de validador obtiene el control cuando el usuario presiona someten.Los valores introducidos en la forma se establecern en el objeto de comando por el marco.Lavalidacin (..)se llama al mtodo y el objeto de comando (PriceIncrease) y un objeto de contexto para sostener cualquier error se pasan en.'Springapp / src / java / springapp / servicio / PriceIncreaseValidator.java':springapp.service paquete;org.springframework.validation.Validator importacin;org.springframework.validation.Errors de importacin;org.apache.commons.logging.Log importacin;org.apache.commons.logging.LogFactory importacin;public class PriceIncreaseValidator implementa Validador { int DEFAULT_MIN_PERCENTAGE privada = 0; int DEFAULT_MAX_PERCENTAGE privado = 50; privada int minPercentage = DEFAULT_MIN_PERCENTAGE; privada int maxPercentage = DEFAULT_MAX_PERCENTAGE; / ** Logger para esta clase y subclases * / registrador Iniciar ltima protegida = LogFactory.getLog (getClass ()); soportes booleanos pblicos (clazz Clase) { PriceIncrease.class.equals retorno (clazz); } public void validate (Object obj, los errores Errores) { PriceIncrease pi = (PriceIncrease) obj; si (pi == null) { ("especifica error.not" "porcentaje", null, "requiere valor.") errors.rejectValue; } else { logger.info ("Validacin con" + pi + ":" + pi.getPercentage ()); si (pi.getPercentage ()> maxPercentage) { errors.rejectValue ("porcentaje", "error.too-alta", nueva Object [] {new Integer (maxPercentage)}, "Valor demasiado alto."); } si (pi.getPercentage ()

A continuacin, vamos a echar un vistazo a el controlador para este formulario.ElonSubmit (..)mtodo obtiene el control y hace algo de registro antes de que llama alincreasePrice (..)mtodo en laProductManagerobjeto.A continuacin, devuelve unModelAndViewpasar en una nueva instancia de unRedirectViewcreado usando el URL para la vista del xito.'Springapp / src / java / springapp / web / PriceIncreaseFormController.java':springapp.web paquete;org.springframework.web.servlet.mvc.SimpleFormController importacin;org.springframework.web.servlet.ModelAndView de importacin;org.springframework.web.servlet.view.RedirectView de importacin;javax.servlet.ServletException importacin;javax.servlet.http.HttpServletRequest importacin;org.apache.commons.logging.Log importacin;org.apache.commons.logging.LogFactory importacin;springapp.service.ProductManager importacin;springapp.service.PriceIncrease de importacin;public class PriceIncreaseFormController extiende SimpleFormController { / ** Logger para esta clase y subclases * / registrador Iniciar ltima protegida = LogFactory.getLog (getClass ()); privada ProductManager ProductManager; pblica ModelAndView onSubmit (comando Objeto) lanza ServletException { int incremento = ((PriceIncrease) de comandos) .getPercentage (); logger.info ("El aumento de los precios en un" + + aumento "%."); productManager.increasePrice (aumento); logger.info ("volver a la vista PriceIncreaseForm a" + getSuccessView ()); volver nueva ModelAndView (nueva RedirectView (getSuccessView ())); } formBackingObject objeto protegido (HttpServletRequest request) throws ServletException { PriceIncrease priceIncrease = new PriceIncrease (); priceIncrease.setPercentage (20); volver priceIncrease; } public void setProductManager (ProductManager ProductManager) { this.productManager = ProductManager; } pblica ProductManager getProductManager () { volver ProductManager; }}Tambin estamos aadiendo algunos mensajes a la'' messages.propertiesarchivo de recursos.'springapp / build / web / WEB-INF / classes / messages.properties':title = SpringApprbrica = Hola :: SpringAppfelicitacin = Saludos, es ahorapriceincrease.heading = Precio Aumentar :: SpringApperror.not especificado-= Porcentaje no especificado !!!error.too baja = Debe especificar un porcentaje superior a {0}!-error.too Alta = don''t seas codicioso - que can''t subir los precios de ms de {0}%!required = Entrada necesario.typeMismatch = datos no vlidos.typeMismatch.percentage = Eso no es un nmero !!!Compilar y desplegar todo esto y despus de volver a cargar la aplicacin podemos probarlo.Esto es lo que la forma se parece con errores que aparezcan.Por ltimo, vamos a aadir un enlace a la pgina de subida de precios del'hello.jsp'.

Productos $

Aumentar los precios
Ahora, volver a implementar y probar la nueva funcin de aumento de precios.La aplicacin actualizada4.7.ResumenEchemos un vistazo a lo que hicimos en la parte 4.Hemos cambiado el nombre a nuestro controladorInventoryControllery le dimos una referencia a unProductManagerpara que pudiramos recuperar una lista de los productos para mostrar.Siguiente modificamos la pgina JSP a utilizar un paquete de mensajes para texto esttico y tambin aadimos un bucle foreach para mostrar la lista dinmica de los productos.A continuacin, definimos algunos datos de prueba para poblar los objetos de negocio modificamos la pgina JSP a utilizar un paquete de mensajes de texto esttico y tambin aadimos un bucle foreach para mostrar la lista dinmica de los productos.Siguiente modificamos la pgina JSP a utilizar un paquete de mensajes para texto esttico y tambin aadimos un bucle foreach para mostrar la lista dinmica de los productos.Despus de esto funcion hemos creado una forma para proporcionar la capacidad de aumentar los precios.Siguiente modificamos la pgina JSP a utilizar un paquete de mensajes para texto esttico y tambin aadimos un bucle foreach para mostrar la lista dinmica de los productos.Finalmente creamos el controlador de forma y un validador y desplegamos y probamos las nuevas caractersticas.Ponemos a tu disposicin una captura de pantalla de lo que su estructura de directorios del proyecto debe ser similar despus de seguir las instrucciones anteriores.La estructura de directorios del proyecto al final de la parte 4Captulo 5. Implementacin de persistencia de base de datosEsta es la parte 5 de una cuenta paso a paso de cmo desarrollar una aplicacin web desde cero usando Spring Framework.Enla Parte 1hemos configurado el entorno y establecer una aplicacin bsica.Enla Parte 2refinamos la aplicacin que vamos a construir.Parte 3aade toda la lgica y la unidad de pruebas de negocio yla parte 4desarroll la interfaz web.Ahora es el momento de introducir la persistencia de base de datos.Vimos en las partes anteriores de cmo cargamos algunos objetos de negocio utilizando las definiciones de frijol en un archivo de configuracin.Es obvio que esto nunca iba a funcionar en la vida real - cada vez que re-iniciar el servidor estamos de vuelta a los precios originales.Tenemos que aadir cdigo para persistir en realidad estos cambios en una base de datos.5.1.Crear base de datos de secuencia de comandos de inicioAntes de que podamos empezar a desarrollar el cdigo de persistencia, necesitamos una base de datos.Estamos planeando sobre el uso de HSQL, que es una buena base de datos de cdigo abierto escrito en Java.Esta base de datos se distribuye con la primavera, por lo que ya forma parte del directorio lib de la aplicacin web.Usaremos HSQL en modo servidor independiente.Eso significa que vamos a tener que poner en marcha un servidor de base de datos independiente en lugar de confiar en una base de datos integrada, pero nos da un acceso ms fcil para ver los cambios realizados en la base de datos cuando se ejecuta la aplicacin web.Necesitamos un archivo script o por lotes para iniciar la base de datos.Crear un'db'directorio en el principal'springapp'directorio.Este nuevo directorio contendr los archivos de base de datos.Ahora, vamos y agregar un script de inicio:Para Linux / Mac OS X aadir:'Springapp / db / server.sh':java -classpath ../build/web/WEB-INF/lib/hsqldb.jar org.hsqldb.Server -database pruebaNo se olvide de cambiar el permiso de ejecucin al ejecutar'chmod + x server.sh'.Para Windows aadir:'Springapp / db / server.bat':-classpath java .. \ build \ web \ WEB-INF \ lib \ hsqldb.jar org.hsqldb.Server -database pruebaAhora se puede abrir una ventana de comandos, cambie al'springapp / db'directorio y empezar a la base de datos mediante la ejecucin de una de estas secuencias de comandos de inicio.5.2.Crear tablas y secuencias de comandos de prueba de datosEn primer lugar, vamos a revisar la sentencia SQL necesaria para crear la tabla.Creamos el archivo 'create_products.sql' en el directorio db.'Springapp / db / create_products.sql':CREATE TABLE productos ( Identificacin del INTEGER NOT NULL PRIMARY KEY, Descripcin varchar (255), decimal precio (15,2));CREAR products_description NDICE DE LA productos (descripcin);Ahora tenemos que aadir nuestros datos de prueba.Cree el archivo 'load_data.sql' en el directorio db.'Springapp / db / load_data.sql':INSERT INTO productos (Identificacin, descripcin, precio) valores (1, 'lmpara', 5,78);INSERT INTO productos (Identificacin, descripcin, precio) valores (2, 'Tabla', 75,29);INSERT INTO productos (Identificacin, descripcin, precio) valores (3, 'Presidente', 22,81);En la siguiente seccin vamos a ver cmo podemos ejecutar estos scripts SQL desde el IDE.5.3.Ejecutar secuencias de comandos y datos de ensayos de cargaVamos a crear tablas y rellenar con los datos de prueba utilizando las capacidades de SQL incorporadas de IDE.Para utilizar esta tenemos que aadir la conexin de base de datos a la base de datos HSQL.Configuracin de una conexin de base de datosSiguiente ejecutamos la creacin de tablas y secuencias de comandos de prueba de carga de datos utilizando la opcin Ejecutar SQL desde el IDE.La ejecucin de los scripts de SQLSeleccione los datos de la tabla usando la ventana de comandos SQL.Ejecutar la consulta de seleccin desde la ventana de comandos SQLAhora se puede ejecutar createTable y loadData para preparar los datos de prueba que utilizaremos ms adelante.5.4.Crear un objeto de acceso a datos (DAO) aplicacin para JDBCComience con la creacin de un nuevo'springapp / src / springapp / repositoriodirectorio para contener clases que se utilizan para el acceso de base de datos.En este directorio se crea una nueva interfaz llamadaProductDAO.Esta ser la interfaz que define la funcionalidad que las clases de implementacin DAO proporcionar - podramos optar por tener ms de una aplicacin algn da.'Springapp / src / java / springapp / repositorio / ProductDao.java':springapp.repository paquete;java.util.List importacin;springapp.domain.Product importacin;interfaz pblica ProductDAO { Lista pblico getProductList (); pblica saveProduct void (prod Producto);}Seguiremos esto con una clase llamadaJdbcProductDaoque ser la aplicacin JDBC de esta interfaz.Spring proporciona una abstraccin JDBC marco que vamos a hacer uso de.La mayor diferencia entre el uso de JDBC recta y marco JDBC de primavera es que usted no tiene que preocuparse acerca de cmo abrir y cerrar la conexin o cualquier declaracin.Todo se maneja para usted.Otra ventaja es que usted no tendr que tomar ninguna excepcin, a menos que quieras.Primavera envuelve todos SQLExceptions en su propia jerarqua de excepciones sin control heredando de DataAccessException.Si quieres, puedes atrapar esta excepcin, pero como la mayora de las excepciones de bases de datos son imposibles de recuperar de todos modos, puede ser que tambin acaba de dejar que la excepcin se propaga hasta un nivel ms alto.La claseSimpleJdbcDaoSupportofrece un cmodo acceso a una ya configuradoSimpleJdbcTemplate, as que extender esta clase.Todos tendremos que dar en el contexto de la aplicacin es una configuradoDataSource.'Springapp / src / java / springapp / repositorio / JdbcProductDao.java':springapp.repository paquete;java.sql.ResultSet importacin;java.sql.SQLException importacin;java.util.List importacin;org.apache.commons.logging.Log importacin;org.apache.commons.logging.LogFactory importacin;org.springframework.jdbc.core.namedparam.MapSqlParameterSource importacin;org.springframework.jdbc.core.simple.ParameterizedRowMapper importacin;org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport importacin;springapp.domain.Product importacin;public class JdbcProductDao extiende SimpleJdbcDaoSupport implementa ProductDAO { / ** Logger para esta clase y subclases * / registrador Iniciar ltima protegida = LogFactory.getLog (getClass ()); Lista pblico getProductList () { logger.info ("productos Cmo!"); Lista de productos> classpath: jdbc.properties Hemos definido unProductDAOque es la clase que estamos probando.Tambin hemos definido unDataSourcecon marcadores de posicin para los valores de configuracin.Estos valores se proporcionan a travs de un archivo de separacin de bienes y en tiempo de ejecucin, elPropertyPlaceholderConfigurerque hemos definido leer este fichero propiedad y sustituir los marcadores de posicin con los valores reales.Esto es conveniente ya que asla los valores de conexin en su propio archivo.Estos valores a menudo necesitan ser cambiado durante el despliegue de la aplicacin.Ponemos este nuevo archivo en la'web / WEB-INF / classes'directorio por lo que estar disponible cuando ejecutamos la aplicacin y tambin despus, cuando desplegamos la aplicacin web.El contenido de este archivo de propiedades es:'springapp / build / web / WEB-INF / classes / jdbc.properties':jdbc.driverClassName = org.hsqldb.jdbcDriverjdbc.url = jdbc: hsqldb: hsql: // localhostjdbc.username = sajdbc.password =Desde hemos aadido un archivo de configuracin a la'prueba'"directorio y un archivo jdbc.properties a la'WEB-INF / classes'directorio, vamos a aadir una nueva entrada de ruta de clases para nuestras pruebas. Es shoud ir despus de la definicin de la"prueba .dir 'propiedad:'Springapp / build.xml':... ...Ahora deberamos tener suficiente para nuestras pruebas para correr y pasar, pero es una buena prctica para separar las pruebas de integracin que dependen de una base de datos en vivo desde el resto de las pruebas.Es hora de ejecutar este Junit haciendo clic derecho en el caso de prueba y seleccione 'Archivo Ejecutar' para ver si pasan las pruebas.5.6.ResumenHemos completado la capa de persistencia y en la siguiente parte vamos a integrarlo con nuestra aplicacin web.Pero primero, vamos a resumir rpidamente el sombrero que hemos logrado en esta parte.En primer lugar hemos configurado nuestra base de datos y scripts de arranque creado.Hemos creado guiones para utilizar al crear la tabla y tambin para cargar algunos datos de prueba.A continuacin hemos aadido algunas tareas en nuestro script para ejecutar cuando necesitbamos para crear o eliminar la tabla y tambin cuando tenamos que aadir los datos de prueba o borrar los datos.Creamos la clase DAO real que controlar el trabajo de persistencia utilizando de primaveraSimpeJdbcTemplate.Finalmente creamos unidad o con mayor precisin las pruebas de integracin y las correspondientes tareas ant para ejecutar estas pruebas.A continuacin se muestra una captura de pantalla de lo que su estructura de directorios del proyecto debe ser similar despus de seguir las instrucciones anteriores.La estructura de directorios del proyecto al final de la parte 5Captulo 6. La integracin de la aplicacin Web con la Capa de PersistenciaEsta es la Parte 6 de una cuenta paso a paso de cmo desarrollar una aplicacin web desde cero usando Spring Framework.Enla Parte 1hemos configurado el entorno y establecer una aplicacin bsica.Enla Parte 2refinamos la aplicacin que vamos a construir.Parte 3aade toda la lgica y la unidad de pruebas de negocio yla parte 4desarroll la interfaz web.Enla Parte 5desarrollamos la capa de persistencia.Ahora es el momento de integrar todo esto en una aplicacin web completa.6.1.Modificar capa de servicioSi estructuramos nuestra aplicacin correctamente, slo tendramos que cambiar las clases de capa de servicios para aprovechar la persistencia de base de datos.Las clases de vista y el controlador no deberan tener que ser modificado, ya que deben ser conscientes de los detalles de implementacin de la capa de servicio.As que vamos a aadir la persistencia con la aplicacin ProductManager.Modificamos elSimpleProductManagery aadir una referencia a unProductDAOinterfaz ms un mtodo setter para esta referencia.Qu aplicacin realmente usamos aqu debera ser irrelevante para la clase ProductManager, y vamos a establecer esto a travs de una opcin de configuracin.Tambin cambiamos lossetProductsmtodo a unsetProductDaomtodo para que podamos inyectar una instancia de la clase DAO.ElgetProductsmtodo usar ahora el DAO para recuperar una lista de productos.Por ltimo, elincreasePricesmtodo ahora obtener la lista de productos y despus el precio se ha incrementado el producto se almacena en la base de datos utilizando elsaveProductmtodo en el DAO.'Springapp / src / java / springapp / servicio / SimpleProductManager.java':springapp.service paquete;java.util.List importacin;springapp.domain.Product importacin;springapp.repository.ProductDao importacin;public class SimpleProductManager implementa ProductManager { // Lista privada productos; privada ProductDAO ProductDAO; Lista pblico getProducts () { // Devolver productos; volver productDao.getProductList (); } public void increasePrice (int porcentaje) { Lista productos productDao.getProductList = (); si (productos! = null) { para (producto: productos) { doble nuevoPrecio = product.getPrice (). doubleValue () * (100 + porcentaje) / 100; product.setPrice (nuevoPrecio); productDao.saveProduct (producto); } } } public void setProductDao (ProductDAO ProductDAO) { this.productDao = ProductDAO; }// pblicas setProducts void (Lista productos) {// this.products = productos;// }}6.2.Fijar las pruebas fallanNosotros reescribimos laSimpleProductManagery ahora las pruebas, por supuesto, un error.Tenemos que proporcionar laProductManagercon una implementacin en memoria delProductDAO.Nosotros realmente no queremos usar el verdadero DAO aqu desde que nos gustara no tener que acceder a una base de datos para nuestras pruebas unitarias.Vamos a aadir una clase interna llamadaInMemoryProductDaoque aferrarse a una lista de productos pf previstas en el constructor.Esta clase en memoria tiene que ser aprobada en cuando creamos un nuevoSimpleProductManager.'Springapp / test / springapp / repositorio / InMemoryProductDao.java':springapp.repository paquete;java.util.List importacin;springapp.domain.Product importacin;public class InMemoryProductDao implementa ProductDAO { Lista privada Lista del producto; InMemoryProductDao pblico (List Lista del producto) { this.productList = Lista del producto; } Lista pblico getProductList () { devolver la lista de productos; } public void saveProduct (prod Producto) { }}Y aqu est la modificadosSimpleProductManagerTests:'Springapp / test / springapp / servicio / SimpleProductManagerTests.java':springapp.service paquete;java.util.ArrayList importacin;java.util.List importacin;springapp.domain.Product importacin;springapp.repository.InMemoryProductDao importacin;springapp.repository.ProductDao importacin;junit.framework.TestCase importacin;public class SimpleProductManagerTests extiende TestCase { privada ProductManager SimpleProductManager; Lista privada productos; private int PRODUCT_COUNT esttica = 2; esttica CHAIR_PRICE privado Doble = new Double (20,50); CHAIR_DESCRIPTION static String privada = "Presidente"; TABLE_DESCRIPTION static String privada = "Tabla"; esttica TABLE_PRICE privado Doble = new Double (150,10);private int POSITIVE_PRICE_INCREASE esttica = 10; void Protected Setup () throws Exception { ProductManager = new SimpleProductManager (); productos = new ArrayList (); // Stub una lista de productos Producto = nuevo producto (); product.setDescription ("Presidente"); product.setPrice (CHAIR_PRICE); products.add (producto); producto = nuevo producto (); product.setDescription ("Tabla"); product.setPrice (TABLE_PRICE); products.add (producto); ProductDAO ProductDAO = InMemoryProductDao nuevas (productos); productManager.setProductDao (ProductDAO); //productManager.setProducts(products); } testGetProductsWithNoProducts public void () { ProductManager = new SimpleProductManager (); productManager.setProductDao (nueva InMemoryProductDao (nulo)); assertNull (productManager.getProducts ()); } testGetProducts public void () { Lista de productos> Todava tenemos que configurar la capa de servicio y haremos todo lo que en su propio archivo de contexto de aplicacin.Este archivo se llama'applicationContext.xml'y se carga a travs de un oyente servlet que vamos a definir en'web.xml'.Todo frijol configurado en este nuevo contexto de aplicacin estar disponible para hacer referencia de cualquier contexto servlet.'Springapp / build / web / WEB-INF / web.xml': org.springframework.web.context.ContextLoaderListener springapp org.springframework.web.servlet.DispatcherServlet 1 springapp *. Htm index.jsp / primavera /WEB-INF/tld/spring-form.tld Ahora vamos a crear un nuevo'applicationContext.xml'archivo en la'web / WEB-INF "directorio ".'Springapp / build / web / WEB-INF / applicationContext.xml': 6.4.Aadir configuracin de transaccin y agrupacin de conexiones de contexto de aplicacinCada vez que persisten los datos en una base de datos a su alcance para utilizar las transacciones para garantizar que todas las actualizaciones son realizar o no se han completado.Usted quiere evitar tener la mitad de sus actualizaciones persistieron mientras que la otra mitad no.Primavera ofrece una extensa gama de opciones para la forma de proporcionar la gestin de transacciones.El manual de referencia cubre esto en profundidad.Aqu vamos a hacer uso de una forma de proporcionar esta usando AOP (Aspect Oriented Programming) en forma de un consejo de transaccin y un punto de corte ApectJ para definir dnde deben aplicarse las transacciones.Si usted est interesado en cmo funciona esto en ms profundidad, eche un vistazo al manual de referencia.Estamos utilizando el nuevo soporte de espacio de nombre introducido en la primavera de 2,0.El "AOP" y espacios de nombres "TX" hacen las entradas de configuracin mucho ms concisa en comparacin con la forma tradicional utilizando "" entradas regulares. El punto de corte se aplica a cualquier mtodo llamado en la interfaz ProductManager.El consejo es un consejo transaccin que se aplica a los mtodos con un nombre empezando por "salvar".Los atributos de transaccin por defecto de REQUERIDA aplica desde que se especifica ningn otro atributo.El consejo tambin se aplica transacciones "de slo lectura" en cualquier otro mtodo que se aconsej a travs del punto de corte.Tambin tenemos que definir una agrupacin de conexiones.Estamos utilizando la agrupacin de conexiones DBCP del proyecto Apache Jakarta.Estamos reutilizando el'' jdbc.propertiesarchivo que hemos creado en la Parte 5. classpath: jdbc.properties Para que todo esto funcione necesitamos algunos archivos jar adicionales estn presentes en el directorio 'Bibliotecas'.Si no existen, copieaspectjweaver.jardel'/ lib / aspectj 2.5 de primavera-marco'directorio ycommons-dbcp.jarycommons-pool.jardel'marco de primavera-2.5 / lib / jakarta-commons 'directorio para el'directorio' Bibliotecas.Aqu est la versin final de nuestra'applicationContext.xml'archivo:'Springapp / build / web / WEB-INF / applicationContext.xml': classpath: jdbc.properties 6.5.Prueba final de la solicitud completaAhora es el tiempo para ver si todas estas piezas trabajarn juntos.Construir y desplegar su aplicacin terminada y recuerde tener la base de datos en funcionamiento.Esto es lo que debera ver cuando se apunta el navegador web en la aplicacin despus de que haya vuelto a cargar:La solicitud completaSe ve de la misma manera como lo hizo antes.Hicimos aadir persistencia, as que si usted cierra la aplicacin no se perdern los aumentos de precios.Todava estn all cuando se inicia la aplicacin copia de seguridad.Una gran cantidad de trabajo para una aplicacin muy sencilla, pero nunca fue nuestro objetivo de simplemente escribir esta aplicacin.El objetivo era mostrar cmo ir sobre la creacin de una aplicacin Spring MVC desde cero y sabemos que las aplicaciones que se crean son mucho ms complejos.Los mismos pasos se aplican sin embargo y esperamos que haya adquirido los conocimientos suficientes para que sea ms fcil para empezar a utilizar la primavera.6.6.ResumenHemos completado las tres capas de la aplicacin - la capa de Web, la capa de servicio y la capa de persistencia.En esta ltima parte nos reconfiguramos la aplicacin.Primero modificamos la capa de servicio para utilizar la ProductDAO.A continuacin, tuvimos que arreglar algunas pruebas de servicio y la capa web fallan.A continuacin se introdujo un nuevo applicationContext separar la configuracin de capa de servicios y la persistencia de la configuracin de la capa web.Tambin definimos algunas gestin de transacciones para la capa de servicio y configuramos un pool de conexiones para las conexiones de base de datos.Finalmente construimos la aplicacin reconfigurado y probamos que an funcionaba.A continuacin se muestra una captura de pantalla de lo que su estructura de directorios del proyecto debe ser similar despus de seguir las instrucciones anteriores.La estructura de directorios del proyecto al final de la parte 6Referencias:https://sites.google.com/site/springmvcnetbeans/step-by-step/http://www.uv.es/grimo/teaching/SpringMVCv4PasoAPaso/index.html (spring tool)Apndice A. ReferenciasVersin original de este tutorial basado en Eclipse y Tomcat.http://www.springframework.org/docs/Spring-MVC-step-by-step/index.htmlNetBeans IDE 6.0 Descargarhttp://download.netbeans.org/netbeans/6.0/final/Primavera Netbeans Mdulo Release 1.1http://spring-netbeans.sourceforge.net/GlassFish V2 UR1https://glassfish.dev.java.net/downloads/v2ur1-b09d.htmlDescarga springapp NetBeans Proyecto para los impacienteshttp://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=5171