日期:2014-05-19  浏览次数:20973 次

<%! int a=0; %>中的!是什么意思
当浏览器第二次访问以下jsp网页时的输出结果是 a=2 b=1

<%!int a = 0;%>
<%
int b = 0;
a++;
b++;
%>
a:<%=a%><br>
b:<%=b%>



 


------解决方案--------------------
<%! %> 声明语句 <%! Date myD = new Date(); %>
<% %> 代码语句 <% for(int i=0;i<10;i++) %>
<%@ %> 指令语句 <%@ page import="java.util.*" %>
------解决方案--------------------
<%!int a = 0;%> //声明的变量a在是成员变量,在此处生命的方法或变量不属于service()方法体
<%int b =0 %>//此处声明的变量在service方法中

//具体区别可以写一个测试的jsp,运行tomcat,到work子目录下查看对应生成的java文件就知道了
------解决方案--------------------
jsp请求会被翻译成servlet,编后执行,比如tomcat可以在work文件下找到翻译后的源码
一个servlet在服务器中只有一个对应实例
而servlet的service方法(doGet,doPost)是线程安全的,应用服务器给每一个客户端(线程)分配不同的内存区域(你可以理解为service方法里的局部变量)实现请求处理,而jsp中<%!int a = 0;%>
相当于是在servlet里声明了实例变量,每个客户端都会访问这个变量,所以你每次访问的都是同一个a,它是线程不安全的。