Dicas de implementação

Esta seção aborda algumas dicas que ajudarão 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() de dentro do código do seu 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 seu servlet de outra classe de servlet, chamada AuthServlet, que fornece autenticação integrada, reescreva o SimpleServletExample para herdar AuthServlet em vez de DataSourceServlet desta maneira:

  1. Implemente a interface DataTableGenerator.
  2. Mova generateDataTable() da implementação DataSourceServlet para a implementação de DataTableGenerator.
  3. Modifique getCapabilities() na implementação de DataTableGenerator para retornar Capabilities.None.
  4. Chame DataSourceHelper.executeDataSourceServletFlow() do seu código de servlet (doGet() ou doPost()) e transmita sua 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.

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

Como definir recursos

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 seu armazenamento de dados. Por exemplo, suponha que seu armazenamento de dados seja um banco de dados com um grande número de colunas. Se uma visualização solicitar apenas algumas dessas colunas, executar uma operação SELECT no banco de dados será mais eficiente do que recuperar todas as colunas e usar os recursos de consulta da biblioteca para executar SELECT. Para implementar recursos de SELECT, escreva o código para executar uma operação SELECT no banco de dados e retornar uma tabela de dados.

Use a enumeração 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: o código fornece operações de consulta de classificação e paginação.
  • SELECT: o código fornece uma operação de seleção.
  • ALL: o código fornece operações SQL, SORT_AND_PAGINATION e SELECT.

Observação: em todos os casos, a biblioteca processa qualquer operação de consulta que não seja fornecida pelo seu código.

Para implementar um recurso diferente de NONE, modifique 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.

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 que o 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 Como definir recursos e o fluxo de eventos para um exemplo de implementação.

Transmissão de parâmetros para DataTableGenerator.generateDataTable

É possível usar HttpServletRequest.setAttribute para transmitir dados que não fazem parte de uma consulta ou do objeto HttpServletRequest para DataTableGenerator.generateDataTable. Veja um exemplo de código abaixo.

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

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

Na implementação da interface dataTableGenerator, acesse 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 não relacionada a servlet

Se você implementar a biblioteca sem usar um servlet, só poderá usar as classes e funções auxiliares que não exigem um ambiente de servlet. Isso inclui 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:

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