JSP父/子参数操作

时间:2015-02-10 19:21:59

标签: java javascript jquery jsp

我有一个包含两个子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变量?

谢谢!

1 个答案:

答案 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中导致一些显示更改。这是需要发生的事情的流程:

  1. 用户在某个网址上访问您的JSP页面,例如&#34; mywebapp / testPage.jsp&#34;
  2. 页面呈现。初始c:set语句运行,用于设置&#34; test&#34; var值为&#34; N&#34;。
  3. 用户单击该按钮,这会导致浏览器发送新请求但添加请求参数,从而产生类似&#34; mywebapp / testPage.jsp?buttonClicked = 1&#34;
  4. 再次渲染所有JSP页面(请记住,JSP不会做任何事情&#34;动态&#34;即没有浏览器刷新 - 当您单击按钮时,浏览器会向Web服务器和您的网络服务器发送新的HTTP请求JSP再次呈现。)
  5. 在父JSP的顶部,您需要用于检查buttonClicked请求参数是否存在的逻辑。如果是这样,它将test的值设置为&#34; Y&#34;而不是&#34; N&#34;。
  6. 因此,要解释一下:为了让页面呈现方式不同,根据按钮是否被单击,您需要让按钮在单击时传递一个请求参数,并且您需要让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的值。