diferença entre <%! e <%

Li em um livro que eu posso definir métodos e variáveis, dentro de um arquivo jsp, da seguinte forma:

<%! String nome = "Julio" %>

mas qual é a diferença entre declarar uma variável desta forma, e declarar da seguinte forma:

<% String nome = "Julio" %>

há alguma diferença entre as duas formas?

grato

Julio Romano

Simples qundo vc usa o <%! boolean b = true; %>
vc est´declarando fora do metodo _jspService() e quando vc coloca apenas
<% boolean b = true; %> vc coloca dentro do _jspService().

Pois é, na primeira forma ela será um atributo do servlet, enquanto na segunda será uma variável local.

não entendi mto bem…
estou iniciando em jsp e isto não está mto claro pra mim…
poderiam me dar exemplos de o que usar e quando usar?

grato

Julio Romano

Vamos pelo principio que um JSP se torna um Servlet, entaum… no servlet:

public String nomeUsuario = &quot;Shadow&quot;;


public void doGet&#40;HttpServletRequest request, HttpServletResponse response&#41;
&#123;

 String nomeUsuario = &quot;Duke&quot;;

try
&#123;
response.getWriter&#40;&#41;.println&#40;nomeUsuario + &quot;&lt;br&gt;&quot;&#41;;
response.getWriter&#40;&#41;.println&#40;this.nomeUsuario + &quot;&lt;br&gt;&quot;&#41;;
&#125;
catch&#40;Exception e&#41;
&#123;&#125;&#125;

Agora em um Jsp:


&lt;%! public String nomeUsuario = &quot;Shadow&quot;;%&gt;


&lt;% String nomeUsuario = &quot;Duke&quot;;%&gt;

&lt;%= this.nomeUsuario %&gt;
&lt;br&gt;
&lt;%= nomeUsuario %&gt;

creio q assim da pra entender mais!!

Você não deve usar essa primeira forma.
Servlets não devem ter atributos, pois eles não são instanciados mais de uma vez: são criadas threads.
E as threads compartilham os mesmos atributos. Se uma alterar aquela string, a mudança vai se refletir na outra também.

então, se eu definir:

&lt;%! String nome = &quot;Julio&quot;; %&gt;

A variável nome, terá o valor Julio, a todos os usuários que acessarem minha página jsp?

Sim.