Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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

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_Binding_Components - Fatal编程技术网

这个';装订';JSF中的属性工作?何时以及如何使用它?

这个';装订';JSF中的属性工作?何时以及如何使用它?,jsf,jsf-2,binding,components,Jsf,Jsf 2,Binding,Components,在JSF中,有很多材料区分了值属性和绑定属性 我对这两种方法的不同之处很感兴趣。鉴于: public class User { private String name; private UICommand link; // Getters and setters omitted. } 当指定值属性时会发生什么,这是非常简单的。getter运行以返回Userbean的name属性值。该值将打印到HTML输出 但是我不明白绑定是如何工作的。生成的HTML如何与用户be

在JSF中,有很多材料区分了
属性和
绑定
属性

我对这两种方法的不同之处很感兴趣。鉴于:

public class User {
    private String name;
    private UICommand link;

    // Getters and setters omitted.
}

当指定
属性时会发生什么,这是非常简单的。getter运行以返回
User
bean的
name
属性值。该值将打印到HTML输出

但是我不明白
绑定是如何工作的。生成的HTML如何与
用户
bean的
链接
属性保持绑定

下面是手动美化和注释后生成的输出的相关部分(请注意,id
j_id_jsp_1847466274_1
是自动生成的,并且有两个隐藏的输入小部件)。 我正在使用Sun的JSF RI,版本1.2



这里存储的
绑定在哪里?

每个JSF组件将自己呈现为HTML,并完全控制它生成的HTML。JSF可以使用许多技巧,而具体使用哪一种技巧取决于您使用的JSF实现

  • 确保每个from输入都有一个完全唯一的名称,这样当表单提交回呈现它的组件树时,就可以很容易地判断每个组件在哪里可以读取它的值表单
  • JSF组件可以生成提交回serer的javascript,生成的javascript也知道每个组件的绑定位置,因为它是由组件生成的
  • 对于hlink之类的内容,您可以将绑定信息作为查询参数、url本身的一部分或matrx参数包含在url中。例如

    http:../somelink?componentId=123
    将允许jsf在组件树中查看链接123是否被单击。或者它可以是e
    htp:../jsf;LinkId=123

回答这个问题最简单的方法是创建一个只有一个链接的JSF页面,然后检查它生成的html输出。这样,您就可以使用您正在使用的JSF版本确切地知道这是如何发生的

它是如何工作的? 当JSF视图(Facelets/JSP文件)被构建/恢复时,将生成一个JSF组件树。此时,将计算所有
绑定
属性()。当JSF组件需要在添加到组件树之前创建时,JSF将检查
绑定
属性是否返回预创建的组件(即非
),如果是,则使用它。如果没有预先创建,那么JSF将“以常规方式”自动创建组件,并以自动创建的组件实例作为参数调用setter-behind
binding
属性

实际上,它将组件树中组件实例的引用绑定到作用域变量。该信息在组件本身生成的HTML表示中不可见。无论如何,此信息与生成的HTML输出无关。提交表单并恢复视图后,JSF组件树将从头开始重新构建,所有
绑定
属性都将重新评估,如上段所述。在重新创建组件树之后,JSF将把JSF视图状态恢复到组件树中

组件实例在请求范围内! 需要知道和理解的重要一点是,具体的组件实例有效地限定了请求范围。它们是根据每个请求新创建的,并且在恢复视图阶段,它们的属性由JSF视图状态中的值填充。因此,如果将组件绑定到支持bean的属性,那么支持bean绝对不应该位于比请求范围更广的范围内。另见第3.1.5章:

3.1.5组件绑定

组件绑定通常与JavaBean结合使用,JavaBean通过托管 Bean创建工具(参见第5.8.1节“VariableResolver和默认VariableResolver”)它是非常强大的 建议应用程序开发人员将组件绑定表达式指向的托管bean放在 “请求”作用域。这是因为将其置于会话或应用程序作用域需要线程安全,因为 UIComponent实例依赖于在单个线程内运行。此外,对环境也有潜在的负面影响 将组件绑定放入“会话”范围时的内存管理

否则,组件实例将在多个请求之间共享,可能会导致“”错误和“奇怪”行为,因为视图中声明的验证器、转换器和侦听器将从以前的请求重新附加到现有组件实例。症状很明显:它们被执行多次,在组件绑定到的同一范围内的每个请求执行一次以上

而且,在重载情况下(即当多个不同的HTTP请求(线程)同时访问和操作同一个组件实例时),您迟早会遇到应用程序崩溃,例如,或,甚至是一些“奇怪的”
IndexOutOfBoundsException
ConcurrentModificationException
直接来自JSF实现源代码,而JSF正忙于保存或恢复视图状态(即堆栈跟踪指示
saveState()
restoreState()
方法等)

在bean属性上使用
绑定
是一种糟糕的做法 无论如何,以这种方式使用
binding
,将整个组件实例绑定到bean属性,即使是在请求范围的bean上,在JSF 2.x中也是一种非常罕见的用例,通常不是最佳实践。它表示一种设计气味。你是诺玛吗