Esta seção apresenta a AdvancedExampleServlet2
. AdvancedExampleServlet2
é
um exemplo de implementação de fonte de dados que define os recursos e o
fluxo de eventos. Esta seção também fornece instruções detalhadas sobre
como executar e testar AdvancedExampleServlet2
.
Observação: é necessário concluir a seção Primeiros passos antes de começar esta seção.
Conheça o AdvancedExampleServlet2
A classe AdvancedExampleServlet2
está localizada no pacote examples
.
Essa classe fornece um exemplo de implementação que define recursos
e fluxo de eventos.
As partes mais importantes do AdvancedExampleServlet2
são
descritas nas seções abaixo:
Como 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 para o servlet. O parâmetro HttpServletResponse
encapsula a resposta do servlet para a visualização de consulta.
Esse snippet também define dsRequest
como nulo. dsRequest
é
usado em vários pontos no 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 usa a consulta do objeto dsRequest
e a divide em duas consultas separadas. Uma delas é chamada de consulta
da fonte de dados e a outra é de conclusão. Como o recurso declarado
da fonte de dados é SELECT
, a consulta da fonte de dados consistirá
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 da fonte de dados será SELECT a, b
e a consulta de conclusão será a mesma que a 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 Uso
de recursos
para saber mais.
// Generate the data table. DataTable data = generateMyDataTable(query.getDataSourceQuery(), req);
O código a seguir usa a consulta de conclusão produzida quando a consulta foi dividida, a tabela de dados produzida pelo snippet anterior e a localidade do usuário da visualização da 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 do HttpServletRequest
. O código define a resposta do servlet. Essa resposta é retornada pelo contêiner do servlet
para a visualização da consulta.
DataSourceHelper.setServletResponse(newData, dsRequest, resp);
Tratamento de erros
O snippet a seguir captura uma exceção, recebe 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, HttpRequest
é
usado em vez 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); } }
Como usar parâmetros de URL
O snippet a seguir usa a consulta de fonte de dados criada quando ela foi dividida e o HttpServletRequest
.
O 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 dos animais. - Se o parâmetro
tableId
for especificado comoplanets
, a fonte de dados retornará a tabela de dados de 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 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; }
Execução e teste AdvancedExampleServlet2
Esta seção fornece instruções sobre como executar e testar o AdvancedExampleServlet2
.
Para executar e testar AdvancedExampleServlet2
, atualize o 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 exibir 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 seis a sete 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'}]}]}});
Esta é a resposta que a fonte de dados CSV de exemplo envia para uma visualização.
Como usar uma visualização para exibir os dados
O arquivo all_examples.html
no diretório <data_source_library_install>/examples/src/html
pode ser usado para visualizar uma visualização dos dados.
O snippet de all_examples
a seguir 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, veja Como usar gráficos e a 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:
- Copie o arquivo
all_examples.html
do diretório<data_source_library_install>/examples/src/html
para o diretório<tomcat_home>/webapps/myWebApp/
, caso ainda não tenha feito isso.
- Clique neste link: http://localhost:8080/myWebApp/all_examples.html em um navegador. Você verá o seguinte:
Próximas etapas
Para explorar mais os exemplos fornecidos com a biblioteca, consulte a Referência rápida de exemplos. Para saber mais sobre como implementar uma fonte de dados complexa, consulte Dicas de implementação.