JSP页面中的变量与“包含”页面

54

在使用 <%@ include %> 标签添加页面的 JSP 页面中,变量的作用域规则是什么?

我的理解是,被包含的页面会被直接复制到主页面中,所以如果我在父 JSP 中声明了变量,那么它应该可以在子页面中使用。

然而,Eclipse 报错(这是可以理解的,因为我有可能在任何页面中包含这些页面,或将它们作为单独的页面使用。当我尝试启动 Tomcat 服务器时,它无法启动。

基本上,我想要从父页面获取会话中的一些变量,并在子页面中使用它们。但这并不起作用。

所以,我想在每个子页面中都从会话中获取它们,但我想知道是否可以给它们相同的变量名称,或者我必须在每个页面中为它们选择不同的变量名称以避免冲突。

还有,如果我在父 JSS 中导入了 log4net,那么我在子页面中也必须导入吗?


如果变量在会话中,问题出在哪里?顺便问一下,你所说的父页面会话是什么意思? - Adeel Ansari
1
变量是整数变量,因为我必须从会话中获取它们,然后将它们转换为整数,每次使用它们时获取它们的int值。同时检查是否为空,我试图通过声明本地变量来避免这样做,以节省一些麻烦。 - Omar Kooheji
4个回答

89
在JSP中,有两种包含其他JSP页面的方式。
<%@include file="include.jsp"%>

并且

<jsp:include page="include.jsp" />

如果您使用前者,那么在include.jsp中,任何在父JSP上声明的变量都将在作用域内(当然,Eclipse不会看到这一点,就像您所推测的那样),因为它是由编译器复制进去的。
如果您使用第二种方法,则包含是在运行时完成的,包含页面具有其自己的作用域。
同样适用于导入。虽然在包含页面中冗余地导入它们是安全的。
如果我使用前者,我更喜欢以.jspf为后缀来表示JSP片段。然后我可以关闭一些片段文件中Eclipse的警告。但总的来说,我尽量避免使用那种方法,更喜欢第二种方法。
更多信息可以在此文档中找到:Include directiveJSP include

我对这个例子感到困惑。也许Jasmper代码存在一些问题?当我尝试在'inclued' .JSP中写入字符串时,使用*<%@include ...>*表单会导致运行时JSP编译器错误。我可以接受可能不允许“向后”传递值--基于@include的规则,为什么会出现错误呢? - will
1
请注意,在<%和@之间加上空格会导致错误,因此不要尝试编写<% @include file="include.jsp" %>。按照答案所示的方式没有空格将可以正常工作。 - CodeReaper

7

如果你想在要包含的页面路径中使用变量,请使用以下内容:

<% pageContext.include("/cities/" + (String) request.getAttribute("country_code") + ".jsp"); %>

4

从面向对象的角度来看,我建议不要依赖于parent.jsp中变量的作用域被包含在child.jsp中。这是因为当我在jsp中包含一个片段时,我倾向于想在许多不同的地方重用该片段。例如,如果我有一个child.jsp,我可能希望在parent1.jsp和parent2.jsp中使用它。在这种情况下最好不要使用变量继承。


10
你会选择做什么? - Brimstedt

2

创建变量时,应将其作用域设置为会话(session),否则包含的页面将无法看到它。 示例:

<logic:iterate id="supportTmp" name="publicites" indexId="indexLots" scope="session">                                    
    <c:set var="support" value="${supportTmp}" scope="session"/>
    <c:choose>
    <c:when test="${publiciteMoniteur == true}">
    <jsp:include page="/jsp/bodies/suiviEnvoiPubliciteMoniteurLigne.jsp" />
    </c:when>
    <c:otherwise>
        <jsp:include page="/jsp/bodies/suiviEnvoiPubliciteDefautLigne.jsp" />
    </c:otherwise>
</c:choose>
</logic:iterate>

你确定你不是想要一个REQUEST范围吗?如果是的话,jsp:included页面将会看到你的变量。Session范围会创建一个没有任何好处的会话值。 - Alexandre Roger

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