Questão SCWCD

Estudando o livro Use a Cabeça (JSP e Servlets), me deparei com a seguinte questão (Pag. 141 do livro):

12 - Quais declarações sobre o RequestDispatcher são verdadeiras
( quando verdadeiras, considere que o RequestDispatcher não foi obtido via uma
chamada ao getNamedDispatcher())?

e dentre as respostas consideradas corretas, a seguinte também foi considerada correta pelo autor:

(E) O servlet para o qual uma solicitação é encaminhada pode acessar a query string original, chamando o
getAttribute(“javax.servlet.forward.query_string”) no ServletRequest.

No entanto até cheguei a tentar recuperar os dados de uma query string utilizando request.getAttribute(“foo”),
já imaginando que daria errado… e realmente não funcionou. Alguém poderia me ajudar a compreender melhor
esta questão?

Obrigado.

Olá
Na verdade ele funciona da seguinte forma:
Digamos que vc tenha digitado http://localhost/AplicacaoTeste/verCliente?cdEmpresa=1&cdCliente=2
E vc fez na servlet verCliente um forward para uma outra servlet

Entao nesta outra servlet se vc fizer request. getAttribute(“javax.servlet.forward.query_string”) vc vai ter como retorno a queryString completa: cdEmpresa=1&cdCliente=2

Alexsandra

vc tera a versao atualizada, agora um detalhe, isso se a solicitacao for com a mesma servlet, pois lembre-se que ServletRequest é nao é theread-safe.

Certo,

digitando as variáveis na query string, os valores foram mesmo recuperados. Eu não recebia os valores pois estava
colocando os parâmetros na query string de forma dinâmica conforme as listagens abaixo:

Tenho um servlet principal (QSStart) que irá fazer um forward para (QSNext), a qual irá receber os parâmetros.

Principal:

[code]public class QSStart extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

  // o foo não será recuperado através do request.getAttribute("javax.servlet.forward.query_string")
  RequestDispatcher next = request.getRequestDispatcher("Next.do?foo=bar");
  next.forward(request, response);

}
}[/code]

Servlet que receberá os parâmetros:

[code]public class QSNext extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

  // recebendo o controle e tentando recuperar o query string
  String ret = (String)request.getAttribute("javax.servlet.forward.query_string");
  PrintWriter out = response.getWriter();
  out.println("<html><body><br>query string via attribute (foo):" + ret + "</body></html>");

}
}[/code]

Da forma como está no código eu só consigo recuperar com

request.getParameter(“foo”)

ou

request.getQueryString();

Isso explica a minha confusão com a questão.

Obrigado pessoal.