0

给定以下场景: jsf 组件(例如,CommandButton)的渲染属性依赖于应用程序范围的托管属性。由于该属性在所有会话中共享,因此很容易发生以下情况:用户 A 加载了一个 jsf 页面,并且按钮的 render 属性为 true,因此它被渲染。现在用户 B 也加载了页面,并且 render 属性仍然为 true。现在用户 A 单击导致属性更改其值的按钮,并且不再呈现该按钮。用户 B 仍然拥有旧视图,尽管现在渲染属性为 false,但他可以单击按钮,因为他同时没有更新他的视图。如果用户 B 点击按钮,现在会发生什么?

我认为无论如何都会触发按钮的操作,因为一旦渲染页面,render 属性仅用于渲染按钮并且不再有影响。但是在做了一些测试之后,在我看来,在单击按钮后还会再次检查渲染属性,如果该属性为 false,则不会执行该操作。有人可以证实这一点吗?

4

1 回答 1

0

免责声明:我暂时忽略这个奇怪的设计。

但是在做了一些测试之后,在我看来,在单击按钮后还会再次检查渲染属性,如果该属性为 false,则不会执行该操作。有人可以证实这一点吗?

对,那是正确的。这是防止可能被篡改的请求的一部分,其中黑客试图模拟实际上不是由服务器端呈现的操作组件的调用(例如,仅当当前用户具有管理员角色)。在处理表单提交期间,总是会重新检查rendered(and disabledand ) 属性。readonly

在您的特定情况下,您希望在视图范围内拥有负责该属性的条件的副本rendered,以便只要您与同一视图交互,就只会使用此副本。这可以通过将应用程序范围属性作为视图范围托管 bean 的托管属性注入,然后在rendered属性中引用它来实现。

@ManagedBean
@ViewScoped
public class ViewBean {

    @ManagedProperty("#{appBean.rendered}")
    private boolean rendered;

    // ...
}

<h:commandButton ... rendered="#{viewBean.rendered}" />
于 2012-11-18T23:30:28.430 回答