这是我的代码
<%@page import="java.util.logging.Logger"%>
<%@page import="java.util.logging.Level"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page isThreadSafe="false"%>
<%! int k = 0;%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Concurrency</title>
</head>
<body>
<%
for (int i = 0; i < 10; i++) {
out.print(k + "->" + i + "</br>");
k++;
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
}
}
%>
</body>
</html>
我无法理解为什么当我在Tomcat上看到结果时,我从10开始。
我的结果
10->0
11->1
12->2
13->3
14->4
15->5
16->6
17->7
18->8
19->9
JSP是否遵循一些规则而不是核心Java规则? 我不明白,为什么k等到我达到10,然后开始打印?
答案 0 :(得分:0)
这是因为<%! int k = 0;%>
使k在执行后留下来。每次运行此页面时,k的最后一个值都会保留在内存中。你可以在&lt; %%&gt;中重置k。阻止,或删除&lt;%! %GT;从代码中完全阻止。
int k=0;
for (int i = 0; i < 10; i++)
答案 1 :(得分:0)
<%! int k = 0;%>
将k定义为JSP对应的Servlet
for (int i = 0; i < 10; i++)
在块级定义i。
对于k来说,随着每个页面请求继续增长是很自然的,因为它会映射到同一个Servlet
类,重用k
但是获得一个新初始化的i
。< / p>
----回应更详细解释的请求----
JSP页面实际上并没有按原样运行。它被传递到编译器并变成.class
文件。在将其传递到该编译器之前,需要将其转换为正确的.java
文件,并且这种情况的发生方式“大致”如下。
String
s。Servlet
。了解“标记”在“Servlet”中的位置可以加深您对JSP的理解。我强烈建议你偷看。
根据您的Servlet容器,编译器可能不同,但许多可以从命令行以一种形式或方式调用。在许多情况下,这样做是为了“预编译”您的JSP,因此请查找为您的环境预编译的JSP以获得提示。
通常您会找到命令行选项。如果运气好的话,有时候这些命令行选项包括仅仅生成.java
文件的“停止”(或者从.java
生成.jsp
文件后不删除{{1}}文件的选项文件。