如何检查一个JSP文件是否被另一个JSP文件包含?

3

大家都知道如何在JSP中包含文件...

我有两个文件:

one.jsp two.jsp

在two.jsp中,我有以下代码:

Long something = 0;

在one.jsp代码中:

<%@include file='two.jsp'%>
<%@include file='two.jsp'%>

我已经两次包含了同一个文件,这意味着会出现错误,因为某些变量将被创建两次,对吗?因此,在第二次包含文件之前,我应该检查一下,如果已经包含了一次,那么就不应再次包含它,如何检查呢?
在php中有include("file.php")的函数,它将包含文件。还有include_once("file.php")的函数,如果之前没有包含过该文件,则会包含文件。有没有其他解决方案?
1个回答

2
实际上,包含这两个静态引用会导致同一变量声明两次的错误。这些导入在编译时将包含页面的代码附加到包含页面中,然后一起编译。
我不知道JSP中是否内置了任何"include_once"方法,但您可以通过在顶级页面中声明一个全局Set(例如HashSet),或者将其声明为请求属性(在处理结束时应清除)来实现类似的功能,在其中您可以添加已经包含的页面的名称。

one.jsp

<% HashSet<String> pagesSet = new HashSet<String>(); %>
...
<%@include file='two.jsp'/>

two.jsp

<% if (!pagesSet.contains("two.jsp"){ %>
   //... Remember to actually ADD two.jsp to pageSet, 
   // because it IS being included NOW.
   pageSet.add("two.jsp");

   // Entire contents of two.jsp
   // ....
<% } %>

请注意,这与C语言中的“#ifndef #define #endif”模式非常相似。
需要考虑使用动态包含可以避免重复变量的问题。被包含的页面将在其自己的作用域中执行,并且要访问服务器端变量,您必须通过< jsp:param >或 Request Session Application 范围传递它们。有关静态和动态包含之间差异的信息,请参见此问题的答案:include directive and attribute name problem 此外,如果您有大量这些“条件性”的静态包含,您可能会达到64K方法限制

请注意我在答案中最新引入的细微差别,记住脚本片段(JSP中<% %>内的Java代码)被认为是不良实践。您应该使用统一表达式语言JSTL - Xavi López
我也很抱歉,但这不是一个代码工厂。当然,我没有测试过这个片段,现在我也不会了。答案中的建议应该足够了。您遇到了什么问题? - Xavi López
正如我所说,据我所知,没有与PHP的include_once()相当的东西,你只能自己进行检查,例如使用一个包含已经包含页面名称的HashSet。请考虑静态和动态导入之间的区别。如果您使用静态导入,则该页面将始终被包含。因此,您的解决方案是使用动态导入(<jsp:include>),并将它们放在检查页面是否已经被包含的if中。为了检查这一点,您可以使用在顶层页面中声明的全局Set变量,或将其作为属性放入请求中。 - Xavi López
Jayesh,当然,在包含后,您必须将"some.jsp"添加到HashSet中。我已经将此添加到未经测试的代码片段中... - Xavi López
如果您已经编写了这些包含文件,恐怕我没有看到任何简单的解决方案。除非您使用宏或其他方式在外部操作文件,例如通过文件名变量在文件开头插入该块。顺便说一句,您的句子“在将two.jsp包含在one.jsp页面之前,我必须检查two.jsp是否已包含在one.jsp中,如果未包含,则应该包含”清楚地说明了动态包含。 - Xavi López
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接