我有一个父jsp a.jsp,其中包含另一个jsp b.jsp。我正在计算b.jsp中的一些值,这些值需要在父jsp a.jsp中使用,它将把这个计算出的值传递给另一个jsp,例如c.jsp。如何评估子jsp中的值并在该页面完全加载之前将其传递给父jsp?
答案 0 :(得分:2)
你如何在父母中包括“孩子”jar?静态或动态导入?
如果你有
<%@ include file="myFile.jsp" %>
通过
进行更改<jsp:include file="myFile.jsp" />
然后在父级中在请求中设置属性 (不在会话中,这将是“更脏”):
<% request.setAttribute("attrName", myValue) %>
最后,在“孩子”中jsp:
<% myValue = (MyValueType)request.getAttribute("attrName") %>
答案 1 :(得分:1)
如果你需要在包含和包含jsp(反之亦然)之间传递属性,你应该使用页面上下文,这是更短的上下文(从生命周期的角度来看)
答案 2 :(得分:1)
您可以在b.jsp中的请求中设置变量,并在parent.jsp中使用它们。但是你只能在&lt; jsp:include&gt;之后的父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>
答案 3 :(得分:-1)
你可以通过会话范围来实现这一目标。
(b.jsp)
session.setAttribute("value",value);
(c.jsp)
session.getAttribute("value");
但是,我建议做一些重大的重组。在您的示例中,数据的值取决于页面上元素的顺序。如果您需要重新安排事情(例如,在c.jsp包含之后移动b.jsp包含),则可能会破坏业务逻辑。
Web开发的一个好模式是模型 - 视图 - 控制器模式。 “控制器”确定应显示哪个页面,“模型”计算所有数据并使其可用,“视图”执行显示和格式化。
我建议您阅读本文,这有助于理解为什么MVC是一种有价值的方法: http://www.javaranch.com/journal/200603/Journal200603.jsp#a5
编辑:正如其他用户所提到的,请求范围将比会话范围更清晰。但是,我仍然建议在写入任何显示内容之前先确定该值。