问题引入:
JSP文件中这两种变量声明有什么区别?
<%!int count;%>
<% int count2;%>
在JSP中<%! %>
为JSP声明,可以声明变量和方法,与<% %>
程序片不同的是,前者声明的变量或方法会成为该JSP编译后的Servlet类的成员变量或方法。
下面我们来证实:
在count.jsp中分别使用两种方法声明变量
知识点: JSP页面在第一次访问时会被servlet容器编译为Servlet类。
使用浏览器访问count.jsp后在下面目录中可以看到生成对应的java文件和编译后的.class文件(Tomcat编译JSP文件后生成的类文件会在work目录里)
打开.java后可以看到变量count和方法print()为类成员。
而在_jspService()方法里
count2被定义为方法变量
知识点:
1.servlet的运行模式为单实例多线程,也就是在web项目运行过程中每个servlet类只有一个实例,而每次访问JSP页面Tomcat都会创建线程调用编译后servlet类实例的service方法。
所以:
<% %>
里定义的变量为方法变量。
<%! %>
里定义的变量为类变量。
测试例子:
JSP文件:
使用浏览器打开,每次刷新(创建线程调用servlet的service()方法)成员变量count都会+1,即使使用不同浏览器也会在原本的值上+1,而方法变量count2一直是0;(细心的朋友会发现“count2 = 0;”,原因是直接使用没有初始化的方法变量的话java编译器会报The local variable count2 may not have been initialized错误)