2

我知道这个问题被问了一遍又一遍。我确实喜欢在与此相关的所有问题中提出的建议,并且我在 我提出的这个问题中做了 BalusC

告诉我,我还没有成功。所以网络应用程序的流程是:

我登录,成功时布尔loginIn变为真,页面被重定向到home.xhtml。(bean TestBean 和 EnterView 被实例化和 SessionScoped)。如果loggedIn 布尔值为真,则在此页面中我得到4 个链接。

为了不使用 JSTL c:choose 标签(因为 JSTL 和 JSF “一个在视图构建时运行,另一个在视图渲染时运行。” - BalusC)我使用了渲染属性。

出现带有链接的列表,但我必须单击它们两次才能执行应执行的操作。

片段:

        <h:form rendered="#{enterView.userBean.loggedIn}">
            <ul id="grileList">
                <li><h:commandLink action="#{menuView.showTestsPage(1)}"
                        value="label1" rendered="#{enterView.userBean.loggedIn}"/></li>
                <li><h:commandLink action="#{menuView.showTestsPage(2)}"
                        value="label2" rendered="#{enterView.userBean.loggedIn}"/></li>
                <li><h:commandLink action="#{menuView.showTestsPage(3)}"
                        value="label3"  rendered="#{enterView.userBean.loggedIn}"/></li>
                <li><h:commandLink action="#{menView.showTestsPage(4)}"
                        value="label4" rendered="#{enterView.userBean.loggedIn}"/></li>
            </ul>
        </h:form>

h:form 它被正确渲染,因此它已经经历了视图渲染阶段,但是当我单击链接时它不执行操作(就在我单击它们两次时),所以它是视图构建时间???我读了他们两个,我以为我明白了......

我已将渲染属性放在 commandLinks 中以尝试渲染它们,但我没有成功。

4

1 回答 1

3

“需要单击两次才能调用操作”的症状可以识别为JSF 规范问题 790的结果,该问题已在即将到来的 JSF 2.2 中修复。

简而言之,如果您有 2 个表单,其中一个仅通过 ajax 更新另一个表单的父组件,那么另一个表单将失去其 JSF 视图状态(<input type="hidden" name="javax.faces.ViewState">)。第一次以另一种形式调用 ajax 操作不会调用任何操作,但会添加 JSF 视图状态,然后任何后续操作都会成功。

要解决此问题,您需要在 ajax 渲染中明确指定其他表单的客户端 ID。例如

<f:ajax ... render=":someComponent :otherForm" />
...

<h:someComponent id="someComponent">
    <h:form id="otherForm" rendered="#{enterView.userBean.loggedIn}">
        ...

也可以看看:

于 2013-03-22T22:25:40.333 回答