Dúvida no desenvolvimento de pesquisa de registros

Pessoal, estou iniciando em desenvolvimento java e aqui no fórum e tenho uma dúvida. Estou desenvolvendo uma aplicação teste, acessando um banco de dados já existente. A minha página inicial mostra uma lista de contatos, faço isto utilizando um bean. Agora eu quero criar uma opção de pesquisa para filtrar registros nesta lista contatos. Eu entendi que para executar esta pesquisa eu devo chamar um servlet que irá me devolver página com a resposta. O problema é que quero utilizar a mesma página inicial, mas esta já utiliza o bean para listar os registros. Eu não sei se a minha idéia é a forma correta de fazer ou existe uma forma de utilizar o bean e o resultado da servlet ao mesmo tempo. Procurei bastante na internet mas não achei nenhuma dica sobre isto. Estou utilizando somente JSP e JSLT. Agradeço alguma ajuda.

Vc pode criar outro bean para o filtro. Quando o browser der o submit do formulario de filtro os dado vão para o servlet. O servlet pega os parametros e joga no bean. Ai vc usa os dados do bean para realizar o filtro no jdbc. O retorno é a mesma lista de beans de contrato que vc já tem. Ai vc coloca os dois beans no request. Na jsp vc lê os dois beans. Um vc usa para criar lista de contratos e outro para preencher os campos do filtro.

repare que a primeira vez que vc entra na tela é igual a executar um filtro onde o bean de filtro não tem dados.

Em primeiro lugar muito obrigado pela atenção Sérgio.
Estou apanhando bastante mas esta indo. Muitas das minhas dúvida são se eu estou fazendo da forma certa. Mas nesta eu realmente travei. De acordo com seu retorno eu entendi o seguinte: Faço o filtro, encaminho os parâmetros para a servlet, executo o bean que realiza o filtro das informações, e devolvo pela request. Apartir deste ponto não entendi. Você fala em retornar e utilizar os dois beans na jsp. Na minha jsp utilizo o <c:forEach var=“contato” items="${dao.lista}"> para listar os registros. Isto executa uma classe que gera uma lista. Se eu estou gerando um retorno pela servlet eu tenho que criar um bean para apontar para este retorno na jsp. Como cada coluna da minha lista esta associada a “contato”, no momento de listar eu tenho que testar qual bean devo utilizar? Ou existe uma forma de eu selecionar o bean que desejo utiliza? Eu não consegui entender a idéia.
Obrigado.

[quote=evandrombarbosa]Em primeiro lugar muito obrigado pela atenção Sérgio.
Estou apanhando bastante mas esta indo. Muitas das minhas dúvida são se eu estou fazendo da forma certa. Mas nesta eu realmente travei. De acordo com seu retorno eu entendi o seguinte: Faço o filtro, encaminho os parâmetros para a servlet, executo o bean que realiza o filtro das informações, e devolvo pela request. Apartir deste ponto não entendi. Você fala em retornar e utilizar os dois beans na jsp. Na minha jsp utilizo o <c:forEach var=“contato” items="${dao.lista}"> para listar os registros. Isto executa uma classe que gera uma lista. Se eu estou gerando um retorno pela servlet eu tenho que criar um bean para apontar para este retorno na jsp. Como cada coluna da minha lista esta associada a “contato”, no momento de listar eu tenho que testar qual bean devo utilizar? Ou existe uma forma de eu selecionar o bean que desejo utiliza? Eu não consegui entender a idéia.
Obrigado.[/quote]

O seu problema é o acoplamento.
A JSP não deve saber que existe uma coisa chamada DAO.
O seu codigo :

<c:forEach var="contato" items="${dao.lista}"> 

Mostra que quem está no request é o dao, e não a lista. O código que se espera é :

<c:forEach var="contato" items="${contatos}"> 

onde contados é uma lista de objetos da classe Contato.

no servlet vc tem algum codigo parecido com este

// no servlet 
request.setAttribute("dao", dao);

O que vc precisa ter é algo assim

// no servlet 

List contatos = dao.lista();

request.setAttribute("contatos", contatos );

Quando vc fizer o filtro vc vai ter um objeto da classe ContratoFiltro assim

// no servlet 

ContratoFiltro filtro = new ContratoFiltro ();

// copia parametros do request, por exemplo

filtro.setNome(request.getParameter("nome"));

// coloca o filtro no request

request.setAttribute("filtro", filtro);

// executa a query, como antes, mas agora passando os dados do filtro.
List contatos = dao.lista(filtro);

request.setAttribute("contatos", contatos );

Repare que após a execução da query, tudo é igual.

Na jsp vc pode ter um campo input assim

< input type="text" name="nome" value="${filtro.nome}" />

Isto vai renderizar um campo de texto. Quando o filtro não existe vai aparece vazio, após realizar o filtro, vai aparece o que vc digitou antes.

1 curtida

Mais um vez obrigado Sérgio.
Agora entendi o que vc explicou. Na verdade eu expliquei mal minha situação. Quando abro a página inicial eu já listo todos os registros existentes, por isto utilizo o usebean para acessar a classe que retorna a lista. Pela explicação que vc me passou, isto não seria a forma correta para funcionar com um filtro. Eu devo retornar a lista pela servlet sempre. Então eu tenho que alterar a minha aplicação para executar a servlet “automaticamente” toda vez que entrar na aplicação?
Obrigado

[quote=evandrombarbosa]Então eu tenho que alterar a minha aplicação para executar a servlet “automaticamente” toda vez que entrar na aplicação?
Obrigado
[/quote]

Sim. O controlador (que é o servlet ) é que responde ao URL. Ou seja, quando o usuario coloca um URL no browser isso bate num servlet. Depois o servlet faz o o foward para o request para o jsp , assim

RequestDispatcher dispatcher=getServletContext().getRequestDispatcher( "/view/nomeDaJsp.jsp" ); // onde view é uma pasta chamada "view" dentro da pasta "WEB-INF"
   
dispatcher.forward( request, response );

Este é sempre o ciclo para qualquer URL

1 curtida