JSF2自定义组件具有属性值don';t触发属性设置程序
我已经在JSF2.0中构建了一个自定义组件 标签如下所示:JSF2自定义组件具有属性值don';t触发属性设置程序,jsf,jsf-2,attributes,custom-component,Jsf,Jsf 2,Attributes,Custom Component,我已经在JSF2.0中构建了一个自定义组件 标签如下所示: <x:myTag id="1" name="AAA" /> 如果我使用 <x:myTag id="1" name="AAA" /> 对于encodeBegin方法中的name属性,我总是得到null。调试之后,我注意到,setName方法从未被调用。我认为可能是关于EL的某些东西把事情搞砸了(我仍然相信原因与此相关),但真正奇怪的是,id属性工作正常:setter被调用,并且当econding开始时,值与预期
<x:myTag id="1" name="AAA" />
如果我使用
<x:myTag id="1" name="AAA" />
对于encodeBegin
方法中的name
属性,我总是得到null
。调试之后,我注意到,setName
方法从未被调用。我认为可能是关于EL的某些东西把事情搞砸了(我仍然相信原因与此相关),但真正奇怪的是,id
属性工作正常:setter被调用,并且当econding开始时,值与预期值一样
我必须提到,如果我从encodeBegin
方法调用getAttributes().get(“name”)
,我会得到正确的名称值,但我很好奇为什么它不能与getter和setter一起工作
您知道我的组件缺少什么吗?这种行为是预期的,并且符合规范。作为值表达式的属性值由设置。也就是说,只有在实际使用它们时才应该对它们进行评估,通常是在视图渲染期间
id
(和binding
)属性有特殊处理:它在设置之前在视图构建期间进行评估,因此将调用“常规”setter而不是setValueExpression()
(或绑定
)时,视图的呈现将崩溃属性的动态计算结果与视图生成期间的值不同(由于某些原因)
更好的方法是将getter/setter委托给本地属性,而不是委托给本地属性。setValueExpression()
最终也会出现在stateheloper
中(注意,它根本不调用setter;如果需要数据,只需调用getter即可),而getAttributes()
也会解析stateheloper
中的值
public String getName() {
return (String) getStateHelper().eval("name");
}
public void setName(String name) {
getStateHelper().put("name", name);
}
请注意,您可以安全地删除
getId()
和setId()
方法,因为它们已经在扩展的UIComponentBase
超类中定义了。谢谢您的回答!我想问一下,我是否必须实现一些特殊的方法来区分组件中不同类型的属性值。(我知道UIComponentBase是自己处理的)如果是的话,有没有一个最佳实践可以做到这一点?!不,你一般也不应该关心它。要获取(已计算的)属性值,只需调用getter。
<x:myTag id="#{dummyBean.id}" name="#{dummyBean.name}" />
public String getName() {
return (String) getStateHelper().eval("name");
}
public void setName(String name) {
getStateHelper().put("name", name);
}