带有“包含”页面的jsp页面中的变量

时间:2009-06-03 09:06:04

标签: java jsp java-ee

jsp页面中使用标签添加页面的变量的范围规则是什么?

我的理解是,包含的页面本质上是复制到页面中的verbatum,这将使我假设如果我在父jsp中声明了一个变量,它将在子页面中可用。

然而Eclipse抱怨这一点(可以理解的是,因为我可以将页面包含在任何页面中或单独使用它们。当我尝试启动tomcat服务器时,它无法启动。

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

所以我想到了从每个子页面的会话中获取它们的想法,但是我想知道我是否可以给它们所有相同的变量名称,或者我是否必须选择不同的变量名称对于他们在每个页面,所以他们没有发生冲突。

如果我在父jss中导入log4net,那么导入怎么办?我还必须将其导入到子jss中吗?

4 个答案:

答案 0 :(得分:82)

在JSP中,有两种方法可以包含其他jsp页面。

<%@include file="include.jsp"%>

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

如果你使用前者,那么在父JSP上声明的任何变量都将在include.jsp的范围内(当然Eclipse不会像你推测的那样看到它),因为它被编译器有效地复制了。

如果使用第二种方法,则包含在运行时完成,包含页面有自己的范围。

同样适用于进口。尽管在包含页面中冗余导入它们是安全的。

如果我使用前者,我更喜欢用.jspf后缀它们来表示JSP片段。我可以在片段文件中关闭一些日食警告。但总的来说,我试图避免使用该方法,而更喜欢第二种方法。

可在此处的文档中找到更多信息:Include directiveJSP include

答案 1 :(得分:7)

如果要在要包含的页面路径中使用变量,请使用以下命令:

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

答案 2 :(得分:4)

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

答案 3 :(得分: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>