Sugerencias de implementación

En esta sección, se abordan algunas sugerencias que te ayudarán a escribir implementaciones más complejas de la biblioteca:

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:

  1. Implementa la interfaz DataTableGenerator y anula getCapabilities() y generateDataTable().
  2. 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.

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:

  1. Implementa la interfaz DataTableGenerator.
  2. Mueve generateDataTable() de tu implementación de DataSourceServlet a tu implementación de DataTableGenerator.
  3. Anula getCapabilities() en tu implementación de DataTableGenerator para mostrar Capabilities.None.
  4. Llama a DataSourceHelper.executeDataSourceServletFlow() desde tu código servlet (doGet() o doPost()) y pasa la implementación de DataTableGenerator. 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 operaciones SQL, SORT_AND_PAGINATION y SELECT.

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:

  1. Extrae y analiza los parámetros de consulta.
  2. Solo para el modo de acceso restringido, verifica que la solicitud se origine en el mismo dominio que el servlet.
  3. 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().
  4. Tu implementación de generateDataTable() genera una tabla de datos.
  5. Ejecuta la consulta de finalización en la tabla de datos generada en el paso 5.
  6. 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 o JSON.