Чтобы понять это, вам необходимо понять области применения. Подумайте о области видимости в виде ведра, в которую входят переменные, когда они определены. Некоторый код имеет доступ только к некоторым из этих ковшей.
Запросить переменные области доступны в любой части кода, который знает о HTTP-запросе. Для каждого веб-приложения есть только одна область запроса для HTTP-запроса. В вашем примере родительский файл, page1.jsp и page2.jsp все имеют доступ к этой области запроса. Например, если вы сделали это в ваших родителях JSP странице:
<c:set var="test" value="N" scope="request" />
... было бы поставить «тест» переменный в области запроса ведро со значением N.
Тогда, если вы хотите просмотреть или изменить это значение в любом Page1.jsp или Page2.jsp, вам даже не нужно иметь JSP: PARAM элемент в вашем JSP: включить, так что вы можете сделать это:
<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:
<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 и вызвать некоторое изменение отображения на странице2.jsp. Вот поток о том, что нужно было случиться:
- Пользователь vists страницу JSP в какой-то URL, как «mywebapp/testPage.jsp»
- страница делает. Исходный оператор c: set, который устанавливает «test» var в значение «N».
- Пользователь нажимает на кнопку, которая заставляет браузер отправить новый запрос, но добавляет параметр запроса, в результате чего в запросе что-то вроде «mywebapp/testPage.jsp? ButtonClicked = 1»
- Всей ваших страниц JSP визуализации снова (помните, что JSP не делает ничего «динамически», то есть без обновления браузера, - когда вы нажимаете кнопку, браузер отправляет новый HTTP-запрос на веб-сервер, и ваш JSP снова отображается).
- В верхней части родительского JSP вам нужна логика, которая проверяет наличие параметра buttonClicked request. Если это так, оно устанавливает значение теста «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