manual de spring
DESCRIPTION
Manual completo de Spring framewordTRANSCRIPT
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