Esta seção aborda algumas dicas que vão ajudar a escrever implementações mais complexas da biblioteca:
- Como usar seu próprio servlet
- Definição de capacidades
- Como personalizar o fluxo de eventos
- Como transmitir parâmetros para
DataTableGenerator.generateDataTable
- Como implementar uma fonte de dados não servlet
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:
- Implemente a interface
DataTableGenerator
e substituagetCapabilities()
egenerateDataTable()
. - 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.
- Um objeto
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:
- Implemente a interface
DataTableGenerator
. - Mova
generateDataTable()
da implementação deDataSourceServlet
para a implementação deDataTableGenerator
. - Substitua
getCapabilities()
na implementação deDataTableGenerator
para retornarCapabilities.None
. - Chame
DataSourceHelper.executeDataSourceServletFlow()
no código do servlet (doGet()
oudoPost()
) e transmita a implementação deDataTableGenerator
. 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çõesSQL
,SORT_AND_PAGINATION
eSELECT
.
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:
- Extrair e analisar parâmetros de consulta.
- Somente para o modo de acesso restrito, verifique se a solicitação se origina do mesmo domínio do servlet.
- 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()
. - A implementação de
generateDataTable()
gera uma tabela de dados. - Execute a consulta de conclusão na tabela de dados gerada na etapa 5.
- 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
ouJSON
.