Definición de capacidades y el flujo de eventos

En esta sección, se presenta AdvancedExampleServlet2. AdvancedExampleServlet2 es una implementación de fuente de datos de ejemplo que define capacidades y el flujo de eventos. En esta sección, también se proporcionan instrucciones paso a paso sobre cómo ejecutar y probar AdvancedExampleServlet2.

Nota: Debes completar la sección Cómo comenzar antes de comenzar esta sección.

Presentamos AdvancedExampleServlet2

La clase AdvancedExampleServlet2 se encuentra en el paquete examples. Esta clase proporciona una implementación de ejemplo que define las capacidades y el flujo de eventos.

Las partes más importantes de AdvancedExampleServlet2 se describen en las siguientes secciones:

Cómo definir el flujo de eventos

AdvancedExampleServlet2 define el flujo de eventos mediante la anulación del método HttpServlet.doGet() y la llamada a varias funciones auxiliares que proporciona DataSourceHelper.

El siguiente fragmento anula doGet(). El parámetro HttpServletRequest encapsula la solicitud realizada por una visualización al servlet. El parámetro HttpServletResponse encapsula la respuesta del servlet a la visualización de consultas. Este fragmento también configura dsRequest como nulo. dsRequest se usa en varios puntos del resto del código.

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    DataSourceRequest dsRequest = null;

En el siguiente fragmento, se extraen los parámetros de solicitud de HttpServletRequest para crear el contexto en el que se ejecuta la solicitud.

    try {
      // Extract the request parameters.
      dsRequest = new DataSourceRequest(req);

El siguiente fragmento toma la consulta del objeto dsRequest y la divide en dos consultas separadas. Una consulta se llama consulta de la fuente de datos y la otra, consulta de finalización. Debido a que la capacidad declarada de la fuente de datos es SELECT, la consulta de la fuente de datos consiste en una operación SELECT si el objeto dsRequest incluye una operación SELECT. La consulta de finalización consta de todas las demás operaciones requeridas por la solicitud, que también pueden incluir una operación SELECT. Por ejemplo, si la consulta solicitada es SELECT a ORDER BY b, la consulta de la fuente de datos será SELECT a, b y la consulta de finalización será la misma que la consulta original SELECT a ORDER BY b.

      // Split the query.
      QueryPair query = DataSourceHelper.splitQuery(dsRequest.getQuery(), Capabilities.SELECT);

El siguiente fragmento toma la consulta de la fuente de datos creada por el fragmento anterior y la HttpServletRequest,, y crea una tabla de datos. Consulta la sección Usa funciones para obtener más detalles.

      // Generate the data table.
      DataTable data = generateMyDataTable(query.getDataSourceQuery(), req);

El siguiente código toma la consulta de finalización que se produjo cuando se dividió la consulta, la tabla de datos que produjo el fragmento anterior y la configuración regional del usuario de la visualización de consultas. Luego, el código crea una tabla de datos nueva.

      // Apply the completion query to the data table.
      DataTable newData = DataSourceHelper.applyQuery(query.getCompletionQuery(), data,
          dsRequest.getUserLocale());

El siguiente código toma la tabla de datos producida por el fragmento anterior y los parámetros de solicitud de HttpServletRequest. Luego, el código establece la respuesta del servlet. El contenedor de servlet muestra esta respuesta a la visualización de consultas.

      DataSourceHelper.setServletResponse(newData, dsRequest, resp);

Cómo manejar errores

El siguiente fragmento captura una excepción, obtiene el mensaje apropiado, da formato a la respuesta y establece la respuesta del servlet. Si dsRequest es nulo, DataSourceRequest no está disponible, posiblemente debido a un error del constructor. En este caso, se usa HttpRequest en lugar de DataSourceRequest.

    catch (RuntimeException rte) {
      log.error("A runtime exception has occured", rte);
      ResponseStatus status = new ResponseStatus(StatusType.ERROR, ReasonType.INTERNAL_ERROR,
          rte.getMessage());
      if (dsRequest == null) {
        dsRequest = DataSourceRequest.getDefaultDataSourceRequest(req);
      }
      DataSourceHelper.setServletErrorResponse(status, dsRequest, resp);
    } catch (DataSourceException e) {
      if (dsRequest != null) {
        DataSourceHelper.setServletErrorResponse(e, dsRequest, resp);
      } else {
        DataSourceHelper.setServletErrorResponse(e, req, resp);
      }
    }

Cómo usar parámetros de URL

El siguiente fragmento toma la consulta de la fuente de datos que se creó cuando se dividió la consulta y la HttpServletRequest. De manera opcional, HttpServletRequest puede incluir un parámetro tableId especificado como una URL. Este parámetro tableId determina qué tabla de datos se muestra de la siguiente manera:

  • Si se omite el parámetro tableId o es algo distinto de planets, la fuente de datos muestra la tabla de datos de animales.
  • Si el parámetro tableId se especifica como planets, la fuente de datos muestra la tabla de datos de planetas.

Cuando escribes tu propio código para mostrar una tabla de datos, tú decides qué parámetros tomar.

  private DataTable generateMyDataTable(Query query, HttpServletRequest req)
      throws TypeMismatchException {
    String tableID = req.getParameter("tableId");
    if ((tableID != null) && (tableID.equalsIgnoreCase("planets"))) {
      return generatePlanetsTable(query);
    }
    return generateAnimalsTable(query);
  }

Cómo usar las funciones

En el siguiente fragmento, se toma la consulta y se genera la tabla de datos animals.

private DataTable generateAnimalsTable(Query query) throws TypeMismatchException {
  DataTable data = new DataTable();
  List requiredColumns = getRequiredColumns(query,
      ANIMAL_TABLE_COLUMNS);
  data.addColumns(requiredColumns);

  // Populate the data table
  for (String key : animalLinksByName.keySet()) {
    TableRow row = new TableRow();
    for (ColumnDescription selectionColumn : requiredColumns) {
      String columnName = selectionColumn.getId();
      if (columnName.equals(ANIMAL_COLUMN)) {
        row.addCell(key);
      } else if (columnName.equals(ARTICLE_COLUMN)) {
        row.addCell(animalLinksByName.get(key));
      }
    }
    data.addRow(row);
  }
  return data;
}

En el siguiente fragmento, se toma la consulta y se genera la tabla de datos planets.

private DataTable generatePlanetsTable(Query query) throws TypeMismatchException {
  DataTable data = new DataTable();
  List requiredColumns = getRequiredColumns(
      query, planetTableColumns);
  data.addColumns(requiredColumns);

  // Populate data table
  for (Planet planet : Planet.values()) {
    TableRow row = new TableRow();
    for (ColumnDescription selectionColumn : requiredColumns) {
      String columnName = selectionColumn.getId();
      if (columnName.equals(PLANET_COLUMN)) {
        row.addCell(planet.name());
      } else if (columnName.equals(MASS_COLUMN)) {
        row.addCell(planet.getMass());
      } else if (columnName.equals(GRAVITY_COLUMN)) {
        row.addCell(planet.getSurfaceGravity());
      } else if (columnName.equals(MOONS_COLUMN)) {
        row.addCell(planet.getNumberOfMoons());
      }
    }
    data.addRow(row);
  }
  return data;
}

Ejecución y prueba AdvancedExampleServlet2

En esta sección, se proporcionan instrucciones sobre cómo ejecutar y probar AdvancedExampleServlet2.

Para ejecutar y probar AdvancedExampleServlet2, actualiza tu aplicación web y configura una visualización que consulte la fuente de datos, como se describe en las siguientes secciones:

Cómo actualizar una aplicación web en Apache Tomcat

Sigue o adapta las instrucciones a continuación para actualizar tu aplicación web en Apache Tomcat. Estas instrucciones son específicas de Apache Tomcat en un sistema Windows:

  1. El archivo web.xml que copiaste antes en el directorio WEB-INF ya contiene la definición y la asignación necesarias para este ejemplo. Las líneas que definen esto son las siguientes:

    <servlet>
      <servlet-name>AdvancedExampleServlet2</servlet-name>
      <description>
      AdvancedExampleServlet2
      </description>
      <servlet-class>AdvancedExampleServlet2</servlet-class>
    </servlet>
      
    <servlet-mapping>
      <servlet-name>AdvancedExampleServlet2</servlet-name>
      <url-pattern>/advanced</url-pattern>
    </servlet-mapping> 
  2. Inicia Tomcat o reinícialo si ya se está ejecutando.
  3. Haz clic en el siguiente vínculo:http://localhost:8080/myWebApp/advanced
    La pantalla muestra entre 6 y 7 líneas de texto, según el ancho de la pantalla. El texto comienza con google.visualization.Query.setResponse y termina con {v:'http://en.wikipedia.org/wiki/Tiger'}]}]}});
    . Esta es la respuesta que la fuente de datos CSV de ejemplo envía a una visualización.

Cómo usar una visualización para ver los datos

El archivo all_examples.html en el directorio <data_source_library_install>/examples/src/html se puede usar para ver una visualización de los datos.

En el siguiente fragmento de all_examples, se especifica el servlet advanced, la tabla planets, una consulta seleccionada y una visualización del gráfico de barras.

query = new google.visualization.Query('advanced?tableId=planets&tq=select planet,mass');
...
var chart = new google.visualization.BarChart(document.getElementById('advanced_div'));

Para obtener una explicación de las otras visualizaciones incluidas en all_examples.html, consulta la sección Usa un almacén de datos externo.

Para obtener más información sobre cómo especificar una visualización y usar el lenguaje de consulta, visita Usa gráficos y la Referencia de lenguaje de consulta.

Sigue o sigue las instrucciones que se indican a continuación para ver una visualización de los datos que proporciona la fuente de datos avanzada:

  1. Si aún no lo hiciste, copia el archivo all_examples.html del directorio <data_source_library_install>/examples/src/html
    al directorio <tomcat_home>/webapps/myWebApp/.
     
  2. Haz clic en el siguiente vínculo: http://localhost:8080/myWebApp/all_examples.html en un navegador. Deberías ver lo siguiente:

Próximos pasos

Para explorar más ejemplos que se proporcionan con la biblioteca, consulta la referencia rápida de ejemplos. Para obtener más información sobre la implementación de una fuente de datos compleja, consulta Sugerencias de implementación.