Ajuda com sendRedirect();

15 respostas
erickles

Olá pessoal,

Estou no aprendizado de Servlets e me deparei com um probleminha em um exercicio:

Criei a Servlet “SenderServlet” com o seguinte método:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
         
    String message = "Can you hear me?";    
    request.setAttribute("messageKey", message); 
    response.sendRedirect("ReceiverServlet"); ;
    }

E uma Servlet “ReceiverServlet”:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        StringBuffer buffer = new StringBuffer(); 
       
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println(buffer.toString());
        out.close();
    }

Quando compilo, a Servlet “ReceiverServlet” não exibe nada no Firefox. Deveria estar exibindo “Can you hear me?”

Alguma dica ?

Obrigado.

15 Respostas

caio_ferreira

kra, to no começo do estudo tbm, mas sera q nao pode ser problema com seu arquivo web.xml??
eu praticamente nao sei quase nda, to estudando

caio_ferreira

kra, como te disse, tbm to estudando, acho q esse deve ser o problema, ta escrito na apostila do JEDI

SendRequest
Como efetivamente é uma nova requisição, os dados armazenados no objeto da requisição
são descartados. Os parâmetros fornecidos pelo usuário, se existirem, devem ser
resubmetidos caso a página alvo necessite destes. Os dados que estiverem armazenados
no objeto request devem ser mantidos de alguma forma. Caso contrário, serão perdidos.

B
erickles:
E uma Servlet "ReceiverServlet":
protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        StringBuffer buffer = new StringBuffer(); 
       
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println(buffer.toString());
        out.close();
    }
Cara, se entendi o teu código, você está dando um Print numa variável vazia. Tente algo do tipo:
String buffer = request.getAttribute("messageKey");
response.getWriter.println(buffer);
erickles

billcaio:
kra, como te disse, tbm to estudando, acho q esse deve ser o problema, ta escrito na apostila do JEDI

SendRequest
Como efetivamente é uma nova requisição, os dados armazenados no objeto da requisição
são descartados. Os parâmetros fornecidos pelo usuário, se existirem, devem ser
resubmetidos caso a página alvo necessite destes. Os dados que estiverem armazenados
no objeto request devem ser mantidos de alguma forma. Caso contrário, serão perdidos.

Sim cara, to estudando na apostila do JEDI!

Você conseguiu resolver este exercicio?

leandrocm86

O escopo do request morre no sendRedirect.
Você pode armazenar a mensagem na session: request.getSession().setAttribute(“mensagem”, “Can you hear me?”);
Aí você lê a mensagem a partir da session.

erickles

leandrocm86:
O escopo do request morre no sendRedirect.
Você pode armazenar a mensagem na session: request.getSession().setAttribute(“mensagem”, “Can you hear me?”);
Aí você lê a mensagem a partir da session.

Certo. Mas como leio a mensagem na classe ReceiverServlet ?

Fiz dessa forma e soh me retorna null:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        
        StringBuffer buffer = new StringBuffer(); 
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println(request.getSession().getAttribute("message"));
        out.close();
    }
leandrocm86

Sei que é uma pergunta um tanto idiota, mas não custa: Vc setou e pegou a mensagem usando o msm nome né? Porque no primeiro exemplo vc escreveu messageKey e depois message… então só pra conferir mesmo.
Cara, não sei porque então não está rolando… Nunca fiz troca de mensagens entre dois servlets com sendRedirect, será que você não tem que dar um último sendRedirect no ReceiverServlet pra poder jogar a resposta pra página? Pode ser que a mensagem já esteja carregada, só não ta mostrando nada porque a página não foi carregada…

erickles

leandrocm86:
Sei que é uma pergunta um tanto idiota, mas não custa: Vc setou e pegou a mensagem usando o msm nome né? Porque no primeiro exemplo vc escreveu messageKey e depois message… então só pra conferir mesmo.
Cara, não sei porque então não está rolando… Nunca fiz troca de mensagens entre dois servlets com sendRedirect, será que você não tem que dar um último sendRedirect no ReceiverServlet pra poder jogar a resposta pra página? Pode ser que a mensagem já esteja carregada, só não ta mostrando nada porque a página não foi carregada…

Bom cara, na classe “SendRedirect”, o método doGet tah assim:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
         
    String message = "Can you hear me?";    
    //request.setAttribute("messageKey", message); 
    request.getSession().setAttribute("Can you hear me?",message);
    response.sendRedirect("ReceiverServlet"); 
    }

Na Receiver Servlet, tah assim:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        
        StringBuffer buffer = new StringBuffer(); 
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println(request.getSession().getAttribute("message"));
        out.close();
    }

Executo isso e me retorna null…

furutani

Olá

Está ao contrário os parametros do setAtributte()
Faça assim no “SendRedirect”

request.getSession().setAttribute("message", "Can you hear me?");

E no “Receiver” fica do jeito que estava

out.println(request.getSession().getAttribute("message"));
leandrocm86

Exatamente como o furutani falou.
O primeiro argumento do metodo setAttribute é o nome da variável em que você vai armazenar alguma coisa, e o segundo argumento é o que vai armazenar.
Você pode colocar qualquer objeto como atributo, no seu caso você tá armazenando uma String.

W

muda isso

request.getSession().setAttribute("Can you hear me?",message);

para:

request.getSession().setAttribute("message",message);
erickles

Meu método sendet fico assim:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
         
    String message = "Can you hear me?";    
    request.getSession().setAttribute("message" , message);
    response.sendRedirect("ReceiverServlet"); 
    }

Acredito q esteja certo, porem ainda me retorna null, meu receiver fico assim:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        
        StringBuffer buffer = new StringBuffer(); 
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println(request.getSession().getAttribute("message"));
        out.close();
    }

Acho estranho essa linha:

out.println(request.getSession().getAttribute("message"));

no getAttribute nao deveriamos estar referenciando o objeto message ? Se faço isso o netBenas acusa erro…

leandrocm86

Já sei o que tá rolando… a sintaxe está toda correta, só falta acrescentar um detalhe:

(String) request.getSession().getAttribute("message");

Porque como você pode guardar qualquer coisa como atributo, o método getAttribute nos retorna uma referência Object. Você precisa fazer um “downcast” especificando que esse objeto é na verdade uma String.

erickles

Boa tentativa cara, mas ainda resulta em null… :cry:

furutani

Olá

Experimenta mostrar no console do tomcat assim:

System.out.println(request.getSession().getAttribute("message"));

Veja se continua aparecendo null

Criado 28 de novembro de 2008
Ultima resposta 2 de dez. de 2008
Respostas 15
Participantes 6