Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Hola,
el objetivo de este blog es mostrar cómo puede implementar tablas completamente
funcionales y de alto rendimiento utilizando el complemento jQuery DataTables .
Básicamente, hay muchas maneras de obtener sus datos en DataTables, y si está trabajando
con grandes bases de datos, es posible que desee considerar el uso de las opciones del lado del
servidor que proporciona DataTables. Básicamente, todo el filtrado, paginación, clasificación,
cambio de longitud de página, etc. y DataTables es solo un módulo de eventos y
visualización. Las dos formas preferidas para el procesamiento de JQuery Datatable son el
procesamiento del lado del cliente y el procesamiento del lado del servidor . Este es un
complemento de JavaScript implementado utilizando la biblioteca jQuery que maneja toda la
interacción necesaria con el usuario en el lado del cliente. Entonces, aquí se me ocurrió un blog
para jQuery Datatable porque me gustó mucho este control. Este artículo muestra cómo
el complemento jQuery DataTablesSe puede integrar en aplicaciones web Java.
Este ejemplo muestra cómo puede generar una tabla de estudiantes y agregar el
complemento jQuery DataTables a la tabla HTML. En ese caso, Todo se implementa utilizando
funcionalidades de JavaScript, por lo que no necesita hacer nada más. Lo único que debe hacer
es generar una tabla simple como en el caso inicial. La nueva tabla mejorada se muestra en la
siguiente figura:
Usando el código
Este ejemplo muestra cómo puede generar una tabla de Estudiantes y agregar el complemento
jQuery DataTables a la tabla HTML. El código está organizado lógicamente en la estructura
MVC:
1. El modelo representa clases que contienen datos y que se mostrarán en el navegador.
2. Las vistas son páginas que se utilizan para mostrar datos al cliente; en este ejemplo, se
utilizan como vistas un JSP y una página HTML sin formato.
3. El controlador es la lógica de la aplicación y representa los servlets que manejan las
solicitudes web y las funciones de utilidad.
También hay un paquete de utilidades que contiene clases que transforman objetos Java en
JSON (esto es necesario porque el complemento jQuery DataTables se comunica con el código
del lado del servidor a través de objetos JSON pero no es necesario para el lado del cliente) y lo
estamos usando tanto con el cliente como con el lado y lado del servidor.
El Modelo es una clase de Estudiante que contiene las siguientes propiedades:
1. Id del Estudiante
2. Nombre del Estudiante
3. Género
4. Dirección
5. Grado
En este ejemplo, he usado una base de datos MYSQL llamada MyDB (para crear el comando de
la base de datos y la tabla de estudiantes, he adjuntado el archivo studentDB.sql. Utilice este
archivo para la creación de la base de datos y la tabla de estudiantes), así que he usado una
clase llamada StudentModel ( POJO) que contiene un setter-getter para los parámetros de
estudiante anteriores de la siguiente manera:
StudentModel.java
package com;
return firstName;
}
Las siguientes secciones se presentan con dos casos principales de uso de DataTables en
aplicaciones web Java.
jQuery(document).ready(function() {
studentTable = jQuery('#studentListTable').dataTable({
"bJQueryUI" : true,
"sPaginationType" : "full_numbers",
"bRetrieve" : true,
"bFilter" : true,
"iDisplayLength": 10,
"bProcessing" : true,
"bServerSide" : false,
"aoColumns" : [ { "bSearchable" : false,"bVisible" : false,
"asSorting" : [ "asc" ] },
{"sWidth" : "20%","bSortable" : true },
{"sWidth" : "20%","bSortable" : true },
{"sWidth" : "20%","bSortable" : true },
{"sWidth" : "20%","bSortable" : true },
{"sWidth" : "20%","bSortable" : true }
]
});
jQuery(".ui-corner-br").addClass('ui-widget-header_custom ');
});
1. sPagination: indica al complemento que genere paginación con números en lugar de dos
botones anterior-siguiente, como se genera de forma predeterminada.
2. bJQueryUI: aplicación de estilos jQueryUI estándar.
3. sajaxSource: puede indicar a DataTables que cargue datos desde una fuente externa usando
este parámetro (use aData si desea pasar datos que ya tiene). Simplemente proporcione una
URL desde la que se pueda obtener un objeto JSON. Este objeto debe incluir el parámetro
'aaData', que es la fuente de datos de la tabla.
4. bRetrieve: recupera el objeto DataTables para el selector dado.
5. bProcesando: habilite o deshabilite la visualización de un indicador de 'procesamiento'
cuando la tabla se está procesando.
6. bServerSide: configure DataTables para usar el procesamiento del lado del servidor. Tenga
en cuenta que también se debe proporcionar el parámetro sAjaxSource para dar a DataTables
una fuente para obtener los datos requeridos para cada sorteo.
7. aoColumns: esta matriz le permite apuntar a una columna específica, varias columnas o
todas las columnas, utilizando la propiedad aTargets de cada objeto en la matriz.
8. bsortable: habilite o deshabilite la clasificación en esta columna.
9. sWidth- Definición del ancho de la columna.
10. bSearchable: habilite o deshabilite el filtrado de los datos en esta columna.
11. bVisible: activa o desactiva la visualización de esta columna.
12. clasificación: puede controlar la dirección de clasificación predeterminada e incluso alterar
el comportamiento del controlador de clasificación (es decir, solo una clasificación ascendente
lenta, etc.) usando este parámetro.
Como se mencionó anteriormente, el complemento jQuery DataTables se puede aplicar en una
estructura HTML estática en el navegador. He generado una estructura de tabla usando una
página JSP para hacer una llamada a table-demo.js arriba que se muestra en la lista a
continuación:
2) tabla-demo.jsp
<%@ page
import="com.*,java.util.*"%><!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript">
var basePath = '${pageContext.request.contextPath}';
</script>
<link type="text/css" rel="stylesheet" media="all"
href="${pageContext.request.contextPath}/assets/datatable/css/demo_table_jui.css" >
<link type="text/css" rel="stylesheet" media="all"
href="${pageContext.request.contextPath}/assets/jquery-ui/css/redmond/jquery-ui-1.8.11.custom.css" >
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/jquery-1.5.2.min.js"
></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/jquery-ajax-form-
plugin/jquery.form.js" ></script>
<script type="text/javascript"
src="${pageContext.request.contextPath}/assets/datatable/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/jquery-ui/js/jquery-ui-
1.8.11.custom.min.js" ></script>
<title>Student Form</title>
</head>
<body>
<form>
<div class="titleDiv">Student List</div>
<div class="clearfix"></div>
<div class="formDiv">
<table border="0" margin="0" padding="0" width="100%"
class="dataTables_wrapper" id="studentListTable">
<thead>
<tr>
<th>Id</th>
<th>First Name</th>
<th>Last Name</th>
<th>Gender</th>
<th>Address</th>
<th>Grade</th>
</tr>
</thead>
<tbody>
<%
if(request.getAttribute("studentList") != null){
List<StudentModel> studentList = (List<StudentModel>)
request.getAttribute("studentList");
%>
<%
if( studentList != null ){
for (StudentModel student: studentList){
%>
<tr>
<td><%=student.getSttudentId()%></td>
<td><%=student.getFirstName()%></td>
<td><%=student.getLastName()%></td>
<td><%=student.getGender()%></td>
<td><%=student.getAddress()%></td>
<td><%=student.getGrade()%></td>
</tr>
<%}
}
}%>
</tbody>
</table>
</div>
</form>
</body>
</html>
En esta página JSP se incluyen todas las bibliotecas de JavaScript necesarias y se genera el
código HTML para la tabla de estudiantes. Para fines de demostración, un bucle simple genera
un TR para cada estudiante que devuelve la clase TableDemoAction. Sin embargo, en sus
aplicaciones, puede usar cualquier procesamiento del lado del servidor que desee (JavaBeans,
componentes JSTL, etc.) porque el complemento jQuery DataTables es independiente de la
tecnología del lado del servidor aplicada.
Esta es mi clase de acción (controlador) llamada TableDemoAction que hace una llamada a la
lista de estudiantes que a su vez devuelve la lista de estudiantes. También reenvíe la solicitud a
la página JSP table-demo.jsp.
3) TableDemoAction.java
package com;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class TableDemoAction extends HttpServlet {
RequestDispatcher rd = request.getRequestDispatcher(destination);
rd.forward(request, response);
// @formatter:off
// @formatter:on
String connectionURL = "jdbc:mysql://localhost:3306/MyDB?
user=root&password=mobisoft";
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
al.add(student);
}
resultSet.close();
statement.close();
return al;
}
}
En lugar de la tabla HTML simple, el siguiente componente se muestra en el lado del cliente:
Todas las acciones que ve en el componente se implementan en el lado del cliente (por
ejemplo, cuando ingresa texto en el cuadro de texto, se filtran los elementos TR). Esta es la
forma más rápida para el usuario, bajo el supuesto de que el tiempo necesario para cargar la
tabla no es demasiado grande. Si tiene una gran cantidad de datos, podría considerar usar
DataTables en modo AJAX donde solo se devuelven resultados parciales al complemento.
Puede ver una lista completa de complementos de DataTable adicionales en el sitio de
DataTables. Todos estos complementos son complementos adicionales para DataTables, pero
también puede usar la potente API de DataTables para personalizar el comportamiento. En la
siguiente figura se muestra un ejemplo de la tabla simple mejorada con algunos complementos
mencionados:
Si tiene una cantidad razonable de registros en la tabla, no necesita preocuparse por estas
funcionalidades. Simplemente represente una tabla simple y aplique alguna combinación de
complementos que necesite.
Sin embargo, si tiene muchos registros que se muestran en la tabla y desea evitar el
procesamiento complejo de JavaScript en el navegador, puede implementar la lógica de
procesamiento en el lado del servidor (por ejemplo, en algún servlet) y configurar DataTables
para consulta al servidor a través de llamadas AJAX para obtener información que debe
mostrarse. Este modo se describe en la siguiente sección.
1) datatable-demo.js
var studentTable;
jQuery(document).ready(function() {
studentTable = jQuery('#studentListTable').dataTable({
"bJQueryUI" : true,
"sPaginationType" : "full_numbers",
"iDisplayLength": 10,
"bProcessing" : true,
"bServerSide" : true,
"sAjaxSource" : basePath +"/com/DatatableDemoAction.java",
2) datatable-demo.jsp
<%@ page
import="java.util.*"%><!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript">
var basePath = '${pageContext.request.contextPath}';
</script>
<link type="text/css" rel="stylesheet" media="all"
href="${pageContext.request.contextPath}/assets/datatable/css/demo_table_jui.css" >
<link type="text/css" rel="stylesheet" media="all"
href="${pageContext.request.contextPath}/assets/jquery-ui/css/redmond/jquery-ui-1.8.11.custom.css" >
<script type="text/javascript" src=" $pageContext.request.contextPath}/assets/js/jquery-1.5.2.min.js"
></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/jquery-ajax-form-
plugin/jquery.form.js" ></script>
<script type="text/javascript"
src="${pageContext.request.contextPath}/assets/datatable/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/jquery-ui/js/jquery-ui-
1.8.11.custom.min.js" ></script>
<title>Student Form</title>
</head>
<body>
<form>
<div class="titleDiv">Student List</div>
<div class="clearfix"></div>
<div class="formDiv">
<table border="0" margin="0" padding="0" width="100%"
class="dataTables_wrapper" id="studentListTable">
<thead>
<tr>
<th>Id</th>
<th>First Name</th>
<th>Last Name</th>
<th>Gender</th>
<th>Address</th>
<th>Grade</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</form>
</body>
</html>
En esta página JSP se incluyen todas las bibliotecas de JavaScript necesarias y el código HTML
para generar la tabla de estudiantes. Para fines de demostración, he utilizado el procesamiento
del lado del servidor porque el complemento jQuery DataTables es independiente de la
tecnología del lado del servidor aplicada.
En el tercer paso, hemos creado la clase DemoAction.java que realiza una llamada a la página
JSP ( datatable-demo.jsp ) que a su vez llama al archivo JS ( datatable-demo.js ) y este JS a su
vez realiza una llamada a DatatableDemoAction. Java.
3) DemoAcción.java
package com;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class DemoAction extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException,
IOException {
RequestDispatcher rd = request.getRequestDispatcher(destination);
rd.forward(request, response);
}
}
4) DatatableDemoAction.java
package com;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONArray;
import org.json.JSONObject;
@SuppressWarnings("serial")
public class DatatableDemoAction extends HttpServlet {
if (sStart != null) {
start = Integer.parseInt(sStart);
if (start < 0) {
start = 0;
}
}
if (sAmount != null) {
amount = Integer.parseInt(sAmount);
if (amount < 10 || amount > 50) {
amount = 10;
}
}
if (sCol != null) {
col = Integer.parseInt(sCol);
if (col < 0 || col > 5)
col = 0;
}
if (sdir != null) {
if (!sdir.equals("asc"))
dir = "desc";
}
AMOUNT = amount;
SEARCH_TERM = request.getParameter("sSearch");
COL_NAME = colName;
DIR = dir;
START = start;
try {
result = getStudentData(total, request);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
response.setContentType("application/json");
response.setHeader("Cache-Control", "no-store");
PrintWriter out = response.getWriter();
out.print(result);
}
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String connectionURL = "jdbc:mysql://localhost:3306/MyDB?
user=root&password=mobisoft";
Connection connection = DriverManager.getConnection(connectionURL);
// @formatter:off
String sql = "SELECT " + "id, firstName, lastName, gender, address, "
+ "grade " + "FROM " + "student " + "WHERE "
+ "is_deleted = ? ";
// @formatter:on
if (SEARCH_TERM != "") {
searchSQL = globeSearch;
}
sql += searchSQL;
sql += " order by " + COL_NAME + " " + DIR;
ResultSet rs = statement.executeQuery();
while (rs.next()) {
JSONArray ja = new JSONArray();
ja.put(rs.getString("id"));
ja.put(rs.getString("firstName"));
ja.put(rs.getString("lastName"));
ja.put(rs.getString("gender"));
ja.put(rs.getString("address"));
ja.put(rs.getString("grade"));
array.put(ja);
}
statement.close();
rs.close();
// @formatter:off
String query = "SELECT " + "COUNT(*) as count " + "FROM " + "student "
+ "WHERE " + "is_deleted = ? ";
// @formatter:on
if (SEARCH_TERM != "") {
query += searchSQL;
if (resultSet.next()) {
totalAfterFilter = resultSet.getInt("count");
}
stmt.close();
resultSet.close();
connection.close();
}
try {
result.put("iTotalRecords", total);
result.put("iTotalDisplayRecords", totalAfterFilter);
result.put("aaData", array);
} catch (Exception e) {
return result;
}
// @formatter:on
statement.setBoolean(1, false);
ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
total = resultSet.getInt("count");
}
resultSet.close();
statement.close();
connection.close();
return total;
}
En este ejemplo, hemos usado la biblioteca JSON para serializar objetos Java a JSON, pero
puede usar cualquier otra biblioteca de serialización JSON en su lugar.
Puede encontrar algún ejemplo en el sitio DataTables . Lo único importante es que devuelva
una respuesta JSON con objetos que coincidan con el estado actual de la tabla.
Conclusión
Este ejemplo muestra cómo puede crear tablas efectivas y completamente funcionales en una
aplicación web Java utilizando el complemento jQuery DataTables. Con los ejemplos de código
del artículo, puede mejorar significativamente el aspecto y las funcionalidades de su aplicación
web. Le recomiendo que lo pruebe: cuando integre jQuery DataTables en algunas tablas de su
aplicación, verá que la implementación es sencilla y que, con algo de práctica, podrá
implementar muchas funcionalidades con muy poco esfuerzo.
Puede descargar el ejemplo de código en el proyecto adjunto que se creó en Eclipse Java EE
IDE para desarrolladores web, que se ejecuta en un servidor web Tomcat 6.0 y he
usado Ant para la implementación del proyecto. Le sugiero que cree un nuevo proyecto,
configúrelo con su tomcat (no es necesario ir con Ant si no tiene la configuración de Ant , así
que elimine el archivo build.properties y el archivo build.xml y configure este proyecto con su
configuración local de tomcat ), y agregue clases que pueda encontrar en el proyecto. Espero
que este ejemplo le ayude a crear mejores interfaces de tabla.