2.5
Las 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 conjunto
1. Qu est cubierto
2. Requisitos previos de software
3. La aplicacin que estamos construyendo
1. Aplicacin Bsico y Configuracin del entorno
1.1. Crear el proyecto de NetBeans Primavera
1.2. Crear 'index.jsp'
1.3. Desplegar la aplicacin de GlassFish
1.4. Compruebe funciona la aplicacin
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 aplicacin
1.12. Pruebe la aplicacin
1.13. Resumen
2. El desarrollo y configuracin de las vistas y el controlador
2.1. Configure JSTL y aadir el archivo de cabecera JSP
2.2. Mejorar el controlador
Visin de conjunto
Este documento es una gua paso a paso sobre cmo desarrollar una aplicacin web
desde cero usando Spring Framework.
este
documento
se
utiliza
el
estilo
tradicional
de
XML
para
la
1. Qu est cubierto
La lista siguiente detalla todas las diversas partes de la Spring Framework que
estn cubiertos en el transcurso del tutorial.
Gestin de operaciones
Se
supone
que
el
siguiente
software
el
entorno
de
configuracin
Ant 1.7
GlassFish V2 UR1
NetBeans 6.0
Vamos 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.
1.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' :
<Html>
<Head> <title> Ejemplo :: Primavera Aplicacin </ title> </ head>
<Body>
<h1> Ejemplo - Aplicacin de Primavera </ h1>
<P> Esta es mi prueba. </ P>
</ Body>
</ Html>
Slo
para
tener
una
aplicacin
web
completa,
vamos
actualizar
se
puede
descargar
1.6. Modificar
Ir
la 'springapp
'web.xml'
build
que
en el
web
'WEB-INF'
directorio
actualizamos
antes. Vamos
la
definir
antiguos
llanos
Java)
utilizados
por
el DispatcherServlet . Es
/> elemento
de
la 'web.xml' ,
ella
(por
lo
MVC
utiliza
una
clase
de
implementacin
de
la
interfaz
Pgina' (Fowler). El
valor
nombre
de
frijol
para
asignar
la
URL
en
el
pedido,
por
lo
que
La
definicin
de
contexto
de
aplicacin
para
la
springapp
DispatcherServlet ->
<Nombre del bean = clase "/ hello.htm" = "springapp.web.HelloController" />
</ Beans>
Bibliotecas de la primavera
1.8. Cree el
controlador
ModelAndView
handleRequest
(HttpServletRequest
request,
HttpServletResponse respuesta)
lanza ServletException, IOException {
logger.info ("Volviendo la vista hola");
volver nueva ModelAndView ("hello.jsp");
}
}
Este es un muy bsico Controller aplicacin. 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, el controlador se encarga de la solicitud y devuelve una ModelAndView - 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
controlador
Las 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 JUnit TestCase . Es una prueba de unidad que verifica el nombre
de vista devuelta por handleRequest () 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.
1.10. Cree la
Vista
La aplicacin actualizada
1.13. Resumen
Echemos vistazo rpido a las partes de nuestra aplicacin que hemos creado hasta
ahora.
aplicacin. Fue
utilizado
para
probar
nuestra
configuracin
es
Un DispatcherServlet (controlador
frontal)
con
el
Una
clase
de
prueba
de
unidad
para
el
controlador
de
la
aplicacin. Fue
utilizado
para
probar
nuestra
configuracin
es
Un DispatcherServlet (controlador
frontal)
con
el
Una
clase
de
prueba
de
unidad
para
el
controlador
de
la
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' :
<% @ Sesin page =% "false">
<% @ Taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core"%>
<% @ Taglib prefijo = "fmt" uri = "http://java.sun.com/jsp/jstl/fmt"%>
Ahora podemos actualizar 'index.jsp' para utilizar este archivo de inclusin y ya que
estamos utilizando JSTL, podemos utilizar el <c: redirigir /> etiqueta para volver a
dirigir
nuestro
significa
que
todas
las
solicitudes
("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.
ModelAndView
handleRequest
(HttpServletRequest
HttpServletResponse respuesta)
lanza ServletException, IOException {
Cadena ahora = (new Date ()) toString ().;
request,
que
el controlador ya
se
ha
configurado
en 'springapp-
La aplicacin actualizada
archivo
de
propiedades
si
te
gusta
usar
id
clase
"ViewResolver"
"org.springframework.web.servlet.view.InternalResourceViewResolver">
<Propiedad
nombre
valor
"viewClass"
el
nombre
de
la
vista
en
vuelva
la
a
clase
ejecutar
de
la
prueba
prueba
del
para
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. Resumen
Echemos vistazo rpido a lo que hemos creado en la Parte 2.
taglib para las bibliotecas de cdigos que usaremos en nuestras pginas JSP.
Estos son los artefactos existentes que hemos cambiado en la parte 2.
vista
por
su
lgica
nombre
de
la
vista
travs
del
uso
de
3.2. Aadir
negocios
algunas
clases
de
lgica
de
crear
el SimpleProductManager clase
que
implementa
la ProductManager interfaz.
'Springapp / src / java / springapp / servicio / SimpleProductManager.java' :
springapp.service paquete;
java.util.List importacin;
springapp.domain.Product importacin;
public class SimpleProductManager implementa ProductManager {
pruebas
primero. La
definicin
ms
estricta
de Test
Driven
mtodos
no
implementados
por
conseguir
que
lanzar
una UnsupportedOperationException .
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
(expectedChairPriceWithIncrease,
product.getPrice
());
producto = products.get (1);
assertEquals
(expectedTablePriceWithIncrease,
product.getPrice
());
}
}
Volvemos a SimpleProductManager implementar increasePrice () .
'Springapp / src / java / springapp / servicio / SimpleProductManager.java' :
springapp.service paquete;
java.util.List importacin;
springapp.domain.Product importacin;
public class SimpleProductManager implementa ProductManager {
Lista privada <Producto> productos;
Lista pblico <Producto> getProducts () {
devolver los productos;
}
public void increasePrice (int porcentaje) {
si (productos! = null) {
para (producto: productos) {
doble nuevoPrecio = product.getPrice (). doubleValue () *
(100 + porcentaje) / 100;
product.setPrice (nuevoPrecio);
}
}
}
setProducts public void (Lista <productos> productos) {
productos this.products =;
}
}
Vuelva a ejecutar las pruebas JUnit y todas nuestras pruebas deben pasar. *
HURRAH * JUnit tiene un dicho: " . mantener la barra verde para mantener el
cdigo limpio "Para aquellos de ustedes ejecutar las pruebas en un IDE y son
nuevos en la unidad de pruebas, esperamos que te sientes imbuido de un sentido
de mayor sentido de confianza y certeza de que el cdigo est realmente
funcionando como se especifica en la especificacin de las reglas de negocio y como
usted piensa.Sin duda, nos hacemos.
Ahora estamos listos para volver a la capa web para poner una lista de productos
en nuestra Controller modelo.
3.3. Resumen
Echemos vistazo rpido a lo que hicimos en la parte 3.
Nosotros
no
escribimos
una
lnea
de
cdigo
que
ver
con
la
de
sus
objetivos
principales
es
permitir
los
es
donde
un
IDE
con
refactorizacin
apoyo
es
mantener
continuacin,
una
Modificamos
referencia
ModelAndView
handleRequest
(HttpServletRequest
request,
HttpServletResponse respuesta)
lanza ServletException, IOException {
Cadena ahora = (new java.util.Date ()) toString ().;
logger.info ("volver la vista hola con" + ahora);
Map <String, Object> myModel = new HashMap <String, Object> ();
myModel.put ("ahora", ahora);
myModel.put ("productos", this.productManager.getProducts ());
volver nueva ModelAndView ("modelo" "hola", myModel);
}
public void setProductManager (ProductManager ProductManager) {
this.productManager = ProductManager;
}
}
Tambin vamos a tener que modificar los InventoryControllerTests para suministrar
un ProductManager y extraer el valor de "ahora" del modelo de mapa antes de las
pruebas pasarn de nuevo.
'Springapp / test / web / InventoryControllerTests.java' :
springapp.web paquete;
java.util.Map importacin;
org.springframework.web.servlet.ModelAndView de importacin;
springapp.service.SimpleProductManager importacin;
springapp.web.InventoryController importacin;
junit.framework.TestCase importacin;
Clase pblica InventoryControllerTests extiende TestCase {
public void testHandleRequestView () throws Exception {
InventoryController controlador = new InventoryController ();
controller.setProductManager (nueva SimpleProductManager ());
ModelAndView ModelAndView = controller.handleRequest (null, null);
assertEquals ("hola", modelAndView.getViewName ());
assertNotNull (modelAndView.getModel ());
Mapa modelMap = (Mapa) modelAndView.getModel () conseguir
("modelo.");
Cadena nowValue = (String) modelMap.get ("ahora");
assertNotNull (nowValue);
}
}
el
momento
de
aadir
un SimpleProductManager a
nuestro
archivo
de
id
clase
"springapp.service.SimpleProductManager">
"ProductManager"
id
clase
"MessageSource"
"org.springframework.context.support.ResourceBundleMessageSource">
<Property name = "nombre base" value = "mensajes" />
</ Bean>
<Nombre
del
bean
"/
hello.htm"
class
"springapp.web.
InventoryController ">
<Property name = "ProductManager" ref = "ProductManager" />
</ Bean>
<Bean
id
clase
"ViewResolver"
"org.springframework.web.servlet.view.InternalResourceViewResolver">
<Propiedad
nombre
valor
"viewClass"
"org.springframework.web.servlet.view.JstlView" />
<Propiedad nombre = valor "prefijo" = "/ WEB-INF / jsp /" />
<Property name = "sufijo" value = ". Jsp" />
</ Bean>
</ Beans>
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 los <fmt: Mensaje /> etiquetas que hemos
aadido a 'hello.jsp' .
'springapp / build / web / WEB-INF / classes / messages.properties' :
title = SpringApp
rbrica = Hola :: SpringApp
felicitacin = Saludos, es ahora
Ahora 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 actualizada
' que
se
proporciona
con
el
Spring
Taglib
prefix
"http://www.springframework.org/tags/form"%>
<Html>
<Head>
<Title> <fmt: message key = "title" /> </ title>
"forma"
uri
<Style>
.Error {color: red; }
</ Style>
</ Head>
<Body>
<H1> <fmt: message key = "priceincrease.heading" /> </ h1>
<Form: form method = "post" CommandName = "priceIncrease">
<Table width = "95%" bgcolor = "f8f8ff" border = "0" cellspacing = "0"
cellpadding = "5">
<Tr>
<Td align = "right" width = "20%"> Aumento (%): </ td>
<Td width = "20%">
<Form: entrada path = "porcentaje" />
</ Td>
<Td width = "60%">
<Form: ruta errores = "porcentaje" CssClass = "error" />
</ Td>
</ Tr>
</ Table>
<br>
<Input type = "submit" align = "center" value = "Ejecutar">
</ Form: form>
<a href="<c:url value="hello.htm"/> "> Inicio </a>
</ Body>
</ Html>
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);
}
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 () <= minPercentage) {
errors.rejectValue ("porcentaje", "error.too-baja",
La
definicin
de
contexto
de
aplicacin
para
la
springapp
DispatcherServlet ->
<beans>
<Bean id = clase "ProductManager" = "springapp.service.ProductManager">
<Property name = "productos">
<Lista>
<Ref frijol = "producto1" />
<Ref frijol = "product2" />
<Ref frijol = "Product3" />
</ List>
</ Property>
</ Bean>
<Bean id = clase "producto1" = "bus.Product">
<Property name = "description" value = "lmpara" />
<Property name = "precio" value = "5.75" />
</ Bean>
<Bean id = clase "product2" = "bus.Product">
<Property name = "description" value = "Tabla" />
<Property name = "precio" value = "75,25" />
</ Bean>
<Bean id = clase "Product3" = "bus.Product">
<Property name = "description" value = "Presidente" />
<Property name = "precio" value = "22,79" />
</ Bean>
<Bean
id
clase
"MessageSource"
"org.springframework.context.support.ResourceBundleMessageSource">
<Property name = "nombre base" value = "mensajes" />
</ Bean>
<Nombre del bean = clase "/ hello.htm" = "springapp.web.InventoryController">
<Property name = "ProductManager" ref = "ProductManager" />
</ Bean>
<Nombre
del
bean
clase
"/
priceincrease.htm"
"springapp.web.PriceIncreaseFormController">
<Property name = "sessionForm" value = "true" />
<Propiedad nombre = valor "CommandName" = "priceIncrease" />
<Propiedad
nombre
valor
"commandClass"
"springapp.service.PriceIncrease" />
<Property name = "validador">
<Bean class = "springapp.service.PriceIncreaseValidator" />
</ Property>
id
clase
"ViewResolver"
"org.springframework.web.servlet.view.InternalResourceViewResolver">
<Propiedad
nombre
valor
"viewClass"
"org.springframework.web.servlet.view.JstlView" />
<Propiedad nombre = valor "prefijo" = "/ WEB-INF / jsp /" />
<Property name = "sufijo" value = ". Jsp" />
</ Bean>
</ Beans>
A
continuacin,
vamos
echar
un
vistazo
el
controlador
para
este
formulario. El onSubmit (..) mtodo obtiene el control y hace algo de registro antes
de
que
llama
continuacin,
al increasePrice
devuelve
(..) mtodo
un ModelAndView pasar
en
en
la ProductManager objeto. A
una
nueva
instancia
de
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.properties archivo
de recursos.
'springapp / build / web / WEB-INF / classes / messages.properties' :
title = SpringApp
rbrica = Hola :: SpringApp
felicitacin = Saludos, es ahora
priceincrease.heading = Precio Aumentar :: SpringApp
error.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' .
<% @ Include file = "/ WEB-INF / jsp / include.jsp"%>
<Html>
<Head> <title> <fmt: message key = "ttulo" /> </ title> </ head>
<Body>
<H1> <fmt: message key = "la partida" /> </ h1>
<P> <fmt: message key = "saludo" /> <c: Fuera value = "$ {model.now}" />
</ p>
La aplicacin actualizada
4.7. Resumen
Echemos un vistazo a lo que hicimos en la parte 4.
le
una
referencia
un ProductManager para
que
pudiramos
de
que
podamos
empezar
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
nuevo
directorio
puede
abrir una
ventana de
Ahora se puede ejecutar createTable y loadData para preparar los datos de prueba
que utilizaremos ms adelante.
con
la
creacin
de
un
nuevo 'springapp
src
springapp
repositorio directorio para contener clases que se utilizan para el acceso de base de
datos. En este directorio se crea una nueva interfaz llamada ProductDAO . 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 <Producto> getProductList ();
pblica saveProduct void (prod Producto);
}
Seguiremos esto con una clase llamada JdbcProductDao que 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 clase SimpleJdbcDaoSupport ofrece un
cmodo acceso a una ya configurado SimpleJdbcTemplate , as que extender esta
clase. Todos
tendremos
que
dar
en
el
contexto
de
la
aplicacin
configurado DataSource .
'Springapp / src / java / springapp / repositorio / JdbcProductDao.java' :
springapp.repository paquete;
java.sql.ResultSet importacin;
java.sql.SQLException importacin;
es
una
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 <Producto> getProductList () {
logger.info ("productos Cmo!");
Lista de productos> <= productos getSimpleJdbcTemplate (). Consulta (
"Seleccione Identificacin, descripcin, precio de los productos",
nueva ProductMapper ());
devolver los productos;
}
public void saveProduct (prod Producto) {
logger.info ("producto de ahorro:" + prod.getDescription ());
int cuenta = getSimpleJdbcTemplate (). update (
"Los productos de actualizacin Descripcin set =: descripcin, precio =
Precio de donde id =: id",
nueva
MapSqlParameterSource
().
AddValue
("descripcin",
prod.getDescription ())
.addValue ("precio", prod.getPrice ())
.addValue ("id", prod.getId ()));
logger.info ("Filas afectadas:" + count);
}
privada ProductMapper clase esttica implementa ParameterizedRowMapper
<Producto> {
Producto pblica mapRow (ResultSet rs, int rownum) throws SQLException {
Producto prod = nuevo producto ();
prod.setId (rs.getInt ("id"));
prod.setDescription (rs.getString ("descripcin"));
prod.setPrice (nuevo doble (rs.getDouble ("precio")));
volver prod;
}
}
}
Vamos
repasar
los
dos
mtodos
DAO
en
esta
clase. Desde
estamos
primer
mtodo, getProductList
() ejecuta
una
consulta
utilizando
segundo
mtodo
saveProduct
tambin
est
utilizando
volver Identificacin;
}
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 ();
}
}
Esto completa la aplicacin JDBC simple de nuestra capa de persistencia.
podemos
cubrir
todo
eso
en
esta
gua,
pero
vamos
a mostrar
una
podemos
crear
nuestra
clase
de
prueba. Por
una
gran
recibimos la oportunidad de preparar nuestra base de datos con los datos de las
pruebas correspondientes en el onSetUpInTransaction mtodo. Esto es importante,
ya que no sabemos el estado de la base de datos cuando ejecutamos nuestras
pruebas. Mientras exista la tabla vamos a aclararlo y cargar lo que necesitamos
para nuestras pruebas. Desde estamos extendiendo una prueba "transaccional",
cualquier cambio que hagamos sern rodados automticamente una vez que
finalice la prueba.Los deleteFromTables y executeSqlScript mtodos se define en la
superclase, as que no tienen que ponerlas en prctica para cada prueba. Slo tiene
que pasar en los nombres de tabla que desea borrar y el nombre de la secuencia de
comandos que contiene los datos de prueba.
'Springapp / test / springapp / dominio / JdbcProductDaoTests.java' :
springapp.repository paquete;
java.util.List importacin;
org.springframework.test.AbstractTransactionalDataSourceSpringContextTests
de
importacin;
springapp.domain.Product importacin;
JdbcProductDaoTests
clase
pblica
se
extiende
AbstractTransactionalDataSourceSpringContextTests {
privada ProductDAO ProductDAO;
public void setProductDao (ProductDAO ProductDAO) {
this.productDao = ProductDAO;
}
@ Override
String [] getConfigLocations protegidas () {
volver new String [] {"ruta de clase: test-context.xml"};
}
@ Override
void protegida onSetUpInTransaction () throws Exception {
super.deleteFromTables (new String [] {"productos"});
super.executeSqlScript ("file: db / load_data.sql", true);
}
pblica testGetProductList void () {
Lista <productos> productos productDao.getProductList = ();
assertEquals ("nmero incorrecto de productos?", 3, products.size ());
}
pblica testSaveProduct void () {
Lista <productos> productos productDao.getProductList = ();
para (p producto: productos) {
p.setPrice (200.12);
productDao.saveProduct (p);
}
Lista <Producto> updatedProducts = productDao.getProductList ();
id
"dataSource"
class
"org.springframework.jdbc.datasource.DriverManagerDataSource">
<Propiedad
nombre
valor
"driverClassName"
"$
{jdbc.driverClassName}" />
<Propiedad nombre = valor "url" = "$ {jdbc.url}" />
<Property name = "nombre de usuario"
"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<Property name = "ubicaciones">
<Lista>
<Valor> classpath: jdbc.properties </ value>
</ List>
</ Property>
</ Bean>
<Bean id = "transactionManager"
class
"org.springframework.jdbc.datasource.DataSourceTransactionManager">
<Property name = "dataSource" ref = "dataSource" />
</ Bean>
</ Beans>
5.6. Resumen
Hemos 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.
arranque creado.
opcin
de
configuracin. Tambin
cambiamos
//
//
this.products = productos;
}
pruebas
unitarias. Vamos
aadir
una
clase
interna
(nueva
InMemoryProductDao
(nulo));
productManager.increasePrice (POSITIVE_PRICE_INCREASE);
}
capturas (NullPointerException ex) {
fallar ("Productos lista es nula.");
}
}
testIncreasePriceWithEmptyListOfProducts public void () {
try {
ProductManager = new SimpleProductManager ();
productManager.setProductDao (nueva InMemoryProductDao (new
ArrayList <Producto> ()));
//productManager.setProducts(new ArrayList <Producto> ());
productManager.increasePrice (POSITIVE_PRICE_INCREASE);
}
catch (Exception ex) {
fallar ("Productos lista est vaca.");
}
}
pblica testIncreasePriceWithPositivePercentage void () {
productManager.increasePrice (POSITIVE_PRICE_INCREASE);
doble expectedChairPriceWithIncrease = 22,55;
doble expectedTablePriceWithIncrease = 165,11;
Lista de productos> <= productos productManager.getProducts ();
Producto = products.get (0);
assertEquals (expectedChairPriceWithIncrease, product.getPrice ());
producto = products.get (1);
assertEquals (expectedTablePriceWithIncrease, product.getPrice ());
}
}
Tambin tenemos que modificar los InventoryControllerTests desde esa clase
tambin
utiliza
el SimpleProductManager . Aqu
est
modificadosInventoryControllerTests :
'Springapp / test / springapp / servicio / InventoryControllerTests.java' :
springapp.web paquete;
java.util.Map importacin;
java.util.ArrayList importacin;
org.springframework.web.servlet.ModelAndView de importacin;
springapp.domain.Product importacin;
springapp.repository.InMemoryProductDao importacin;
springapp.service.SimpleProductManager importacin;
springapp.web.InventoryController importacin;
junit.framework.TestCase importacin;
InventoryControllerTests clase pblica se extiende TestCase {
public void testHandleRequestView () throws Exception {
InventoryController controlador = new InventoryController ();
la
id
clase
"MessageSource"
"org.springframework.context.support.ResourceBundleMessageSource">
<Property name = "nombre base" value = "mensajes" />
</ Bean>
<Nombre del bean = clase "/ hello.htm" = "springapp.web.InventoryController">
<Property name = "ProductManager" ref = "ProductManager" />
</ Bean>
<Nombre
del
bean
clase
"/
priceincrease.htm"
"springapp.web.PriceIncreaseFormController">
<Property name = "sessionForm" value = "true" />
<Propiedad nombre = valor "CommandName" = "priceIncrease" />
<Propiedad
nombre
valor
"commandClass"
"springapp.service.PriceIncrease" />
<Property name = "validador">
<Bean class = "springapp.service.PriceIncreaseValidator" />
</ Property>
<Propiedad nombre = valor "FormView" = "priceincrease" />
<Property name = "successView" value = "hello.htm" />
<Property name = "ProductManager" ref = "ProductManager" />
</ Bean>
<Bean
id
clase
"ViewResolver"
"org.springframework.web.servlet.view.InternalResourceViewResolver">
<Propiedad
nombre
valor
"viewClass"
archivo
de
contexto
de
aplicacin. Este
archivo
se
listener>
</
oyente
de
id
clase
"ProductManager"
"springapp.service.SimpleProductManager">
<Property name = "ProductDAO" ref = "ProductDAO" />
</ Bean>
<Bean id = clase "ProductDAO" = "springapp.repository.JdbcProductDao">
"org.springframework.jdbc.datasource.DataSourceTransactionManager">
<Property name = "dataSource" ref = "dataSource" />
</ Bean>
<AOP: config>
<AOP: asesor pointcut = "ejecucin (. * * * ProductManager .. (..))" consejoref = "txAdvice" />
</ AOP: config>
<Tx: id consejos = "txAdvice">
<Tx: Atributos>
<Tx: nombre del mtodo = "salvar *" />
<Tx: nombre del mtodo = "*" slo lectura = "true" />
</ Tx: atributos>
</ Tx: consejos>
El
punto
de
corte
se
aplica
cualquier
mtodo
llamado
en
la
interfaz
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.properties archivo que hemos creado en la Parte 5.
<Bean id = clase "dataSource" = "org.apache.commons.dbcp.BasicDataSource"
destruye-method = "close">
<Propiedad
nombre
valor
"driverClassName"
"$
{jdbc.driverClassName}" />
<Propiedad nombre = valor "url" = "$ {jdbc.url}" />
<Propiedad nombre = valor "nombre de usuario" = "$ {jdbc.username}" />
<Propiedad nombre = valor "password" = "$ {jdbc.password}" />
</ Bean>
<Bean id = "propertyConfigurer"
class
"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<Property name = "ubicaciones">
<Lista>
<Valor> classpath: jdbc.properties </ value>
</ List>
</ Property>
</ Bean>
Para que todo esto funcione necesitamos algunos archivos jar adicionales estn
presentes en el directorio 'Bibliotecas'. Si no existen, copie aspectjweaver.jar del '/
lib / aspectj 2.5 de primavera-marco' directorio y commons-dbcp.jar y commonspool.jar del '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' :
<? Xml version = "1.0" encoding = "UTF-8"?>
<frijoles xmlns = "http://www.springframework.org/schema/beans"
xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns: AOP = "http://www.springframework.org/schema/aop"
xmlns: tx = "http://www.springframework.org/schema/tx"
xsi: schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd ">
<! - La definicin de contexto de aplicacin de los padres para la aplicacin
springapp ->
<Bean
id
clase
"ProductManager"
"springapp.service.SimpleProductManager">
<Property name = "ProductDAO" ref = "ProductDAO" />
</ Bean>
<Bean id = clase "ProductDAO" = "springapp.repository.JdbcProductDao">
<Property name = "dataSource" ref = "dataSource" />
</ Bean>
<Bean id = clase "dataSource" = "org.apache.commons.dbcp.BasicDataSource"
destruye-method = "close">
<Propiedad
nombre
valor
"driverClassName"
"$
{jdbc.driverClassName}" />
<Propiedad nombre = valor "url" = "$ {jdbc.url}" />
<Propiedad nombre = valor "nombre de usuario" = "$ {jdbc.username}" />
<Propiedad nombre = valor "password" = "$ {jdbc.password}" />
</ Bean>
<Bean id = "propertyConfigurer"
class
"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<Property name = "ubicaciones">
<Lista>
<Valor> classpath: jdbc.properties </ value>
</ List>
</ Property>
</ Bean>
<Bean id = "transactionManager"
class
"org.springframework.jdbc.datasource.DataSourceTransactionManager">
<Property name = "dataSource" ref = "dataSource" />
</ Bean>
<AOP: config>
<AOP: asesor pointcut = "ejecucin (. * * * ProductManager .. (..))" consejoref = "txAdvice" />
</ AOP: config>
<Tx: id consejos = "txAdvice">
<Tx: Atributos>
<Tx: nombre del mtodo = "salvar *" />
<Tx: nombre del mtodo = "*" slo lectura = "true" />
</ Tx: atributos>
La solicitud completa
Se 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. Resumen
Hemos 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.
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.
Referencias:
https://sites.google.com/site/springmvcnetbeans/step-by-step/
http://www.uv.es/grimo/teaching/SpringMVCv4PasoAPaso/index.html (spring
tool)
Apndice A. Referencias
Versin original de este tutorial basado en Eclipse y Tomcat.
http://www.springframework.org/docs/Spring-MVC-step-bystep/index.html
NetBeans IDE 6.0 Descargar
http://download.netbeans.org/netbeans/6.0/final/
Primavera Netbeans Mdulo Release 1.1
http://spring-netbeans.sourceforge.net/
GlassFish V2 UR1
https://glassfish.dev.java.net/downloads/v2ur1-b09d.html
Descarga springapp NetBeans Proyecto para los impacientes
http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?
pluginid=5171