我有一个index.jsp,其中包含header.jsp和frontpage.jsp,如下所示:
<body>
...
<%@ include file="include/header.jsp"%>
...
<table>...<td> <%@ include file="include/frontpage.jsp"%></td>....
在header.jsp中:
...
String __jspName = this.getClass().getSimpleName().replaceAll("_", ".");
System.out.println("[header.jsp] used user quota = "+usedNum);
...
在frontpage.jsp中:
...
String __jspName = this.getClass().getSimpleName().replaceAll("_", ".");
System.out.println("[frontpage.jsp] "front_url = " + fp_front_url);
...
实际上,这是一个意外,我忘记删除其中一个声明。但是当我在Tomcat 6下运行index.jsp时它正常工作并且在catalina.out中(注意:出于安全原因我省略了front_url的值)
...
[header.jsp] used user quota = 0
[frontpage.jsp] front_url = ...
...
我的困惑是:“为什么JVM不会报告'变量重新定义'异常?”
答案 0 :(得分:2)
JSP编译器将两个JSP文件编译为两个不同的servlet。每种情况下的变量都限定在其各自的servlet类中,因此它与在两个单独的Java类中声明具有相同名称的字段非常相似:不会发生冲突。
这在您的代码中很明显,因为您依赖已编译的JSP页面的类名来设置__jspName
变量:
String __jspName = this.getClass().getSimpleName().replaceAll("_", ".");
这会为您的两个包含文件产生header.jsp
和frontpage.jsp
,表示它们已被编译为两个单独的类。