En esta sección, se abordan algunas sugerencias que te ayudarán a escribir implementaciones más complejas de la biblioteca:
- Usa tu propio servlet
- Definición de capacidades
- Cómo personalizar el flujo de eventos
- Pasa parámetros a
DataTableGenerator.generateDataTable
- Implementa una fuente de datos que no es de servlet
Cómo usar su propio servlet
Las implementaciones de fuentes de datos más simples heredan de la clase DataSourceServlet
de la biblioteca.
Para heredar de una clase distinta de DataSourceServlet
, implementa una fuente de datos de la siguiente manera:
- Implementa la interfaz
DataTableGenerator
y anulagetCapabilities()
ygenerateDataTable()
. - Llama a
DataSourceHelper.executeDataSourceServletFlow()
desde el código de tu servlet para ejecutar el flujo de fuente de datos.Este método toma los siguientes parámetros:- Un objeto
HttpServletRequest
. - Un objeto
HttpServletResponse
. - Tu implementación de la interfaz de
DataTableGenerator
del paso 1 anterior. - Un valor booleano para especificar el modo de acceso restringido o no restringido.
- Un objeto
Por ejemplo, si deseas heredar tu servlet de otra clase de servlet, llamada AuthServlet
, que proporciona autenticación integrada, puedes reescribir SimpleServletExample
para heredar AuthServlet
en lugar de DataSourceServlet
de la siguiente manera:
- Implementa la interfaz
DataTableGenerator
. - Mueve
generateDataTable()
de tu implementación deDataSourceServlet
a tu implementación deDataTableGenerator
. - Anula
getCapabilities()
en tu implementación deDataTableGenerator
para mostrarCapabilities.None
. - Llama a
DataSourceHelper.executeDataSourceServletFlow()
desde tu código servlet (doGet()
odoPost()
) y pasa la implementación deDataTableGenerator
. Este método ejecuta todo el flujo de la fuente de datos, incluida la renderización de los resultados de la fuente de datos en la respuesta del servlet.
Puedes usar la misma técnica si utilizas un marco de trabajo de servlet en el que normalmente heredas una clase abstracta que proporciona el marco de trabajo.
Por ejemplo, si usas WebWork, es posible que quieras heredar la clase ActionSupport
.
Definición de capacidades
Si tu almacén de datos contiene una gran cantidad de datos y deseas aumentar la eficiencia de tu fuente de datos, puedes usar las capacidades de consulta de tu almacén de datos. Por ejemplo, supongamos que tu almacén de datos es una base de datos y que la base de datos tiene una gran cantidad de columnas. Si una visualización solicita solo algunas de esas columnas, entonces ejecutar una operación SELECT
dentro de la base de datos es más eficiente que recuperar todas las columnas y usar las capacidades de consulta de la biblioteca para realizar SELECT
.
Para implementar las capacidades de SELECT
, escribe código a fin de ejecutar una operación SELECT
dentro de la base de datos y mostrar una tabla de datos.
Usa la enumeración Capabilities
para definir las capacidades de consulta que proporciona tu código. Las opciones disponibles son las siguientes:
NONE
: Es el valor predeterminado; tu código no proporciona operaciones de consulta.SQL
: Tu código proporciona operaciones de consulta de SQL.SORT_AND_PAGINATION
: Tu código proporciona operaciones de consulta de clasificación y de paginación.SELECT
: Tu código proporciona una operación de selección.ALL
: Tu código proporciona operacionesSQL
,SORT_AND_PAGINATION
ySELECT
.
Nota: En todos los casos, la biblioteca se encargará de cualquier operación de consulta que tu código no proporcione.
A fin de implementar una función que no sea NONE
, anula Capabilities.getCapabilities()
y, luego, implementa DataTable.generateDataTable()
para consultar el almacén de datos y mostrar una tabla de datos.
Tres de los ejemplos ilustran cómo implementar capacidades: AdvancedExampleServlet
, AdvancedExampleServlet2
y SqlDataSourceServlet
.
Todos están en el paquete example
. AdvancedExampleServlet2
se analiza en Define capacidades y el flujo de eventos.
Cómo personalizar el flujo de eventos
El flujo de eventos predeterminado se define en DataSourceHelper.executeDataSourceServletFlow
.
El flujo predeterminado es el siguiente:
- Extrae y analiza los parámetros de consulta.
- Solo para el modo de acceso restringido, verifica que la solicitud se origine en el mismo dominio que el servlet.
- Analizar la solicitud para crear dos objetos de consulta: la consulta sobre la fuente de datos y la consulta de finalización Pasa la consulta de la fuente de datos a tu implementación de
generateDataTable()
. - Tu implementación de
generateDataTable()
genera una tabla de datos. - Ejecuta la consulta de finalización en la tabla de datos generada en el paso 5.
- Procesar la tabla de datos en el formato especificado por la visualización y configurar la respuesta del servlet
Para especificar tu propio flujo de eventos, llama a las
funciones auxiliares en datasource.DataSourceHelper
. Consulta Definición de capacidades y flujo de eventos para ver una implementación de ejemplo.
Cómo pasar parámetros a DataTableGenerator.generateDataTable
Puedes usar HttpServletRequest.setAttribute
para pasar datos que no forman parte de una consulta o un objeto HttpServletRequest
a DataTableGenerator.generateDataTable
. El código de ejemplo se proporciona a continuación.
En el código de tu servlet, coloca el objeto que deseas pasar al HttpServletRequest
de la siguiente manera:
request.setAttribute("my_object_name", myObject); DataSourceHelper.executeDataSourceServletFlow(request, response, dataTableGenerator);
En la implementación de tu interfaz dataTableGenerator
, obtén el objeto de HttpServletRequest
de la siguiente manera:
public DataTable generateDataTable(Query query, HttpServletRequest request){ Object myObject = request.getAttribute("my_object_name"); // Add your code to manipulate myObject here }
Cómo implementar una fuente de datos que no es de servlet
Si implementas la biblioteca sin usar un servlet, puedes usar solo esas clases y funciones auxiliares que no requieren un entorno de servlet. Estas incluyen las clases Query
y DataTable
, y algunas de las funciones DataSourceHelper
, como parseQuery
, applyQuery
, validateQuery
y splitQuery
.
Puedes usar estas clases y funciones para hacer lo siguiente:
- Analizar una consulta de visualización
- Dividir la consulta en una consulta de fuente de datos y una consulta de finalización
- Ejecuta la consulta de finalización para generar una tabla de datos.
- Muestra la tabla de datos a la visualización en formato
HTML
,CSV
oJSON
.