Paginacion: DataTables + Spring

Les cuento que ando un poco alterado llevo 4 tasas de cafe ya termine mi pega y aun traigo energias...

Asi que me pondre a compartir un poco de mi experiencia con estas dos cosas datatables y spring.

En esta ocacion lo que tenemos es una paginacion y tabulacion de datos. Para ello como dice el titulo sera con DataTables y un framework que veo que se usa mucho Spring. Como acceso a datos se utiliza un ORM Hibernate


El ejemplo lo llevare a cabo con una tabulacion de dos columnas (ingrediente y su categoria), las cuales a nivel datos son la union de dos tablas. Realizaremos el ordenamiento por ambas columnas, paginacion y busqueda por texto en ambas columnas.

Caracteristicas:
Comunicacion: Peticiones ajax datatables ya realiza por ti el render de los resultados, genera la peticion al servidor y nosotros solo la procesamos.
Tipo de peticion: GET
Respuesta: Json que se define en la documentacion de datatables
Referencia: DataTables Server-Side

Receta:

Primero definiremos el contenido de nuestro JSP o sistema de templates que utilicen:

 

Bien con esto tenemos ya configurado nuestro paginador de lado del cliente, ahora veamos que necesitamos en nuestro servicio.


Dentro de los parametros que nos llegara al servidor, los mas importantes seran los siguientes:
  • sHecho: Indica la secuencia de peticiones al servidor. En la documentacion recomiendan un parseo a un entero para poder detectar mas facilmente XSS
  • iColumns: Indica el numero de columnas a procesar
  • iDisplayLenght: Indica la cantidad de registros por pagina (hablando del paginador)
  • iDisplayStart: Indica el offset del paginador
  • sSearch: Cadena de filtrado para busquedas
  • iSortingCols: Indica el numero de columna a la cual se realiza el sorting
  • iSortCol_(int): Numero de Columna que realiza el ordenamiento, dado mis pruebas el unico parametro que cambio es el indice 0 y ese es el que tomaremos. Por lo tanto el dato que nos interza es iSortCol_0
  • sSortDir_(int): Direccion de ordenamiento - "desc" or "asc". Al igual que para iSortCol_(int), solo nos intereza el indice 0. sSortDir_0

Nota:Los demas parametros segun la implementacion requerida se le daran uso, para mi caso y mi implementacion no se requieren.

Bien ahora lo que realizaremos es declarar tres POJOs que me ayudan a mantener esos parametros y los datos del response:

IngredientesRequest:

 

ColumnFilter:

 

IngredientesResponse:

 

Bueno con estas tres clases cumplimos con los requisitos de respuesta de datatables y tomamos algunos parametros de interes.
Por el lado de los datos tenemos lo siguiente:

Ingrediente:
 

Categoria:
 

En este punto solo tenemos dos partes Datos y Cliente... nos falta nuestra logica de busqueda y el controlador

En nuestra logica de busqueda meteremos hibernate (por que? Por que regularmente ya muchos tendran Hibernate como ORM, en mi experiencia prefiero MyBatis me hizo la vida mas facil en estos casos)

Bueno esto no se trata de ver que es mejor o no asi que vamos por nuestro manipulador de datos:

IngredientesHelper: Lo llamo helper por que un DAO desde mi semantica ya esta hecho (trabajo que realiza el ORM, pero bueno tampoco esta bajo discucion).

Nota:Esta clase hereda de una clase que tiene acceso al manager asi que solo lo utilizo.
 

Bueno ya que tenemos como sacar nuestra informacion de la DB segun los parametro de busqueda y ordenacion, vamos por nuestro controlador.

IngredientesController:
 

Y bueno parece ser que es todo, con la anotacion @ResponseBody el POJO que almacena la respuesta segun lo pedido por datatables se traduce aun JSon como no se magia negra de Spring :s, pero bueno funciona :)

Bueno cualquier duda o pregunta pueden googlear o hacerlo por este mismo canal :) y espero que les sea de ayuda :)

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

agregar parametro

Hola, ¿Como podría agregar un parámetro dentro de la llamada ajax? quisiera crear un formulario que se reenvié con datos de filtro en el ajax de esta consulta permitiendo que la búsqueda sea customizada.

Imagen de arterzatij

Con el API de busqueda

Con el API de busqueda puedes agregar un formulario, siempre y cuando este formulario tenga que ver con las columnas que estas utilizando en la tabla. Ya que de otra forma no tiene sentido la busqueda.

https://datatables.net/reference/api/column().search()