要理解這一點,您需要了解範圍。將範圍想象爲變量在定義時進入的存儲區。有些代碼只能訪問其中一些存儲桶。
請求範圍變量可用於知道http請求的代碼的任何部分。每個HTTP請求只有一個請求範圍到您的Web應用程序。在您的示例中,父文件page1.jsp和page2.jsp都可以訪問該請求範圍。例如,如果你這樣做在你父JSP頁面:
<c:set var="test" value="N" scope="request" />
...那就把「測試」變到請求範圍內桶N的值
然後,如果你要查看或修改任何的Page1.jsp或page2.jsp這個值,你甚至都不需要有一個jsp:在你的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中通過使用requestScope對象名爲「test」變量:
<p>The Test Variable is: ${requestScope.test}</p>
同樣,如果你想在任何childPage修改這個變量,你可以簡單地做另一C:設置聲明:
<c:set var="test" value="Y" scope="request" />
現在,如果你在任何頁面打印$ {requestScope.test}的值,它將是Y.
在你的例子中,當你使用c:set語句而沒有scope =「request」時,你創建了一個變量在那個jsp頁面的「頁面範圍」中,這意味着你只能訪問jsp co中的那個變量你在你父母的jsp頁面中寫下了什麼。
現在,至於這是否是最好的方法來做到這一點......
你說你在page1.jsp中有一個按鈕,單擊時應該將測試變量更改爲Y,並在page2.jsp中引起一些顯示更改。下面是什麼需要發生流量:
- 用戶在某個網址vists你的JSP頁面,如「mywebapp/testPage.jsp」
- 頁面呈現。運行初始c:set語句,將「test」var設置爲「N」的值。
- 用戶點擊該按鈕,這會導致瀏覽器發送一個新的請求,但增加了一個請求參數,從而導致類似「mywebapp/testPage.jsp?buttonClicked = 1」
- 所有JSP頁面渲染的東西的請求(請記住,JSP不會「動態地」執行操作,即不刷新瀏覽器 - 當您單擊按鈕時,瀏覽器會向Web服務器發送新的HTTP請求,並且您的JSP將再次呈現)。
- 在您的父JSP的頂部,您需要檢查buttonClicked請求參數是否存在的邏輯。如果是這樣,它將測試的值設置爲「Y」而不是「N」。
所以,解釋一下:爲了讓頁面渲染的效果不同,根據按鈕是否被點擊,你需要讓你的按鈕在點擊時傳遞一個請求參數,並且你需要有您的JSP會查看新請求以查找該請求參數(以查看單擊該按鈕時提交的值)。如果你沒有檢查你的代碼,那麼,每當你的頁面加載時,你的父JSP頁面將會保持將測試變量重新設置爲N,因爲你的初始c:set value =「N」語句將始終運行在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一個新的請求參數與「1」的值。在父JSP中,它會看到這個請求參數存在(帶有「not empty param.buttonClicked」),它會將測試變量的值設置爲「Y」,覆蓋之前的「N」分配。
然後在您的page2.jsp中,您可以在頁面上的任意位置使用$ {requestScope.test}訪問測試的值。
這是完美的,謝謝你的偉大的解釋。 – Porter 2015-02-11 19:04:56