【问题标题】:Setting parent jsp variables in child jsp在子jsp中设置父jsp变量
【发布时间】:2013-07-21 17:45:56
【问题描述】:

我有一个父 jsp a.jsp,其中包含另一个 jsp b.jsp。我正在计算 b.jsp 中的一些值,这些值需要在父 jsp a.jsp 中使用,它将这个计算的值传递给另一个 jsp,比如 c.jsp。如何在页面完全加载之前评估子 jsp 中的值并将其传递给父 jsp?

【问题讨论】:

    标签: java jsp atg


    【解决方案1】:

    您可以使用会话范围来完成此操作。

    (b.jsp)

    session.setAttribute("value",value);
    

    (c.jsp)

    session.getAttribute("value");
    

    但是,我建议您进行一些重大的重组。在您的示例中,数据的值取决于页面上元素的顺序。如果您需要重新安排事情(例如,将 b.jsp 包含移动到 c.jsp 包含之后),您可能会破坏业务逻辑。

    一个好的 Web 开发模式是模型-视图-控制器模式。 “控制器”确定应该显示哪个页面,“模型”计算所有数据并使其可用,“视图”进行显示和格式化。

    我建议您查看这篇文章,这有助于理解为什么 MVC 是一种有价值的方法: http://www.javaranch.com/journal/200603/Journal200603.jsp#a5

    编辑:正如其他用户所提到的,请求范围比会话范围更干净。但是,我仍然建议在编写任何显示内容之前先确定值。

    【讨论】:

    • 真正使用会话范围来存储很可能是瞬态的数据(例如产品/sku 信息)是一个非常糟糕的主意。 ATG 中的会话可以在内存中停留 15 分钟或更长时间。请求范围是要走的路!
    【解决方案2】:

    您如何将“子”jar 包含在父级中?静态导入还是动态导入?

    如果你有

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

    改成

    <jsp:include file="myFile.jsp" />
    

    然后在父级中设置一个属性在请求中(不在会话中,那将是“更脏的”):

    <% request.setAttribute("attrName", myValue) %>
    

    最后,在“子”jsp中:

    <% myValue = (MyValueType)request.getAttribute("attrName") %>
    

    【讨论】:

    • 这个答案似乎很接近,但不完全是问题所要求的。我能够这样做......在父JSP中 - request.setAttribute("myAttrName", initialvalue);在子 JSP 中 - request.setAttribute("myAttrName", newvalue);然后在父级JSP中,在子级的jsp:include之后,获取值——String result = (String)request.getAttribute("myAttrName");
    【解决方案3】:

    您可以在b.jsp 中设置请求中的变量,并在parent.jsp 中使用它们。但是您只能在 标记之后的父 jsp 中使用它们。请记住,这一切都是在服务器端进行评估的,因此当您说“在该页面完全加载之前”时,您可以保证服务器在浏览器加载之前已经对其进行了评估。如果你的意思是你想延迟服务器上的评估,直到它下面的一些代码被评估,那是不可能的。至少不是这样的。

    b.jsp

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <c:set var="myVar" scope="request" value="Hello"/>
    

    parent.jsp

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <jsp:include page="b.jsp"></jsp:include>
    
    <span>
        The value is ${requestScope.myVar}.
    </span>
    

    【讨论】:

      【解决方案4】:

      如果您需要在包含和包含 jsp 之间传递属性(反之亦然),您应该使用页面上下文,这是更短的上下文(从生命周期的角度来看)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-04
        • 1970-01-01
        • 2015-01-26
        • 1970-01-01
        • 1970-01-01
        • 2015-04-18
        • 2015-06-19
        • 1970-01-01
        相关资源
        最近更新 更多