2015-02-10 3 views
1

У меня есть родительский файл jsp, который включает в себя два дочерних jsp's. У меня есть переменная, определенный в родительском файле, как так: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 id="cashAuditFlag" style="display: none;">${param.cashAuditFlag}</div> 

Я тогда кнопку в Page1.jsp, при нажатии, я хочу, чтобы это изменить значение переменной родительского ${test} в "Y". Это, в свою очередь, затем изменит значение ${test} в page2.jsp, что приведет к изменению в page2.jsp.

Я в основном хочу, чтобы дочерний jsp передавал обновление другому дочернему jsp, оба из которых принадлежат одному и тому же родителю.

A - Это лучший способ сделать этот процесс?

B - Как я могу установить дочернюю jsp-версию родительской переменной jsp?

Спасибо!

ответ

2

Чтобы понять это, вам необходимо понять области применения. Подумайте о области видимости в виде ведра, в которую входят переменные, когда они определены. Некоторый код имеет доступ только к некоторым из этих ковшей.

Запросить переменные области доступны в любой части кода, который знает о 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. Вот поток о том, что нужно было случиться:

  1. Пользователь vists страницу JSP в какой-то URL, как «mywebapp/testPage.jsp»
  2. страница делает. Исходный оператор c: set, который устанавливает «test» var в значение «N».
  3. Пользователь нажимает на кнопку, которая заставляет браузер отправить новый запрос, но добавляет параметр запроса, в результате чего в запросе что-то вроде «mywebapp/testPage.jsp? ButtonClicked = 1»
  4. Всей ваших страниц JSP визуализации снова (помните, что JSP не делает ничего «динамически», то есть без обновления браузера, - когда вы нажимаете кнопку, браузер отправляет новый HTTP-запрос на веб-сервер, и ваш JSP снова отображается).
  5. В верхней части родительского 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} в любой точке вашей страницы.

+0

Это было прекрасно, спасибо за великолепное объяснение. – Porter

Смежные вопросы