【发布时间】:2013-07-21 17:45:56
【问题描述】:
我有一个父 jsp a.jsp,其中包含另一个 jsp b.jsp。我正在计算 b.jsp 中的一些值,这些值需要在父 jsp a.jsp 中使用,它将这个计算的值传递给另一个 jsp,比如 c.jsp。如何在页面完全加载之前评估子 jsp 中的值并将其传递给父 jsp?
【问题讨论】:
我有一个父 jsp a.jsp,其中包含另一个 jsp b.jsp。我正在计算 b.jsp 中的一些值,这些值需要在父 jsp a.jsp 中使用,它将这个计算的值传递给另一个 jsp,比如 c.jsp。如何在页面完全加载之前评估子 jsp 中的值并将其传递给父 jsp?
【问题讨论】:
您可以使用会话范围来完成此操作。
(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
编辑:正如其他用户所提到的,请求范围比会话范围更干净。但是,我仍然建议在编写任何显示内容之前先确定值。
【讨论】:
您如何将“子”jar 包含在父级中?静态导入还是动态导入?
如果你有
<%@ include file="myFile.jsp" %>
改成
<jsp:include file="myFile.jsp" />
然后在父级中设置一个属性在请求中(不在会话中,那将是“更脏的”):
<% request.setAttribute("attrName", myValue) %>
最后,在“子”jsp中:
<% myValue = (MyValueType)request.getAttribute("attrName") %>
【讨论】:
您可以在b.jsp 中设置请求中的变量,并在parent.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>
【讨论】:
如果您需要在包含和包含 jsp 之间传递属性(反之亦然),您应该使用页面上下文,这是更短的上下文(从生命周期的角度来看)
【讨论】: