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 deplanets
, 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 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 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:
- 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 la 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.
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:
- 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 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.