Definição de recursos e o fluxo de eventos

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 de planets, a fonte de dados retornará a tabela de dados dos animais.
  • Se o parâmetro tableId for especificado como planets, 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();
  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;
}

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();
  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;
}

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

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:

  1. O arquivo web.xml que você copiou anteriormente para o diretório WEB-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> 
  2. Inicie o Tomcat ou reinicie o Tomcat se ele já estiver em execução.
  3. 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 com google.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:

  1. 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.
     
  2. 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.