Значение на странице JSF не обновляется, даже если правильный метод получения
На странице JSF (скажем, page1) я щелкаю ссылку, которая вызывает всплывающее окно через JavaScript. Появляется всплывающее окно, а страница JSF1 остается в фоновом режиме.
Во всплывающем окне я работаю и работаю JSF. Когда я заканчиваю всплывающее окно, я нажимаю на кнопку во всплывающем окне, которая вызывает функцию JavaScript window.close(), чтобы закрыть ее, и метод действия кнопки обновляет значения в управляющем компоненте той же страницы1 и возвращает путь страницы page1, чтобы перенаправить меня в то же место, где я начал всплывающее окно. Так что метод getter получает хорошее значение, но моя страница1 не обновляется сразу после обновления вручную.
Оба бина (бин "вызывающий" и бин "получатель") являются SessionScoped.
РЕДАКТИРОВАТЬ
- page1 == tests.xhtml
- основным компонентом tests.xhtml является TestsBean
- Я нажимаю на одну из ссылок со значением ="Test no. #{O.noGrid}
- атрибут onclick запускает скрипт JavaScript, который вызывает всплывающее окно
фрагмент HTML-кода
<tbody> <ui:repeat var="o" value="#{testsBean.gridTableGeneral}" varStatus="status"> <h:form> <h:panelGroup rendered="#{status.even}"> <tr> <td class="order-table-even-row"><h:commandLink action="#{gridPopUpBean.showGridTest()}" target="_blank" onclick="confirmGrid('Are you sure you want to start the test no. #{o.noGrid}?');" value="Test no. #{o.noGrid}"> <f:setPropertyActionListener value="#{o.noGrid}" target="#{testsBean.noGridToShow}" /> </h:commandLink></td> <td class="order-table-even-row">#{o.totalAccess}</td> <td class="order-table-even-row">#{o.maxPercentage} %</td> <td class="order-table-even-row"><h:commandLink action="#{testsBean.showGridDetaildPage()}"> <img src="/juritest/resources/img/details.png" alt="details" /> </h:commandLink></td> </tr> </h:panelGroup> <h:panelGroup rendered="#{status.odd}"> <tr> <td class="order-table-odd-row"><h:commandLink action="#{gridPopUpBean.showGridTest()}" target="_blank" onclick="confirmGrid('Are you sure you want to start the test no. #{o.noGrid}?');" value="Test no. #{o.noGrid}"> <f:setPropertyActionListener value="#{o.noGrid}" target="#{testsBean.noGridToShow}" /> </h:commandLink></td> <td class="order-table-odd-row">#{o.totalAccess}</td> <td class="order-table-odd-row">#{o.maxPercentage} %</td> <td class="order-table-odd-row"><h:commandLink action="#{testsBean.showGridDetaildPage()}"> <img src="/juritest/resources/img/details.png" alt="details" /> </h:commandLink></td> </tr> </h:panelGroup> </h:form> </ui:repeat>
и фрагменты поддерживающего бина TestBean.java этой страницы
@ManagedBean @SessionScoped public class TestsBean implements Serializable { private static final long serialVersionUID = 1L; @EJB TestsManager testsManager; @ManagedProperty(value = "#{applicationContainer}") private ApplicationContainer container; @ManagedProperty(value = "#{accessesBean}") private AccessesBean accessesBean; ... getters / setter for the ui:repeat ... public void extractInformationFromDB(int gridCategory) { // extract from the container the right category grids gridList = testsManager.extractFromContainerRightCategory(container, gridCategory); // extract from the right grids array list the grid numbers setNoGrid(testsManager.setNoGrid(gridList)); // extract the accesses accessList = accessesBean.getAccessInformation(gridCategory); // extract from the access array list the grid numbers setNoAccessGrid(accessesBean.setNoAccessGrid(accessList)); setGridTableGeneral(testsManager.createGridTableGeneral(gridList, getNoGrid(), accessList, getNoAccessGrid()));
}
всплывающее окно после того, как это сделано, его работа заканчивается answerResult.xhtml
<ui:repeat var="n" value="#{answerResultBean.accessWrongAnswerColumnWrapperList}"> <hr /> <h:outputText value="#{n.noQuestion}. #{n.question}" /> <table style="text-align: left;"> <tr> <td> <h:form> <h:graphicImage value="/resources/img/#{n.rightGridAnswerA ? 'tick' : 'x'}Small.png" alt="#{n.rightGridAnswerA ? 'right' : 'wrong'} " /> </h:form></td> <td> <h:outputText value="a) #{n.a}" style="#{n.userAnswerA ? 'font-weight:bold;' : 'font-weight:normal;'}" /> </td> </tr> <tr> <td> <h:form> <h:graphicImage value="/resources/img/#{n.rightGridAnswerB ? 'tick' : 'x'}Small.png" alt="#{n.rightGridAnswerB ? 'right' : 'wrong'} " /> </h:form></td> <td> <h:outputText value="b) #{n.b}" style="#{n.userAnswerB ? 'font-weight:bold;' : 'font-weight:normal;'}" /> </td> </tr> <tr> <td> <h:form> <h:graphicImage value="/resources/img/#{n.rightGridAnswerC ? 'tick' : 'x'}Small.png" alt="#{n.rightGridAnswerC ? 'right' : 'wrong'} " /> </h:form></td> <td> <h:outputText value="c) #{n.c}" style="#{n.userAnswerC ? 'font-weight:bold;' : 'font-weight:normal;'}" /> </td> </tr> </table> <hr /> </ui:repeat> </div> <div id="loginDiv"> <h:commandButton style="text-align:left" onclick="closeWindow(); return true;" action="#{answerResultBean.closeButton()}" value="Close" /> </div>
и основным компонентом этой последней страницы всплывающего окна является AnswerResult.java
@ManagedBean @SessionScoped public class AnswerResultBean implements Serializable { private static final long serialVersionUID = 1L; @ManagedProperty(value = "#{testsBean}") private TestsBean testsBean; private AccessAnswerResultWrapper accessAnswerResultWrapper; private ArrayList<AccessWrongAnswerColumnWrapper> accessWrongAnswerColumnWrapperList; // getter / setter START /** * @param testsBean The testsBean to set. */ public void setTestsBean(TestsBean testsBean) { this.testsBean = testsBean; }
...
public String closeButton() { testsBean.extractInformationFromDB(GridHelper.convertingGridCategoryFromStringToInteger(getAccessAnswerResultWrapper().getCategory())); return Utils.path + "/tests/tests";
}
Я нажимаю кнопку во всплывающем окне с триггером value="Close" и событием, которое закрывает всплывающее окно, после чего выполняется метод closeButton(), выполняется метод извлечения из TestBean.java, который внутри него устанавливается атрибут, который я использую в качестве атрибута в пользовательском интерфейсе:repeat в tests.xhtml и, наконец, метод действия closeButton() перенаправляет меня в tests.xhtml, который, в свою очередь, снова вызывает вспомогательный компонент TestBean.java.
Я знаю, что это беспорядок, я знаю, что это не СУХОЙ и дизайн неисправен, но я постоянно учусь.
На последнем этапе я перенаправляю в tests.xhtml, прежде чем установить атрибут, который он использует, tests.xhtml вызывает bean-компонент, и он ДОЛЖЕН быть обновлен с новыми значениями. Но он не обновляется, только после обновления вручную.