Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
渲染属性更新后jsf组件会发生什么情况_Jsf_Jsf 2 - Fatal编程技术网

渲染属性更新后jsf组件会发生什么情况

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

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


我认为按钮的动作无论如何都会被触发,因为render属性只是用于渲染按钮,一旦页面被渲染,它就不再有任何影响。但是在做了一些测试之后,我觉得在单击按钮之后,渲染属性也会再次被检查,如果属性为false,则不会执行该操作。有人能证实这一点吗

免责声明:我现在将忽略这个奇怪的设计

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

是的,没错。这是防止可能被篡改的请求的保护措施的一部分,其中黑客试图模拟服务器端实际未呈现的操作组件的调用(例如仅当当前用户具有管理员角色时才呈现的管理员命令按钮)。在处理表单提交期间,始终会重新检查
呈现的
(和
禁用的
只读的
)属性

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

@ManagedBean
@ViewScoped
public class ViewBean {

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

    // ...
}



首先为什么要将
呈现的
属性绑定到
@ApplicationScoped
bean?您将通过这种方式实现什么样的功能需求?在共享资源的页面上,每个用户都可以对资源执行操作。但在这样一个动作执行一次之后,就不应该再执行了。例如,基于资源创建一个文件。创建文件后,应使用现有文件,并且不可能再次创建该文件,因此按钮不应显示在旁边。因此,您可以在每次应用程序部署时创建一次文件,或者根据文件存在情况创建一次文件?这两种情况下……文件生成最多可持续24小时,因此,应用程序必须保留正在处理的文件的列表。文件存在后,会显示一个下载链接,它看起来像是
@ViewScoped
托管bean的作业,在创建文件(以及其他规则)之前检查文件是否存在。如果文件已经存在,那么这个bean无法呈现
,如果呈现了它,您可以通过
或最合适的方式(弹出面板或任何其他方式)显示消息。好的,但我会强迫用户处理(可能)实际应用程序状态的过时副本。我不能使用您上面描述的机制在相同的资源上实现协作工作吗。或者渲染属性的更新过程是否不够快?然而,我仍然能够在自己的代码中捕获异常,或者在post后执行重定向,或者手动/自动更新操作中的属性(侦听器)方法。这与速度无关,更多的是与JSF生命周期中的正确时刻有关。
<h:commandButton ... rendered="#{viewBean.rendered}" />