Dicas de implementação

Esta seção aborda algumas dicas que vão ajudar a escrever implementações mais complexas da biblioteca:

Como usar seu próprio servlet

As implementações de fonte de dados mais simples são herdadas da classe DataSourceServlet da biblioteca. Para herdar de uma classe diferente de DataSourceServlet, implemente uma fonte de dados da seguinte maneira:

  1. Implemente a interface DataTableGenerator e substitua getCapabilities() e generateDataTable().
  2. Chame DataSourceHelper.executeDataSourceServletFlow() no código do servlet para executar o fluxo da fonte de dados.Esse método usa os seguintes parâmetros:
    • Um objeto HttpServletRequest.
    • Um objeto HttpServletResponse.
    • Sua implementação da interface DataTableGenerator da etapa 1 acima.
    • Um booleano para especificar o modo de acesso restrito ou irrestrito.

Por exemplo, se você quiser herdar o servlet de outra classe de servlet, chamada AuthServlet, que fornece autenticação integrada, reescreva o SimpleServletExample para herdar AuthServlet em vez de DataSourceServlet da seguinte maneira:

  1. Implemente a interface DataTableGenerator.
  2. Mova generateDataTable() da implementação de DataSourceServlet para a implementação de DataTableGenerator.
  3. Substitua getCapabilities() na implementação de DataTableGenerator para retornar Capabilities.None.
  4. Chame DataSourceHelper.executeDataSourceServletFlow() no código do servlet (doGet() ou doPost()) e transmita a implementação de DataTableGenerator. Esse método executa todo o fluxo da fonte de dados, incluindo a renderização dos resultados dela na resposta do servlet.

Use a mesma técnica se estiver usando um framework de servlet em que você normalmente herda uma classe abstrata fornecida pelo framework. Por exemplo, se você estiver usando o WebWork, convém herdar a classe ActionSupport.

Definição de capacidades

Se o armazenamento de dados contiver uma grande quantidade de dados e você quiser aumentar a eficiência da fonte de dados, use os recursos de consulta do repositório de dados. Por exemplo, imagine que o repositório de dados é um banco de dados e tem um grande número de colunas. Se uma visualização solicitar apenas algumas dessas colunas, executar uma operação SELECT no banco de dados é mais eficiente do que recuperar todas as colunas e usar os recursos de consulta da biblioteca para executar a SELECT. Para implementar os recursos de SELECT, escreva o código para executar uma operação SELECT no banco de dados e retornar uma tabela de dados.

Use o tipo enumerado Capabilities para definir os recursos de consulta que seu código oferece. Veja a seguir as opções disponíveis:

  • NONE: o padrão, o código não fornece operações de consulta.
  • SQL: o código fornece operações de consulta SQL.
  • SORT_AND_PAGINATION: seu código fornece operações de consulta de classificação e paginação.
  • SELECT: seu código fornece uma operação de seleção.
  • ALL: seu código fornece operações SQL, SORT_AND_PAGINATION e SELECT.

Observação: em todos os casos, a biblioteca processa todas as operações de consulta que não são fornecidas pelo código.

Para implementar um recurso diferente de NONE, substitua Capabilities.getCapabilities() e implemente DataTable.generateDataTable() para consultar o armazenamento de dados e retornar uma tabela de dados.

Três dos exemplos ilustram como implementar recursos: AdvancedExampleServlet, AdvancedExampleServlet2 e SqlDataSourceServlet. Todos estão no pacote example. AdvancedExampleServlet2 é discutido em Como definir recursos e o fluxo de eventos.

Como personalizar o fluxo de eventos

O fluxo padrão de eventos é definido em DataSourceHelper.executeDataSourceServletFlow. O fluxo padrão é o seguinte:

  1. Extrair e analisar parâmetros de consulta.
  2. Somente para o modo de acesso restrito, verifique se a solicitação se origina do mesmo domínio do servlet.
  3. Analise a solicitação para criar dois objetos de consulta: a consulta da fonte de dados e a consulta de conclusão. Transmita a consulta da fonte de dados para a implementação de generateDataTable().
  4. A implementação de generateDataTable() gera uma tabela de dados.
  5. Execute a consulta de conclusão na tabela de dados gerada na etapa 5.
  6. Renderizar a tabela de dados no formato especificado pela visualização e definir a resposta do servlet.

Para especificar seu próprio fluxo de eventos, chame as funções auxiliares em datasource.DataSourceHelper. Consulte Definir recursos e o fluxo de eventos para ver um exemplo de implementação.

Como transmitir parâmetros para DataTableGenerator.generateDataTable

Você pode usar HttpServletRequest.setAttribute para transmitir dados que não fazem parte de uma consulta ou do objeto HttpServletRequest para DataTableGenerator.generateDataTable. O código de exemplo é fornecido abaixo.

No código do servlet, coloque o objeto que você quer transmitir no HttpServletRequest da seguinte maneira:

request.setAttribute("my_object_name", myObject);
DataSourceHelper.executeDataSourceServletFlow(request, response, dataTableGenerator);

Na implementação da interface dataTableGenerator, receba o objeto do HttpServletRequest da seguinte maneira:

public DataTable generateDataTable(Query query, HttpServletRequest request){
  Object myObject = request.getAttribute("my_object_name"); 
  // Add your code to manipulate myObject here 
} 

Como implementar uma fonte de dados que não seja servlet

Se você implementar a biblioteca sem usar um servlet, poderá usar apenas as classes e funções auxiliares que não exigem um ambiente de servlet. Elas incluem as classes Query e DataTable e algumas das funções DataSourceHelper, como parseQuery, applyQuery, validateQuery e splitQuery. Você pode usar essas classes e funções para fazer o seguinte:

  • para analisar uma consulta de visualização.
  • Dividir a consulta em uma consulta de fonte de dados e uma consulta de conclusão.
  • Execute a consulta de conclusão para gerar uma tabela de dados.
  • Retorne a tabela de dados à visualização no formato HTML, CSV ou JSON.