【问题标题】:Variables in jsp pages with "included" pages带有“包含”页面的 jsp 页面中的变量
【发布时间】:2010-10-30 22:27:15
【问题描述】:

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

我的理解是,包含的页面本质上是逐字复制到页面中的,这将导致我假设如果我在父 JSP 中声明了一个变量,那么它将在子 JSP 中可用。

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

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

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

如果我在父 jss 中导入 log4net,我还需要在子 jss 中导入它吗?

【问题讨论】:

  • 如果变量在会话中,问题出在哪里?顺便说一句,父页面的会话是什么意思?
  • 变量是整数变量,因为我必须从会话中获取它们,然后将它们转换为 Integer,然后每次使用它们时获取它们的 int 值。还检查无效性我试图通过声明一个局部变量来避免自己的痛苦。

标签: java jsp jakarta-ee


【解决方案1】:

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

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

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

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

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

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

如果我使用前者,我更喜欢在它们后面加上 .jspf 来表示 JSP 片段。我可以关闭片段文件中的一些 Eclipses 警告。但总的来说,我尽量避免使用这种方法,而更喜欢第二种方法。

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

【讨论】:

  • 我被这个例子弄糊涂了。也许 Jasmper 代码存在挑战?使用 形式;当我尝试写入“包含”.JSP 中的字符串时,出现运行时 JSP 编译器错误。我可以接受,也许我不允许“向后”传递值——为什么会出现错误,基于@include 的规定规则?
  • 注意。没有空格,如答案所示将正常工作。
【解决方案2】:

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

【讨论】:

  • 你会怎么做?
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    创建变量时,应将范围设置为会话,否则,包含的页面将看不到它。 示例:

    <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 页面将看到您的变量。会话范围将创建一个值,该值会无缘无故地留在会话中。
    猜你喜欢
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2016-02-19
    • 2015-07-08
    相关资源
    最近更新 更多