En esta sección, se presenta AdvancedExampleServlet2
. AdvancedExampleServlet2
es un ejemplo de implementación de fuente de datos que define las 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
- Manejo de errores
- Cómo usar parámetros de URL
- Cómo usar las funciones
Cómo definir el flujo de eventos
AdvancedExampleServlet2
define el flujo de eventos anulando el método HttpServlet.doGet()
y llamando a varias funciones auxiliares que proporciona DataSourceHelper
.
El siguiente fragmento anula doGet()
. El parámetro HttpServletRequest
encapsula la solicitud que realiza una visualización al servlet. El parámetro HttpServletResponse
encapsula la respuesta del servlet a la visualización de consulta.
Este fragmento también establece dsRequest
como nulo. dsRequest
se usa en varios puntos en el 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 la 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 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 que requiere 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 por HttpServletRequest,
, y crea una tabla de datos. Para obtener más detalles, consulta la sección Uso de capacidades.
// Generate the data table. DataTable data = generateMyDataTable(query.getDataSourceQuery(), req);
El siguiente código toma la consulta de finalización producida 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 consulta. Luego, el código crea una nueva tabla de datos.
// 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 que produjo el fragmento anterior y los parámetros de solicitud de HttpServletRequest
. Luego, el código configura la respuesta del servlet. El contenedor de servlet muestra esta respuesta
a la visualización de consulta.
DataSourceHelper.setServletResponse(newData, dsRequest, resp);
Manejo de errores
El siguiente fragmento detecta una excepción, obtiene el mensaje adecuado, formatea la respuesta y establece la respuesta del servlet. Si dsRequest
es nulo, DataSourceRequest
no está disponible, posiblemente debido a una falla 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 el 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 no esplanets
, la fuente de datos muestra la tabla de datos de animales. - Si el parámetro
tableId
se especifica comoplanets
, la fuente de datos muestra la tabla de datos de los 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(); ListrequiredColumns = 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(); ListrequiredColumns = 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 pruebas de AdvancedExampleServlet2
En esta sección, se proporcionan instrucciones para 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 que se indican a continuación para actualizar tu aplicación web en Apache Tomcat. Estas instrucciones son específicas para Apache Tomcat en un sistema Windows:
- El archivo
web.xml
que copiaste antes en el directorioWEB-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>
- Inicia Tomcat o reinícialo si ya se está ejecutando.
- 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 tu pantalla. El texto comienza congoogle.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.
Uso de una visualización para ver los datos
Se puede usar el archivo all_examples.html
en el directorio <data_source_library_install>/examples/src/html
para obtener una visualización de los datos.
En el siguiente fragmento de all_examples
, se especifica el servlet advanced
, la tabla planets
, una consulta de selección y una visualización de 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 Cómo usar un almacén de datos externo.
Si deseas obtener más información sobre cómo especificar una visualización y usar el lenguaje de consulta, consulta Usa gráficos y la Referencia del lenguaje de consulta.
Sigue o adapta las siguientes instrucciones para ver una visualización de los datos que proporciona la fuente de datos avanzada:
- 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/
.
- Haz clic en el vínculo http://localhost:8080/myWebApp/all_examples.html en un navegador. Deberías ver lo siguiente:
Próximos pasos
Para explorar más a fondo los ejemplos proporcionados con la biblioteca, consulta 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.