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:

Usa tu propio servlet

Las implementaciones de fuentes de datos más simples heredan de la clase DataSourceServlet de la biblioteca. Si deseas heredar contenido de una clase que no sea 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 la fuente de datos.Este método usa los siguientes parámetros:
    • Un objeto HttpServletRequest
    • Un objeto HttpServletResponse
    • Tu implementación de la interfaz DataTableGenerator del paso 1 anterior.
    • Es un valor booleano para especificar el modo de acceso restringido o no restringido.

Por ejemplo, si deseas heredar el 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. Transfiere 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 el código del servlet (doGet() o doPost()) y pasa tu 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 utilizar la misma técnica si utilizas un framework de servlet en el que, por lo general, heredas una clase abstracta proporcionada por el framework. 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 la 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 que tiene una gran cantidad de columnas. Si una visualización solicita solo algunas de esas columnas, 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 la SELECT. Para implementar las funciones de SELECT, escribe el 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; el código no proporciona operaciones de consulta.
  • SQL: Tu código proporciona operaciones de consulta en SQL.
  • SORT_AND_PAGINATION: Tu código proporciona operaciones de consulta de orden y 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 maneja cualquier operación de consulta que tu código no proporciona.

Para implementar una función distinta de NONE, anula Capabilities.getCapabilities() y, luego, implementa DataTable.generateDataTable() para consultar el almacén de datos y mostrar una tabla de datos.

En tres de los ejemplos, se muestra cómo implementar capacidades: AdvancedExampleServlet, AdvancedExampleServlet2 y SqlDataSourceServlet. Todos se encuentran en el paquete example. AdvancedExampleServlet2 se analiza en Cómo definir 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. Extraer y analizar 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. Analiza la solicitud para crear dos objetos de consulta: la consulta de fuente de datos y la consulta de finalización. Pasa la consulta de 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. Renderiza la tabla de datos en el formato que especifica la visualización y configura la respuesta del servlet.

Para especificar tu propio flujo de eventos, llama a las funciones auxiliares en datasource.DataSourceHelper. Consulta Cómo definir las funciones y el 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 del objeto HttpServletRequest a DataTableGenerator.generateDataTable. A continuación, se proporciona un código de ejemplo.

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 la 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 sin servlet

Si implementas la biblioteca sin usar un servlet, puedes usar solo aquellas clases y funciones auxiliares que no requieran 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.
  • Regresa la tabla de datos a la visualización en formato HTML, CSV o JSON.