在JSP(JavaServer Pages)中,<% %>
和<%! %>
都是用来插入Java代码的标记,但它们的用途和作用范围有所不同。
-
<% %>
(Scriptlet):- 用途:用于插入将直接嵌入到生成的servlet的
_jspService
方法中的Java代码,相当于在一个方法内部编写的Java代码,因此在其中定义的变量是局部变量。每次客户端发送请求时,容器都会调用该 Servlet 的_jspService
方法来处理请求,所以<% %>
里面的代码每次请求时都会执行。 - 作用范围:仅在请求处理中有效,也就是说它们在每次HTTP请求时都会被执行。
- 典型用法:
<% int count = 0; count++; out.println("Count: " + count); %>
- 用途:用于插入将直接嵌入到生成的servlet的
-
<%! %>
(Declaration):- 用途:用于声明变量和方法,这些声明会被翻译成servlet类的成员变量或方法。这些代码在整个JSP页面中都有效,可以在多个请求中共享。
- 作用范围:声明的变量和方法在整个JSP页面中都有效,并且在不同请求中共享同一个实例。
- 典型用法:
<%! int count = 0; public void incrementCount() { count++; } %>
实例对比
假设有一个JSP页面如下:
<%!
int counter = 0;
public void incrementCounter() {
counter++;
}
%>
<%
incrementCounter();
out.println("Counter: " + counter);
%>
在这个例子中:
counter
变量和incrementCounter
方法是在<%! %>
标记中声明的,因此它们在整个JSP页面中都是类级别的成员变量和方法。- 在
<% %>
标记中调用了incrementCounter()
方法并输出counter
的值。
每次请求这个JSP页面时,counter
的值都会增加,因为它是一个类级别的成员变量。而如果将counter
变量放在<% %>
中,每次请求都会重新初始化为0。
总结
- 使用
<% %>
插入的代码是在每次请求时执行的,适用于动态内容的生成。 - 使用
<%! %>
声明的变量和方法是类级别的,在整个JSP页面中共享和持久存在,适用于需要在多个请求之间共享状态或定义辅助方法。