Empilhando o HttpServletRequest

4 respostas
Rafael_Steil

Guarde os valores em algum lugar, como campos hidden ou mesmo na session do usuario, e, quando voltar para a pagina original, regupere os valores.

Rafael

4 Respostas

Guilherme_Silveira

Voce nao pode assumir que pode brincar com o request a vontade. O escopo dele eh de uma requisicao. Se voce tentar utiliza-lo depois dessa requisicao nao sabe o que vai acontecer (vai depender do servlet conteiner).

Uma tatica melhor que a dos campos hidden eh simplesmente pegar os parametros e colocar num HashMap. Coloque esse hashmap na session.

Quando o usuario clica no botao para voltar voce da um new HttpServletRequest() {

//implementa os metodos aqui

}

E faz com que os metodos implementados utilizem o seu hashmap.

Dessa maneira voce consegue uma ferramenta generica que ira funcionar em todas as suas paginas sem ter que ficar alterando seu codigo html.

Att

Guilherme Silveira

M

Pessoal,

A situação é a seguinte: O usuário se encontra numa tela de busca onde é aplicado um critério e, em seguida, um dos registros retornados é selecionado para edição. O usuário então acessa a tela de cadastro do item selecionado, edita os dados e confirma a edição. Neste momento, a aplicacação deve retornar para a tela de busca inicial, "restaurando" o seu último estado, isto é, com o critério de busca preenchido e com os registros obtidos na última busca na tabela/grid.

Imaginei resolver esta situação de uma forma genérica fazendo o seguinte: Nas telas desejadas, o request atual seria empilhado de modo que seria perfeitamente possível desempilhar o último request e passá-lo para o .foward(req, res); Assim, seria possível fazer este processo de maneira semelhante em todas as situações do gênero.

Acontece que o request, pelo menos no OC4J funciona como um singleton por usuário. Isto é, o request é sempre o mesmo para determinado usuário, apenas os seus valores são atualizados. Não hé como empilhar desta forma pois as referências apontariam sempre para o mesmo request. Outra saída seria clocar ao empilhar, mas o HttpServletRequest não implementa Cloneable… Também não sei se seria necessário empilhar todo o request para restaurar um estado… pode ser possível restaurar o estado apenas com os parameters… Mas como sobrescrever os parameters em um request??? Se não fui bem claro, indiquem em que ponto por favor.

M

Guilherme,

Implemenar a interface HttpServletRequest toda na unha é um pouco complicado não acha? Concordo em manter o HashMap com os parameters na sessão. É fácil conseguir isso com o método request.getParameterMap(). O problema vem depois. Como colocar este map que acabara de ser empilhado como ultima requisição de volta no request atual e dar um foward para o requestURI da tela de grid?

Assim, a sequencia seria:

  1. Tela de grid é processada e durante o processamento, os paremeters são salvos em sessão.
  2. O usuário vai para a tela de cadastro e não há salvamento dos parameters pois neste caso não é desejado.
  3. O usuário confirma a edição na tela de cadastro e invoca o Dispatcher da tela anterior (o grid) passando um request que contem o map salvo anteriormente. Detsa forma, a tela seria carregada exatamente como da última vez que foi vista.

Problema: como passar o map salvo anteriormente???

M

Pessoal,

Valeu as dicas. A solução que consegui foi um pouco baseada na dica de Guilherme. Ao invés de implementar a interface, eu criei um Wrapper que recebe como parâmetro o request original e o map que deve substituir o mapparameter deste request… Para quem não conhece, o Wrapper delega todas as chamadas para o request interno (recebido no construtor - este padrão é semelhante ao decorator). Sendo assim, foi preciso alterar os métodos relacionados aos parameters e usar o map recebido por parâmetro ao invés de usar os parameters contidos no request original.

Criado 31 de março de 2005
Ultima resposta 7 de abr. de 2005
Respostas 4
Participantes 3