Esta seção apresenta AdvancedExampleServlet2
. AdvancedExampleServlet2
é
um exemplo de implementação de fonte de dados que define recursos e o
fluxo de eventos. Nesta seção, também fornecemos instruções detalhadas sobre como
executar e testar AdvancedExampleServlet2
.
Observação: é necessário concluir a seção Vamos começar antes de iniciar esta seção.
Apresentação do AdvancedExampleServlet2
A classe AdvancedExampleServlet2
está localizada no pacote examples
.
Essa classe apresenta um exemplo de implementação que define recursos
e fluxo de eventos.
As partes mais importantes de AdvancedExampleServlet2
são
descritas nas seguintes seções:
Definir o fluxo de eventos
AdvancedExampleServlet2
define o fluxo de eventos
substituindo o método HttpServlet.doGet()
e chamando várias funções auxiliares fornecidas por DataSourceHelper
.
O snippet a seguir substitui doGet()
. O parâmetro HttpServletRequest
encapsula a solicitação feita por uma visualização ao servlet. O parâmetro HttpServletResponse
encapsula a resposta do servlet à visualização de consulta.
Esse snippet também define dsRequest
como nulo. O dsRequest
é
usado em vários pontos ao longo do restante do código.
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { DataSourceRequest dsRequest = null;
O snippet a seguir extrai os parâmetros de solicitação de HttpServletRequest
para criar o contexto em que a solicitação é executada.
try { // Extract the request parameters. dsRequest = new DataSourceRequest(req);
O snippet a seguir separa a consulta do objeto dsRequest
em duas consultas separadas. Uma consulta é chamada de consulta de fonte de dados e a outra, de conclusão. Como a capacidade declarada da fonte de dados é SELECT
, a consulta da fonte de dados consiste em uma operação SELECT
se o objeto dsRequest
incluir uma operação SELECT
.
A consulta de conclusão consiste em todas as outras operações exigidas pela solicitação, que também podem incluir uma operação SELECT
. Por exemplo, se a consulta solicitada
for SELECT a ORDER
BY b
,
a consulta de fonte de dados será SELECT a, b
e a consulta de conclusão
será a mesma da consulta original SELECT a ORDER BY b
.
// Split the query. QueryPair query = DataSourceHelper.splitQuery(dsRequest.getQuery(), Capabilities.SELECT);
O snippet a seguir usa a consulta
da fonte de dados criada pelo snippet anterior e pelo HttpServletRequest,
e
cria uma tabela de dados. Consulte a seção Como usar
recursos
para mais detalhes.
// Generate the data table. DataTable data = generateMyDataTable(query.getDataSourceQuery(), req);
O código a seguir usa a consulta de conclusão realizada quando a consulta foi dividida, a tabela de dados produzida pelo snippet anterior e a localidade do usuário na visualização de consulta. Em seguida, o código cria uma nova tabela de dados.
// Apply the completion query to the data table. DataTable newData = DataSourceHelper.applyQuery(query.getCompletionQuery(), data, dsRequest.getUserLocale());
O código a seguir usa a tabela de dados produzida pelo snippet anterior e os parâmetros de solicitação de HttpServletRequest
. O código
define a resposta do servlet. O contêiner do servlet retorna essa resposta para a visualização de consulta.
DataSourceHelper.setServletResponse(newData, dsRequest, resp);
Como lidar com erros
O snippet a seguir captura uma exceção, busca a mensagem apropriada, formata a resposta e define a resposta do servlet. Se dsRequest
for
nulo, o DataSourceRequest
não estará disponível, possivelmente devido a uma falha
do construtor. Nesse caso, o HttpRequest
é
usado em vez do 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); } }
Como usar parâmetros de URL
O snippet a seguir usa a consulta da fonte de dados que foi criada quando a consulta foi dividida e a HttpServletRequest
.
A HttpServletRequest
pode incluir um parâmetro tableId
especificado como um URL. Esse parâmetro tableId
determina qual tabela de dados é retornada da seguinte maneira:
- Se o parâmetro
tableId
for omitido ou for diferente deplanets
, a fonte de dados retornará a tabela de dados de animais. - Se o parâmetro
tableId
for especificado comoplanets
, a fonte de dados retornará a tabela de dados dos planetas.
Ao escrever seu próprio código para retornar uma tabela de dados, você decide quais parâmetros usar.
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); }
Como usar os recursos
O snippet a seguir usa a consulta e gera a tabela de dados 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; }
O snippet a seguir usa a consulta e gera a tabela de dados 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; }
Como executar e testar AdvancedExampleServlet2
Esta seção fornece instruções sobre como executar e testar o AdvancedExampleServlet2
.
Para executar e testar AdvancedExampleServlet2
, atualize
seu aplicativo da Web e configure uma visualização que consulte a fonte
de dados, conforme descrito nas seções a seguir:
- Como atualizar um aplicativo da Web no Apache Tomcat
- Como usar uma visualização para visualizar os dados
Como atualizar um aplicativo da Web no Apache Tomcat
Siga ou adapte as instruções abaixo para atualizar seu aplicativo da Web no Apache Tomcat. Estas instruções são específicas para o Apache Tomcat em um sistema Windows:
- O arquivo
web.xml
que você copiou anteriormente para o diretórioWEB-INF
já contém a definição e o mapeamento necessários para este exemplo. As linhas que definem isso são:
<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>
- Inicie o Tomcat ou reinicie o Tomcat se ele já estiver em execução.
- Clique no link a seguir:http://localhost:8080/myWebApp/advanced
A tela mostra de 6 a 7 linhas de texto, dependendo da largura da tela. O texto começa comgoogle.visualization.Query.setResponse
e termina com{v:'http://en.wikipedia.org/wiki/Tiger'}]}]}});
Essa é a resposta que a fonte de dados CSV de exemplo envia para uma visualização.
Como usar uma visualização para visualizar os dados
O arquivo all_examples.html
no diretório <data_source_library_install>/examples/src/html
pode ser usado para visualizar os dados.
O snippet a seguir de all_examples
especifica
o servlet advanced
, a tabela planets
, uma consulta selecionada e
uma visualização 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 uma explicação sobre as outras visualizações incluídas em all_examples.html
,
consulte a seção Como usar um armazenamento de dados externo.
Para mais informações sobre como especificar uma visualização e usar a linguagem de consulta, consulte Como usar gráficos e Referência da linguagem de consulta.
Siga ou adapte as instruções abaixo para ter uma visualização dos dados fornecidos pela fonte de dados avançada:
- Se você ainda não tiver feito isso, copie o arquivo
all_examples.html
do diretório<data_source_library_install>/examples/src/html
para o<tomcat_home>/webapps/myWebApp/
.
- Clique no seguinte link: http://localhost:8080/myWebApp/all_examples.html em um navegador. Você verá o seguinte:
Próximas etapas
Para explorar ainda mais os exemplos fornecidos com a biblioteca, consulte Exemplos de referência rápida. Para saber mais sobre como implementar uma fonte de dados complexa, consulte Dicas de implementação.