JSF ページ (page1 としましょう) で、JavaScript を介してポップアップをトリガーするリンクをクリックします。ポップアップが表示され、JSF page1 はバックグラウンドに留まります。
ポップアップでは、JSF も動作します。ポップアップが終了したら、window.close() JavaScript 関数を呼び出してポップアップを閉じるボタンをクリックすると、ボタンのアクション メソッドが同じ page1 の管理 Bean の値を更新し、ページ page1 のパスを返し、ポップアップを開始したのと同じ場所にリダイレクトします。したがって、getter メソッドは適切な値を取得しますが、手動で更新した直後に page1 が更新されません。
両方の Bean (「発信者」ポップアップ Bean と「受信者」Bean) は SessionScoped です。
編集
- page1 == tests.xhtml
- tests.xhtml のバッキング Bean は TestsBean です
- value="Test no. #{o.noGrid} のリンクの 1 つをクリックします。
- onclick 属性は、ポップアップを表示する JavaScript スクリプトをトリガーします
xhtml のスニペット
<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>
このページのバッキング Bean 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>
ポップアップのこの最終ページのバッキング Bean は 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 からの抽出メソッドが実行され、その内部で設定されますtests.xhtml の ui:repeat の属性として使用する属性と、最後にアクション メソッドの closeButton() によって、tests.xhtml にリダイレクトされ、バッキング Bean が再び TestBean.java を呼び出します。
私はそれが混乱していることを知っています.DRYではなく、デザインに欠陥があることは知っていますが、私は継続的に学習しています.
最終段階で、使用する属性を設定する前に、tests.xhtml にリダイレクトします。tests.xhtml は Bean を呼び出し、新しい値で更新する必要があります。ただし、手動で更新した直後は更新されません。