java - 为什么不同包含的jsp中的同名变量不会引发异常?

标签 java jsp include redefinition redefine

我有一个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 不报告‘变量重定义’异常?”

最佳答案

JSP 编译器将两个 JSP 文件编译为两个不同的 servlet。每种情况下的变量的作用域都是其各自的 servlet 类,因此这与在两个单独的 Java 类中声明具有相同名称的字段非常相似:不会发生冲突。

这在您的代码中很明显,因为您依赖编译的 JSP 页面的类名来设置 __jspName 变量:

String __jspName = this.getClass().getSimpleName().replaceAll("_", ".");

这将为您的两个包含文件生成 header.jspfrontpage.jsp,表明它们已被编译为两个单独的类。

关于java - 为什么不同包含的jsp中的同名变量不会引发异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45070901/

相关文章:

java.lang.IllegalArgumentException : warning no match for this type name: queryKey [Xlint:invalidAbsoluteTypeName]

java - 使用 OAuth-Signpost 和 Apache HttpComponents 签署 POST 请求的正确方法是什么?

java - 通过创建对象为其他类的数组赋值

java - Spring 3.x MVC Controller :Adding attribute to Request/Session

c++ - 循环包含,我如何在不改变类层次结构的情况下解决这个问题

java - 如何使用 JDBC 连接到 SQL Server

javascript - 从作为ajax响应加载到div中的页面中删除html元素

java - 如何使用 REST JAX-RS 实现在满足特定条件时重定向用户?

c++ - includes 在 C++ 中如何工作?

c++ - 叮当格式 : disable ordering includes