Dúvida questão de listener do Head First Servlets & JSP

1 resposta
Roger75

Olá

Estou com dúvida na questão 55 do mock final do Head First Servlets & JSP

Enunciado:

Dado:
public class ServletX extends HttpServlet{
  public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException{
     req.getSession().setAttribute("key",new X());
     req.getSession().setAttribute("key",new X());
     req.getSession().setAttribute("key","x");
     req.getSession().removeAttribute("key");

  }
}
e a classe listener:
public class X implements HttpSessionBindingListener{
   public void valueBound(HttpSessionBindingEvent event){
      System.out.print("B");
   }
   public void valueUnbound(HttpSessionBindingEvent event){
      System.out.print("UB");
   }

}
Qual o resultado quando o método doGet for chamado?

A resposta no livro está BBUBUB, mas não entendi por quê, no livro não explicou direito. Eu achei que deveria ser BBBUB, mas nem tem alternativa com essa resposta.

1 Resposta

T

Bom, primeiro vendo o JavaDoc

void valueBound ( HttpSessionBindingEvent event )

Notifies the object that it is being bound to a session and identifies the session

void valueUnbound ( HttpSessionBindingEvent event )

Notifies the object that it is being unbound from a session and identifies the session

Depois, vamos ver o que ocorre.

a - Criamos uma instância de X (vamos chamar de x1)

b - Chamamos getSession().setAttribute() com o valor de x1

-> Isso irá fazer com que seja invocado x1.valueBound ("B")

c - Criamos uma nova instância de X (vamos chamar de x2)

d - Chamamos getSession().setAttribute() com o valor de x2

-> Agora eu não sei se a seqüência correta é:

Primeiro se chama x1.valueUnbound, e depois x2.valueBound, ou

primeiro se chama x2.valueBound, e depois x1.valueUnbound. De  qualquer maneira, veja qual das opções é possível com as duas seqüências. É interessante ler a documentação e o fonte de uma implementação qualquer. ("B-UB-B" ou "B-B-UB")

e - Chamamos getSession().setAttribute() com o objeto String "x"

-> Isso deve chamar x2.valueUnbound. Como a classe String não implementa HttpSessionBindingListener, então não se chama "x".valueBound. ("B-UB-B-UB" ou "B-B-UB-UB")

Então a resposta do livro é válida.

Criado 7 de julho de 2006
Ultima resposta 7 de jul. de 2006
Respostas 1
Participantes 2