我有一个父 jsp a.jsp,其中包括另一个 jsp b.jsp。我正在计算 b.jsp 中的一些值,这些值需要在父 jsp a.jsp 中使用,它将这个计算的值传递给另一个 jsp,比如 c.jsp。如何在页面完全加载之前评估子 jsp 中的值并将其传递给父 jsp?
4 回答
您如何在父级中包含“子”jar?静态导入还是动态导入?
如果你有
<%@ include file="myFile.jsp" %>
改变它
<jsp:include file="myFile.jsp" />
然后在父级中设置请求中的属性(而不是在会话中,这将是“肮脏的”):
<% request.setAttribute("attrName", myValue) %>
最后,在“子”jsp 中:
<% myValue = (MyValueType)request.getAttribute("attrName") %>
如果您需要在包含和包含的 jsp 之间传递一个属性(反之亦然),您应该使用页面上下文,这是更短的上下文(从生命周期的角度来看)
您可以在 b.jsp 中设置请求中的变量,并在 parent.jsp 中使用它们。但是您只能在 <jsp:include> 标记之后的父 jsp 中使用它们。请记住,这一切都是在服务器端进行评估的,因此当您说“在该页面完全加载之前”时,您可以保证服务器在浏览器加载它之前已经对其进行了评估。如果您的意思是您想延迟服务器上的评估,直到它下面的某些代码被评估,那是不可能的。至少不是这样。
b.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="myVar" scope="request" value="Hello"/>
父.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>
您可以使用会话范围来完成此操作。
(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
编辑:正如其他用户所提到的,请求范围比会话范围更干净。但是,我仍然建议在编写任何显示内容之前先确定值。