CRUD con Spring MVC Portlet (II): Creando el listado y las acciones de modificación y borrado

2
14955





CRUD con Spring MVC Portlet (II)





CRUD con Spring MVC Portlet (II): Creando el listado y las acciones de modificación y borrado

0. Índice de
contenidos.

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
  • displaytags 1.2

2. Introducción

Este tutorial es la segunda parte del tutorial CRUD con Spring MVC Portlet, por lo que se recomienda al lector que se lo lea antes de continuar con este.

En este tutorial lo primero que vamos a hacer es crear una vista donde se muestren las personas que fuimos dando de alta en el anterior tutorial. Para vamos a ver como la librería displaytags nos puede ayudar en la tediosa tarea de tener que crear una listado con paginación y ordenación de los campos.

Y como no es lo mismo contarlo que picarlo, voy a implementar y explicar esto, pero espero no tardar 21 días. 😉

3. Configurando nuestro proyecto para trabajar con displaytags

Para quien no lo conozca ya, solo decir que esta librería es la salvación cuando tenemos que enfrentarnos al típico problema de las tablas con paginación y ordenación, aunque es mucho más y toda la información la podéis encontrar en http://www.displaytag.org/1.2/

Para configurar nuestro proyecto (maravillas de trabajar con Maven) tenemos que añadir las siguientes dependencias a nuestro pom.xml:


	displaytag
	displaytag
	1.2


	displaytag
	displaytag-portlet
	1.2

A fin de configurar el soporte de portlet de la librería tenemos que crear dentro de nuestra carpeta src/main/resources un fichero llamado displaytag.properties con el siguiente contenido:

factory.requestHelper=org.displaytag.portlet.PortletRequestHelperFactory

4. Creando el listado de personas dadas de alta

Recordad que partimos del proyecto que creamos en el anterior tutorial de la serie y que incluso ya tenemos creada la vista a la que convenientemente llamamos listado_personas.jsp y que invocávamos desde la vista por defecto de nuestro portlet.

Lo primero que tenemos que hacer es editar este jsp, que recordad solo tenía hasta ahora un enlace al alta de la persona.

Aquí ponemos en juego la librería displaytags, para que nos muestre un listado simple de las personas, añadimos el siguiente código al jsp:

<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet"%>
<%@ taglib uri="http://displaytag.sf.net" prefix="display"%>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>

<portlet:defineObjects />


${msgstatus}

<p>

<display:table name="listaPersonas"/>

Con esta llamada la librería requiere un atributo en sesión llamado «listaPersonas» que contenga una lista de elementos de la clase Persona.

Para hacer esto editamos nuestro controlador a fin de recuperar el listado de personas de la base de datos e introducirlo en sesión:

@RequestMapping
protected final String defaultView(ModelMap model) {
	List<Persona> listaPersonas = personaDAO.getAll(Persona.class);
	model.addAttribute("listaPersonas", listaPersonas);
	return "listado_personas";
}

Esto va a generar una tabla en HTML con la información de las personas almacenadas, para darle un aspecto más vistoso, podemos crear el fichero .css que añada estilo a la tabla pero no hay que olvidar importarlo desde el fichero css/main.css que ya existe en nuestro proyecto de esta forma si creamos el fichero displaytags.css tendríamos que añadir la siguiente línea:

@import url("displaytag.css");

Y este podría ser el resultado:

Ahora vamos a personalizar la tabla añadiendo nombres a las columnas, los enlaces para las acciones de edición y borrado, la paginación y la ordenación en memoria.

Esto se consigue con el siguiente código:


	
	
	
	
		
			
			
		
		<a href="${detallePersonaModificacionURL}">
	
	
		
			
			
		
		<a href="${detallePersonaBajaURL}">
	

Fijaos como hemos indicado la paginación de la tabla simplemente añadiendo el atributo pagesize al valor que queramos mostrar por página y la ordenación añadiendo el atributo sortable a true en aquellos campos por lo que queremos ordenar la tabla, en nuestro caso, solo queremos poder ordenar por el nombre. El resultado es el siguiente:

Los nombres de las columnas las tenemos que añadir al fichero messages.properties y para internacionalizar los mensajes propios de la librería displaytags como los que se utilizan en la paginación. Para ello añadimos las siguientes claves dentro del fichero displaytags.properties:

basic.msg.empty_list=No hay registros
basic.empty.showtable=false
basic.msg.empty_list_row=No hay registros
sort.amount=list
paging.banner.placement=bottom
paging.banner.no_items_found=No {0} encontrados.
paging.banner.one_item_found=1 {0} encontrado.
paging.banner.all_items_found={0} {1} encontrados, total {0}.
paging.banner.some_items_found={0} {1} encontrados, mostrando {4} de {5}.
paging.banner.full=[Primera/Anterior] {0} [Siguiente/Última] paging.banner.first=[Primera/Anterior] {0} [Siguiente/Última] paging.banner.last=[Primera/Anterior] {0} [Siguiente/Última] paging.banner.page.link= {0}

En esta URL http://www.displaytag.org/1.2/configuration.html tenéis el listado completo de claves que se pueden internacionalizar.

5. Añadimos las acciones de edición y borrado

En este momento ya tenemos todo preparado para añadir la lógica de edición y borrado de la persona, de forma que si el usuario pulsa en una de estas acciones se muestre la pantalla de detalle de la persona para modificar los datos o borrar el registro.

Para ello vamos a añadir la lógica de redirección modificando el método redirectURL de nuestro controlador de esta forma:

@RequestMapping(params = "futuraAccion")
protected final String redirectURL(ModelMap model,
	@RequestParam("futuraAccion") String futuraAccion,
	@RequestParam(required = false, value = "id") Long id) {
	if ("crud.alta".equals(futuraAccion)) {
		model.addAttribute("personaForm", new PersonaForm());
	} else {
		final Persona persona = personaDAO.findByPK(Persona.class, id);
		model.addAttribute("personaForm", new PersonaForm(persona));
	}
	model.addAttribute("futuraAccion", futuraAccion);
	return "detalle_persona";
}

Esto rellenará los campos del formulario con los datos del registro seleccionado y preparará la siguiente acción que vamos a capturar añadiendo las siguientes funciones en el controlador:

@RequestMapping(params = {"javax.portlet.action=ejecutarAccion", "accion=crud.modificacion"})
protected final void modificarPersona(
		@ModelAttribute("personaForm") PersonaForm personaForm,
		@RequestParam(required=false, value="form.cancelar") String cancelar, Model model) {
	
	if (siUsuarioNoCancelaAccion(cancelar)) {
		personaDAO.update(personaForm.getPersona());
		model.addAttribute("msgstatus", messages.getMessage("status.ok", null, LocaleContextHolder.getLocale()));
	}
}
	
@RequestMapping(params = {"javax.portlet.action=ejecutarAccion", "accion=crud.baja"})
protected final void bajaPersona(
		@ModelAttribute("personaForm") PersonaForm personaForm,
		@RequestParam(required=false, value="form.cancelar") String cancelar, Model model) {
	
	if (siUsuarioNoCancelaAccion(cancelar)) {
		personaDAO.remove(personaForm.getPersona());
		model.addAttribute("msgstatus", messages.getMessage("status.ok", null, LocaleContextHolder.getLocale()));
	}
}

6. Conclusiones

Como veis vamos añadiendo lógica a medida que la vamos necesitando tratando de introducir el mínimo código posible y no reinventando la rueda con la utilización de librerías tan útiles como displaytags.

En el próximo tutorial vamos a ver cómo añadir validación al usuario y pruebas unitarias.

Cualquier duda o sugerencia en la zona de comentarios.

Saludos.


2 COMENTARIOS

  1. Muy bueno tutorial , muchas gracias .

    Yo estoy intento hacer igual que el ejemplo pero sin utilizar maven . pero me sale este error
    16:31:53,256 ERROR [jsp:154] java.lang.NoClassDefFoundError: org/apache/commons/lang/UnhandledException
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
    at java.lang.Class.getConstructor0(Class.java:2699)
    por favor me podias mandar el codigo fuete a este correo , ca.chaparro@hotmail.com
    Muchas gracias , saludos desde cali – colombia ..

  2. Hola
    Mi problema es que si bien muestra los datos, al momento de hacer un click en el nombre de la columna (para que ordene por ejemplo) o en el link «next», la aplicación se cae y lanza un error de página no encontrada (Error 404).
    Hay algo que no estoy haciendo bien es lo único que sé, pero no logro dar con lo que me falta.

    Gracias por el tutorial.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad