OCPJWCD - Dúvida sobre c:set [RESOLVIDO]

Boa tarde pessoal, eu estudando aqui para a certificação e surgiu algumas dúvidas.

1º Dúvida
Na pagina 457 do livro Heard First - Servlet e Jsp (2º Edição) ela fala o seguinte.

Mais se eu fazer o teste

//java
request.setAttribute("pessoa", "Fulano");
//jsp
<c:set var="pessoa" scope="request" value="Outra pessoa"  />
${pessoa}

isso exibe Outra pessoa, ou sejá … mesmo que exista um atributo ele é criado, porque? o livro está errado?

2º Dúvida

Na pagina 455 do livro Heard First - Servlet e Jsp (2º Edição) ela fala o seguinte.

Não é o que os testes diz, veja:


//java
request.setAttribute("pessoa", "Fulano 1");
request.getSession().setAttribute("pessoa", "Fulano 2");
//jsp
<c:set var="pessoa" scope="request"  />
${pessoa}

o resultado do jsp é branco, não aparece o valor Fulano 2

Ou seja como eu não coloquei o value, ele será avaliado como null, o atributo pessoa será removido, começando a procurar do scope de pagina até o da aplicação.

Ele deveria remover apenas o da solicitação, não deveria remover também o da sessão, Alguém sabe o porque isto acontece?

Obrigado

ErickMacedo,

Na sua 1ª dúvida, quando vc faz isso

vc pega o atributo pessoa que foi criado em

request.setAttribute("pessoa", "Fulano"); e substitui o valor “Fulano” com “Outra pessoa”, é como se vc fizesse outro setAttribute assim:

request.setAttribute("pessoa", "Outra pessoa").
Se vc nao tivesse usado setAttribute no início, ao usar <c:set> vc estaria sim criando o atributo pessoa.

luiz_renato eu intendo o que você quer dizer, o problema é que o livro fala o seguinte

ou seja era para ele substituir o atributo SOMENTE se ele NÃO existisse intendeu? como o atributo já existe não era para ele substituir

Muito Obrigado

Era sim, set é pra substituir o valor do atributo caso ele exista ou criar uma atributo novo caso ele não exista e colocar um valor nele, da forma que vc fala set seria usado somente pra criar atributo…

Não confunda a criação do atributo que não existe no scopo com a troca do valor do atributo que já existe …
Uma coisa é criar o atributo no scope outra e substituir o valor do atributo.

Outra coisa, na sua 2ª dúvida o atributo não é removido da sessão, testa isso:

//java
request.setAttribute("pessoa", "Fulano 1");
request.getSession().setAttribute("pessoa", "Fulano 2");
//jsp
&lt;c:set var="pessoa" scope="request"  /&gt;
<p>pessoa request ${pessoa} </p>
<p>pessoa session ${sessionScope.pessoa} </p>

foi falta de compreensão minha então, ou talvez essa frase
"Se o atributo nomeado por “var” não existir, ele será criado"
seja confusa, pois independente de ele existir ou não, quem vai ter superioridade é o c:out , pois pra que eu iria querer saber se ele foi criado ou não…

Cara , consegui intender com suas palavras…

//java  
request.setAttribute("pessoa", "Fulano 1");  
request.getSession().setAttribute("pessoa", "Fulano 2");  
//jsp  
<c:set var="pessoa" scope="request"  />  
<p>pessoa request ${pessoa} </p>  
<p>pessoa session ${sessionScope.pessoa} </p>

GENIAL luiz_renato , mais ainda é estranho porque isso : ${pessoa} funciona por exemplo se eu definir

<c:set var="pessoa" scope="session" value="Fulano" />

ou então se eu fazer o seguinte.

request.getSession().setAttribute("pessoa", "Fulado 2");
${pessoa}

também funciona… muito estranho o ${pessoa} só Não funciona quando eu solicito a remoção de atributo via c:out, será que tem alguma explicação? ou é algum bug?

Cara , muito obrigado, é extremamente difícil achar alguém que ajude , quando se trata de certificações que não seja a de programador

luiz_renato compreendi, é o seguinte.
quando eu faço isso

<c:set var="pessoa" scope="request" />  
<p>pessoa request ${pessoa} </p>  
<p>pessoa session ${sessionScope.pessoa} </p>  

sem o value no c:set o container não avalia o valor como null, ele avalia como vazio, por isso ele não solicita a remoção do atributo e ${pessoa} é impresso como “vazio”.

Agora isso funciona perfeitamente.

//java
request.setAttribute("n", null);
request.getSession().setAttribute("pessoa", "Fulado 2");
//jsp
<c:set var="pessoa" scope="request" value="${n}" />
${pessoa}

é mostrado Fulano 2, você me ajudou muito luiz_renato . muito obrigado

É isso aí, continue estudando e boa sorte.

Tirei a minha OCPWCD a pouco mais de uma mês e apesar de não ter tido um “graaande” score nem ter sido a 6, te garanto é muito legal!!

luiz_renato aproveitando sua bondade, vou tirar algumas dúvidas sobre a prova, vou tirar a 5 também, pretendo fazer a prova daqui um mês.
Cara estou um pouco preocupado com o inglês, como são as perguntas? são “verbosas”, tipo mais de 3 linhas na descrição?
Qual simulado você fez e qual foi seu score no mesmo?

Cara,

Foram várias questões que contavam uma descrição, algumas com + de 3 linhas, principalmente sobre padrões de projeto mas tbm sobre tag´s personalizadas e outros assuntos , se vc é acostumado a ler manuais e tutoriais em inglês blz, senão é bom treinar.

Minha preparação está longe de ser um exemplo. Comecei a estudar no fim de dezembro e fiz a prova no começo de fevereiro, não deu pra se preparar muito bem, mas como era a 2ª vez que eu tinha feito ( em 2011 levei uma surra e não passei e só voltei a estudar em dezembro passado depois do Natal) e o voucher ia vencer tbm em fevereiro meti a cara…
Fiz poucos simulados, uns demos do Whizlabs,Enthuware (este é barato e o pessoal fala muito bem) e uns PDF´s que peguei na net, mas no total não cheguei a fazer nem 150 questões… Meu score foi raspando: 73% , se tivesse estudado mais me sairia melhor.

Conselho: varre a internet e faz todos os simulados que puder, as questões que vc errar tenta descobrir porque, anota e assim vc vai sedimentando conhecimento.

Boa sorte!

luiz_renato, obrigado por esclarecer minhas dúvidas.