You are on page 1of 7

Avenida de Castilla,1 - Edificio Best Point - Oficina 21B

28830 San Fernando de Henares (Madrid)
tel./fax: +34 91 675 33 06
info@autentia.com - www.autentia.com
Somos su empresa de Soporte a Desarrollo Informático.
Ese apoyo que siempre quiso tener...
1. Desarrollo de componentes y
proyectos a medida
Tecnología
Desarrollo
Sistemas
Gran Empresa
Producción
autentia
Certificación
o Pruebas
Verificación
previa
RFP
Concurso
Consultora 1
Consultora 2
Consultora 3
Equipo propio desarrollo
Piloto
3a
3b
1. Definición de frameworks corporativos.
2. Transferencia de conocimiento de nuevas arquitecturas.
3. Soporte al arranque de proyectos.
4. Auditoría preventiva periódica de calidad.
5. Revisión previa a la certificación de proyectos.
6. Extensión de capacidad de equipos de calidad.
7. Identificación de problemas en producción.
3. Arranque de proyectos basados en nuevas
tecnologías
¿Qué ofrece Autentia Real
Business Solutions S.L?
Para más información visítenos en:
www.autentia.com
Compartimos nuestro conociemiento en:
www.adictosaltrabajo.com
Gestor portales (Liferay)
Gestor de contenidos (Alfresco)
Aplicaciones híbridas
Tareas programadas (Quartz)
Gestor documental (Alfresco)
Inversión de control (Spring)
BPM (jBPM o Bonita)
Generación de informes (JasperReport)
ESB (Open ESB)
Control de autenticación y
acceso (Spring Security)
UDDI
Web Services
Rest Services
Social SSO
SSO (Cas)
Spring MVC, JSF-PrimeFaces /RichFaces,
HTML5, CSS3, JavaScript-jQuery
JPA-Hibernate, MyBatis
Motor de búsqueda empresarial (Solr)
ETL (Talend)
Dirección de Proyectos Informáticos.
Metodologías ágiles
Patrones de diseño
TDD
2. Auditoría de código y recomendaciones de mejora
4. Cursos de formación (impartidos por desarrolladores en activo)
E-mail:
Contraseña:
Inicio Quiénes somos Tutoriales Formación Comparador de salarios Nuestro libro Charlas Más
Deseo registrarme
He olvidado mis datos de
acceso
Entrar
Estás en:
Inicio Tutoriales CRUD con Spring MVC Portlet
Catálogo de servicios
Autentia
Últimas Noticias
Hablando de
coaching ágil,
milagro nocturo y
pruebas de vida
XIII Charla Autentia
- AOS y TDD -
Vídeos y Material
Las metodologías
ágiles como el
catalizador del cambio
XIV Charla Autentia -
ZK
Informática
profesional: Las
reglas no escritas para
triunfar en la empresa.
2ª EDICIÓN
ACTUALIZADA.
Histórico de
NOTICIAS
Últimos Tutoriales
REST y como hacer
con jQuery un PUT
hacia Spring MVC
Selección múltiple de
filas en un datatable
con JSF: haciendo uso
de librerías de
Share |
DESARROLLADO POR:
Rubén Aguilera Díaz-Heredero
Consultor tecnológico de desarrollo de proyectos
informáticos.
Ingeniero en Informática, especialidad en Ingeniería
del Software
Puedes encontrarme en Autentia: Ofrecemos servicios
de soporte a desarrollo, factoría y formación
Somos expertos en Java/J2EE
Regístrate para votar
CRUD con Spring MVC Portlet
0. Índice de contenidos.
1. Entorno
2. Introducción
3. Creando el proyecto
4. Integrando el proyecto con el modelo
5. Creando la vista de detalle de la persona
6. Dar de alta personas
7. Vamos a probarlo
8. Conclusiones
1. Entorno
Este tutorial está escrito usando el siguiente entorno:
Hardware: Portátil Mac Book Pro 17" (2,6 Ghz Intel Core i7, 8 GB DDR3)
Sistema Operativo: Mac OS X Snow Leopard 10.6.4
Spring MVC Portlet 3.0.4
Maven 2.2.1
Eclipse 3.6 (Helios) con M2Eclipse
Liferay 6.0.5
2. Introducción
En este tutorial se plantea como continuación del tutorial Ejemplo básico con Spring MVC Portlet. En
este ocasión vamos a "enriquecer" el ejemplo realizando un portlet que nos permita realizar todas las
operaciones CRUD contra una entidad. Para realizar las operaciones contra la base de datos me voy a
apoyar en el proyecto que creamos en este tutorial Librería de acceso a datos con Spring y JPA
3. Creando el proyecto
Para crear el proyecto tenemos que seguir los mismos pasos que encontramos en este otro tutorial:
4
Fecha de publicación del tutorial: 2011-02-15
Anuncios Google JSP Servlet JSP Shopping Cart Test JSP File
Síguenos a través de:
componentes.
Selección múltiple de
filas en un datatable
con JSF: haciéndolo
nosotros mismos.
Gestión del evento
de cambio de valor
en JSF2:
valueChangeListener.
Jackson y como
deserializar objetos
JSON usando un
constructor
Últimos Tutoriales del
Autor
Librería de acceso a
datos con Spring y
JPA
Ejemplo de Swing
Worker: ¿Por qué se
me congela la interfaz?
Utilización de
Commons Digester
para un sistema de
preferencias
configurable
Ejemplo básico de
Spring MVC Portlet
Trabajando con los
Web Services de
Liferay


Últimas ofertas de
empleo
2010-10-11
Comercial - Ventas -
SEVILLA.
2010-08-30
Otras - Electricidad -
BARCELONA.
2010-08-24
Otras Sin catalogar -
LUGO.
2010-06-25
T. Información -
Analista /
Programador -
BARCELONA.
Ejemplo básico con Spring MVC Portlet.
Lo único que va a cambiar (si queréis) es el nombre del artifactId, el cual vamos a llamar spring-mvc-
crud-portlet.
4. Integrando el proyecto con el modelo
En el tutorial Librería de acceso a datos con Spring y JPA vimos como crear el modelo de datos que
vamos a integrar ahora con nuestro proyecto.
Para integrar el modelo tenemos que añadir la dependencia en el pom.xml de nuestro proyecto, de
esta forma:
view plain print ?
!"# !"#$#%"#%&'(
!%# !)*+,$-"(&'(#)*+,-+.)!.)*+,$-"(
!/# !/*0-1/&0-"(('0,12+*+'3.)1,4!./*0-1/&0-"(
!5# !2#*3-+%("#!267896:;<!.2#*3-+%(
!=# !."#$#%"#%&'(
Ahora para poder utilizar esta dependencia en nuestro proyecto tenemos que editar el fichero WEB-
INF/context/applicationContext.xml de nuestro proyecto para añadir la siguiente línea:
view plain print ?
!"# !-4$+*0 3,4'*3&,>?&1)44@)+AB)@@1.&)+.'-2&'-+,C+2('0,12+*+'3.)1,4#C(1? .(
Lo que estamos haciendo es incorporando la configuración de Spring de nuestro modelo en nuestro
proyecto, por lo que ya sólo tendremos que declarar los DAOs para poder utilizarlos en nuestras clases.
5. Creando la vista de detalle de la persona
Ahora vamos a crear el fichero detalle_persona.jsp dentro de la carpeta jsp/spring-crud-mvc-portlet
con el siguiente contenido:
view plain print ?
!"# !DE +)F1.G *3.>?A++@BHHI)J)#4*-#&'(H@'3+1,+? @3,K.C>?@'3+1,+?D(
!%# !DE +)F1.G *3.>?A++@BHHLLL#4@3.-FK3)(,L'3M#'3FH+)F4? @3,K.C>?4@3.-F?D(
!/# !DE +)F1.G *3.>?A++@BHHLLL#4@3.-FK3)(,L'3M#'3FH+)F4HK'3(? @3,K.C>?K'3(?D(
!5#
!=#
!N# !$+*05#06"#1-%#789#&03 .(
!O#
!P# !$+*05#06/&0-+%,*5 J)3>?,I,&*+)38&&.'-QRS? -)(,>?,I,&*+)38&&.'-?(
!T# !$+*05#06$/*/4 -)(,>?)&&.'-? J)1*,>?UVK*+*3)8&&.'-W?(
"!# !.$+*05#06$/*/4(!.$+*05#06/&0-+%,*5(
""#
"%# !1+*461+*4 )&+.'->?UV,I,&*+)38&&.'-QRSW? &'(()-0-)(,>?@,34'-)X'3(?(
"/# !1+*46:-""#% @)+A>?.09,34'-)?.(
"5# !$(
"=# !3$*-%)64#33/)# &'0,>?@,34'-)#-'(G3,? .(
"N# !1+*46-%$,0 @)+A>?-'(G3,? .(
"O# !.$(
"P# !$(
"T# !3$*-%)64#33/)# &'0,>?@,34'-)#)@,11.0'4? .(
%!# !1+*46-%$,0 @)+A>?)@,11.0'4? .(
%"# !.$(
%%# !$(
%/# !3$*-%)64#33/)# &'0,>?@,34'-)#0.3,&&.'-? .(
%5# !1+*46-%$,0 @)+A>?0.3,&&.'-? .(
%=# !.$(
%N# !3$*-%)64#33/)# &'0,>?UVK*+*3)8&&.'-W? J)3>?K'3(Y-J.)3?.(
%O# !3$*-%)64#33/)# &'0,>?K'3(#&)-&,1)3? J)3>?K'3(Z)-&,1)3?.(
%P# !-%$,0 +[@,>?4*G(.+? J)1*,>?UVK'3(Y-J.)3W?.(
%T# !-%$,0 +[@,>?4*G(.+? J)1*,>?UVK'3(Z)-&,1)3W? -)(,>?K'3(#&)-&,1)3?.(
/!# !.1+*461+*4(
Lo único que estamos haciendo es crear un formulario que nos va a servir para ver el detalle de una
persona y poder hacer un alta, una modificación o eliminarla. Por ahora nos vamos a centrar en el alta
de la persona.
Destacar que para crear el formulario estamos utilizando tags de spring, form se refiere a los
componentes del formulario y spring:message nos permite internacionalizar los mensajes.
Para dar de alta el fichero de mensajes tenemos que añadir lo siguiente al fichero
applicationContext.xml de nuestro proyecto:
view plain print ?
!"# !"#$% %&'()*++,-*./012*( 23,++'(/1-#+41%5-61,)*7/18#2/59*:9#+044/19#;*+/012*<05&3*=*++,-*./012*(&
!># !'()'#(*+ 5,)*'(0+*?/&*@+A*6,039=*++,-*( B,30*'(910*( ,&
!C# !'()'#(*+ 5,)*'(D,+*5,)*+(&
!E# !-./*&
!F# !0$-1#&)*++,-*+!,0$-1#&
!G# !,-./*&
!H# !,'()'#(*+&
!I# !,"#$%&
Con esta configuración tenemos que crear el fichero messages.properties dentro de la carpeta
src/main/resources donde vamos a registrar todas las claves que utilicemos.
Declarando la propiedad "useCodeAsDefaultMessage" a "true" conseguimos que si Spring no encuentra
la clave del mensaje pinte el texto de la clave, en vez de dar un error de despliegue.
Además hemos declarado en el atributo commandName del formulario que vamos a utilizar un bean
llamado personaForm que representa los campos del formulario y permite a Spring mapear los campos
del formulario, va a tener siguiente contenido:
view plain print ?
!"# '$23$4# 2/)#,09*59%,#+41%5-210&)B24/193*9#6/1)+J
!>#
!C# .5')(* K,B,#%/#.*1%,3%L,D3*J
!E#
!F# .5')(* 2/)#,09*59%,#909/1%,3*+#)/&*3#M*1+/5,J
!G# .5')(* 2/)#,09*59%,#909/1%,3*+#)/&*3#K4,#M*1+/5,NM@J
!H#
!I# '1"-.2 2-$// M*1+/5,O/1) .5'-#5#%*/ .*1%,3%L,D3*P
!Q#
"!# '(.0$*# /*$*.2 6.%$- -)%4 +*1%,3R*1+%/5STA ' UIE>F>GHF!!ECF>"QHQ!VJ
""# '(.0$*# V/5- %&M*1+/5,J
"># '(.0$*# .91%5- 5/)D1*J
"C# '(.0$*# .91%5- ,4*33%&/+J
"E# '(.0$*# .91%5- &%1*22%/5J
"F#
"G# '1"-.2 M*1+/5,O/1)WXPY
"H#
"I# '1"-.2 M*1+/5,O/1)WM*1+/5,NM@ 4*1+/5,NM@XP
"Q# *7./#%&M*1+/5, ' 4*1+/5,NM@#-*9T&M*1+/5,WXJ
>!# *7./#5/)D1* ' 4*1+/5,NM@#-*9Z/)D1*WXJ
>"# *7./#,4*33%&/+ ' 4*1+/5,NM@#-*9@4*33%&/+WXJ
>># *7./#&%1*22%/5 ' 4*1+/5,NM@#-*9A%1*22%/5WXJ
>C# Y
>E#
>F# '1"-.2 V/5- -*9T&M*1+/5,WX P
>G# (#*1(% %&M*1+/5,J
>H# Y
>I# '1"-.2 0).8 +*9T&M*1+/5,WV/5- %&M*1+/5,X P
>Q# *7./#%&M*1+/5, ' %&M*1+/5,J
C!# Y
C"# '1"-.2 .91%5- -*9Z/)D1*WX P
C># (#*1(% 5/)D1*J
CC# Y
CE# '1"-.2 0).8 +*9Z/)D1*W.91%5- 5/)D1*X P
CF# *7./#5/)D1* ' 5/)D1*J
CG# Y
CH# '1"-.2 .91%5- -*9@4*33%&/+WX P
CI# (#*1(% ,4*33%&/+J
CQ# Y
E!# '1"-.2 0).8 +*9@4*33%&/+W.91%5- ,4*33%&/+X P
E"# *7./#,4*33%&/+ ' ,4*33%&/+J
E># Y
EC# '1"-.2 .91%5- -*9A%1*22%/5WX P
EE# (#*1(% &%1*22%/5J
EF# Y
EG# '1"-.2 0).8 +*9A%1*22%/5W.91%5- &%1*22%/5X P
EH# *7./#&%1*22%/5 ' &%1*22%/5J
EI# Y
EQ#
F!# Y
6. Dar de alta personas
Para el alta de personas lo primero que vamos a hacer es crear el fichero listado_personas.jsp que va
a ser la vista principal de nuestro portlet y desde donde vamos a llamar a la acción de añadir una
persona, el contenido de este fichero es el siguiente:
view plain print ?
!"# !%& '()*+, -.+/01''23445(6(#7-8#9:;42:.'*<'0 2.<=+>/02:.'*<'0%"
!?# !%& '()*+, -.+/01''2344@@@#72.+8)=.(;<@:.A#:.)4'()70 2.<=+>/072.+8)0%"
!B# !%& '()*+, -.+/01''2344@@@#72.+8)=.(;<@:.A#:.)4'()74=:.;0 2.<=+>/0=:.;0%"
!C# !%& '()*+, 2.<=+>/090 -.+/01''23445(6(#7-8#9:;457'*49:.<D.'0 %"
!E#
!F# !#$%&'(&)*(+,-(./0(1&2 3"
!G#
!H# !1),+ '<7'/0IJ;7)7'('-7 K/ 8-**L0"
!M# !# 9*(77/02:.'*<'N;7)N7-99<770"IJ;7)7'('-7L!3#"
"!# !31),+"
""#
"?# !#$%&'(&)%(-*(%4%' 6(./0O<'(**<P<.7:8(Q*'(RST0"
"B# !#$%&'(&)#5%56 8(;</0=-'-.(Q99+:80 6(*-</09.-O#(*'(0"!3#$%&'(&)#5%56"
"C# !3#$%&'(&)%(-*(%4%'"
"E# !#"!5 1.<=/0IJO<'(**<P<.7:8(Q*'(RSTL0"!2#%,-7)6(2257( 9:O</0=:.;#(8(O+.P<.7:8(03"!35"!3#"
Con la etiqueta portlet:renderURL estamos creando la URL necesaria para poder navegar a la ventana
de detalle indicando que la acción que se quiere realizar es el alta.
Para visualizar este jsp como pantalla por por defecto de nuestro portlet lo único que tenemos que
hacer indicarlo en la función marcada con @RequestMapping de esta manera:
view plain print ?
!"# &S<U-<7'V(22+8)
!?# #%$&(1&(* +,-5' W'.+8) O<=(-*'X+<@YV:O<* ;:O<*Z J
!B# %(&4%- 0*+7'(O:D2<.7:8(70[
!C# L
De esta forma lo primero que veremos al cargar el portlet será un enlace a la pantalla que nos permite
dar de alta una persona, que no es otra que detalle_persona.jsp
Para redireccionar nuestro portlet a esta pantalla, primero tenemos que capturar la acción de render
de esta forma:
view plain print ?
!"# &S<U-<7'V(22+8)Y2(.(;7 / 0=-'-.(Q99+:80Z
!?# #%$&(1&(* +,-5' W'.+8) .<O+.<9'RSTYV:O<* ;:O<*\
!B# &S<U-<7'P(.(;Y0=-'-.(Q99+:80Z W'.+8) =-'-.(Q99+:8Z J
!C#
!E# ,+ Y09.-O#(*'(0#<U-(*7Y=-'-.(Q99+:8ZZ J
!F# ;:O<*#(OOQ''.+,-'<Y02<.7:8(]:.;0\ -(8 P<.7:8(]:.;YZZ[
!G# L
!H# ;:O<*#(OOQ''.+,-'<Y0=-'-.(Q99+:80\ =-'-.(Q99+:8Z[
!M# %(&4%- 0O<'(**<D2<.7:8(0[
"!# L
Con la anotación @RequestMapping(params="futuraAccion") lo que hacemos es declarar que este
método de render se va ejecutar cuando en la URL se esté pasando un parámetro llamado
"futuraAccion" independientemente de su valor.
Con la anotación @RequestParam("futuraAccion") estamos recuperando el valor concreto de ese
parámetro, el cual vamos a introducir en el modelo ya que nos va a servir para determinar que acción
tiene que ejecutar el botón de acción del formulario de detalle de la persona.
Ahora tenemos que crear el método que se va encargar de realizar la persistencia de la persona, el
cual se va invocar cuando exista el parámetro "ejecutarAccion" dentro de la URL y el parámetro
"accion" coincida con el texto "crud.alta". Con lo que el método quedaría declarado de esta forma:
view plain print ?
!"# %&'()*+,'
!-# !"#$%&' .'+()/0123 4'+()/01235
!6#
!7# %&'()*+,'
!8# !"#$%&' &'()*+,'9*/:;'<'((0='>)*+,' ?'((0='(5
!@# AAA
!B# %&'C*'(D<044E/=F40+0?( G HIJ0K0L#4)+D;'D#0,DE)/G'J',*D0+2,,E)/IM I0,,E)/G,+*:#0;D0INO
!P# !"(&')&'* +#,%- $(#* E/('+D0+.'+()/0F
!Q# %<):';2DD+ER*D'FI4'+()/0S)+?IO .'+()/0S)+? 4'+()/0S)+?M
"!# %&'C*'(D.0+0?FI0,,E)/IO >D+E/= 0,,E)/M
""# %&'C*'(D.0+0?F+'C*E+':G+%-.'M K0;*'GIT)+?#,0/,';0+IO >D+E/= ,0/,';0+O H
"-#
"6# #+ F(EU(*0+E)V)W0/,';02,,E)/F,0/,';0+OO H
"7# 4'+()/0123#E/('+DF4'+()/0S)+?#='D.'+()/0FOO5
"8# ?):';#0::2DD+ER*D'FI?(=(D0D*(IM
"@# ?'((0='(#='D<'((0='FI(D0D*(#)XIM ,/--M Y),0;'W)/D'LDZ);:'+#='DY),0;'FOOO5
"B# N
"P# N
En caso de que el usuario pulse en el botón de cancelar, no hacemos nada, y si pulsa en el botón de
alta, directamente introducimos esa información en la base de datos apoyándonos en nuestro proyecto
model-tutoriales.
En un caso "real" seguramente no interese hacer directamente el acceso a la base de datos desde el
controlador y habrá que crear una capa de servicios que se encargue de hacer este acceso, para poder
reutilizar el código o crear una capa de REST, por ejemplo. El diseño dependerá del alcance de nuestro
proyecto.
Como no decimos lo contrario, después de ejecutar este método el portlet mostrará la vista por
defecto, mostrando un mensaje proceso realizado correctamente.
7. Vamos a probarlo
Para probar nuestro desarrollo, lo único que tenemos que ejecutar mvn clean package de nuestro
proyecto, y desplegar nuestro .war en el servidor de Liferay. En caso de utilizar el plugin de Liferay, lo
podemos hacer directamente ejecutando: mvn liferay:deploy, esta acción NO realiza previamente el
package del proyecto.
Una vez desplegado correctamente, instanciamos el portlet en cualquier página de nuestro portal y
deberíamos ver algo pareciado a esto:
Para acceder a la pantalla de alta, pinchamos en el enlace que se muestra, rellenamos los datos del
formulario y pulsamos en el botón de alta, con lo que si vamos a la base de datos configurada
podremos ver que efectivamente se ha insertado nuestro registro.
8. Conclusiones
Lo vamos a dejar aquí, en el próximo tutorial vamos a ver como mostrar un listado con todos las
personas que vamos dando de alta, utilizando la librería displaytags que nos permite tener tablas
paginadas de una forma muy cómoda. Además, en posteriores tutoriales, veremos como modificar y
eliminar personas, como añadir validación a nuestro formulario y hacer pruebas unitarias.
Cualquier duda o sugerencia en la zona de comentarios.
Esta obra está licenciada bajo licencia Creative Commons de Reconocimiento-No comercial-Sin obras derivadas 2.5
Puedes opinar o comentar cualquier sugerencia que quieras comunicarnos sobre este tutorial; con
tu ayuda, podemos ofrecerte un mejor servicio.
Enviar comentario
(Sólo para usuarios registrados)
» Registrate y accede a esta y otras ventajas «
Anímate y coméntanos lo que pienses sobre este TUTORIAL:
Saludos.
COMENTARIOS
Copyright 2003-2011 © All Rights Reserved | Texto legal y condiciones de uso | Banners | Powered by Autentia | Contacto