这个';装订';JSF中的属性工作?何时以及如何使用它?
在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
值
属性和绑定
属性
我对这两种方法的不同之处很感兴趣。鉴于:
public class User {
private String name;
private UICommand link;
// Getters and setters omitted.
}
当指定值
属性时会发生什么,这是非常简单的。getter运行以返回User
bean的name
属性值。该值将打印到HTML输出
但是我不明白绑定是如何工作的。生成的HTML如何与用户
bean的链接
属性保持绑定
下面是手动美化和注释后生成的输出的相关部分(请注意,idj_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是否被单击。或者它可以是ehtp:../jsf;LinkId=123
回答这个问题最简单的方法是创建一个只有一个链接的JSF页面,然后检查它生成的html输出。这样,您就可以使用您正在使用的JSF版本确切地知道这是如何发生的 它是如何工作的?
当JSF视图(Facelets/JSP文件)被构建/恢复时,将生成一个JSF组件树。此时,将计算所有绑定属性()。当JSF组件需要在添加到组件树之前创建时,JSF将检查绑定
属性是否返回预创建的组件(即非空
),如果是,则使用它。如果没有预先创建,那么JSF将“以常规方式”自动创建组件,并以自动创建的组件实例作为参数调用setter-behindbinding
属性
实际上,它将组件树中组件实例的引用绑定到作用域变量。该信息在组件本身生成的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中也是一种非常罕见的用例,通常不是最佳实践。它表示一种设计气味。你是诺玛吗