0

我想在显示视图之前在使用范围的会话中应用一个变量,而不是这个视图将使用这个变量。

链接在这里:

<h:link value="#{msg.persondeactivate}" outcome="persondeactivate" />

这是faces-config.xml

<navigation-rule>
    <navigation-case>
        <from-outcome>persondeactivate</from-outcome>
        <to-view-id>/deactivatePerson.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

这是视图(deactivatePerson.xhtml):

...<h:outputText value="#{msg.personIsDeactivate}" rendered="#{controller.personDeactivated}" style="color:green" />... <h:commandButton action="#{controller.deaktivieren}" value="#{msg.deactivate}"></h:commandButton>...

这是托管bean:

@ManagedBean @SessionScoped public class Controller { ... private boolean personDeactivated = false; public String deaktivieren(){ personDeactivated = false;
    // Deactivate process personDeactivated = true; return "persondeactivate";} ... }

我希望在第二次调用视图 (deactivatePerson.xhtml) 之前将变量personDeactivated设置为false 。

这没用。

有人可以告诉我有什么问题吗?

提前致谢。

4

1 回答 1

0

您可以使用<f:event type="preRenderView">在视图呈现之前调用支持 bean 侦听器方法。

<f:event type="preRenderView" listener="#{controller.onPreRenderView}" />

public void onPreRenderView() {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        // Do your job here when the view is been freshly requested by GET.
    }
    else {
        // Do your job here when a POST request is been performed by command link/button.
    }
}

与具体问题无关,我的印象Controller实际上是在错误的范围内。一个更好的解决方案是@ViewScoped代替它。这样,bean 实例将在每个新的 GET 请求上重新创建,并且只要您回发到同一个视图就可以存活(因此,在多个浏览器选项卡中打开同一页面时,您不会遇到不一致和不直观的行为/windows 在同一个会话中共享同一个会话范围的 bean!)。另请参阅如何选择正确的 bean 范围?

于 2012-04-04T16:26:05.283 回答