我有一个包含两个子jsp的父jsp文件。我在父文件中定义了一个变量,如下所示:
<c:set var="test" value="N" />
然后我将其传递给两个子jsp文件:
<div id="div_data_1" style="display:none;">
<jsp:include page="page1.jsp">
<jsp:param name="controlFlag" value="${test}"/>
</jsp:include>
</div>
<div id="div_data_2" style="display:none;">
<jsp:include page="page2.jsp">
<jsp:param name="controlFlag" value="${test}"/>
</jsp:include>
</div>
在我的page1.jsp文件中,我将值存储在隐藏的div中:
<div id="cashAuditFlag" style="display: none;">${param.cashAuditFlag}</div>
然后我在page1.jsp中有一个按钮,单击该按钮时,我希望它将父变量${test}
的值更改为"Y"
。这反过来会改变page2.jsp中${test}
的值,这会导致page2.jsp发生变化。
我基本上想让一个子jsp将更新传递给另一个子jsp,这两个子jsp属于同一个父。
A - 这是执行此过程的最佳方式吗?
B - 如何让子jsp更新父jsp变量?
谢谢!
答案 0 :(得分:3)
要理解这一点,您需要了解范围。将范围视为变量在定义时进入的存储桶。有些代码只能访问其中一些存储桶。
请求范围变量在知道http请求的代码的任何部分中都可用。每个HTTP请求只有一个请求范围到您的webapp。在您的示例中,父文件page1.jsp和page2.jsp都可以访问该请求范围。例如,如果您在父JSP页面中执行此操作:
<c:set var="test" value="N" scope="request" />
...它会进行&#34;测试&#34;变量到请求范围存储桶中,值为N。
然后,如果你想在page1.jsp或page2.jsp中查看或修改这个值,你甚至不需要在你的jsp:include中有一个jsp:param元素,所以你可以这样做这样:
<div id="div_data_1" style="display:none;">
<jsp:include page="page1.jsp"/>
</div>
<div id="div_data_2" style="display:none;">
<jsp:include page="page2.jsp"/>
</div>
因此,如果你想在任一子页面中显示它,你可以简单地使用表达式语言并告诉它在requestScope中查找名为&#34; test&#34;的变量。通过使用requestScope对象:
<p>The Test Variable is: ${requestScope.test}</p>
同样,如果你想在任一子页面中修改这个变量,你可以简单地做另一个c:set语句:
<c:set var="test" value="Y" scope="request" />
现在,如果您在任何页面中打印出$ {requestScope.test}的值,它将为Y.
在您的示例中,当您使用不带scope =&#34; request&#34;的c:set语句时,您在该jsp页面&#34;页面范围&#34;中创建了一个变量,意思是你只能访问你在父jsp页面中编写的jsp代码中的那个变量。
现在,关于这是否是最好的方法......
你说你在page1.jsp中有一个按钮,当点击它时,应该将测试变量更改为Y并在page2.jsp中导致一些显示更改。这是需要发生的事情的流程:
因此,要解释一下:为了让页面呈现方式不同,根据按钮是否被单击,您需要让按钮在单击时传递一个请求参数,并且您需要让JSP看起来在新请求中查找请求参数(查看单击按钮时提交的值)。如果您没有检查代码,那么,每次加载页面时,您的父JSP页面都会将测试变量重新设置为N,因为您的初始c:设置值=&#34; N&# 34;当JSP呈现时,语句将始终运行。
所以,如果你想要你所描述的情况,你必须在你的父JSP页面中做这样的事情:
<c:set var="test" value="N" scope="request"/>
<!-- Here's the check for whether the request parameter is present -->
<c:if test="${not empty param.buttonClicked}">
<c:set var="test" value="Y" scope="request"/>
</c:if>
<div id="div_data_1" style="display:none;">
<jsp:include page="page1.jsp"/>
</div>
<div id="div_data_2" style="display:none;">
<jsp:include page="page2.jsp"/>
</div>
...然后在page1.jsp中,你有按钮,你会做这样的事情:
<input type="submit" name="buttonClicked" value="1" />
这样,当单击该按钮时,它将刷新页面并添加一个名为buttonClicked的新请求参数,其值为&#34; 1&#34;。在父JSP中,它将看到此请求参数存在(使用&#34;非空param.buttonClicked&#34;)并且它将测试变量的值设置为&#34; Y&#34;,覆盖之前的&#34; N&#34;。
然后在page2.jsp中,您可以在页面上的任意位置使用$ {requestScope.test}访问test的值。