使用JSF,Managed Beans,& EL 2.2我一般都知道形式的表达式:
#{bean.value}
将映射到托管bean类中的相应函数集,如下所示:
@ManagedBean
class Bean {
private String value;
public String getValue() { return value; }
public void setValue( String s ) { value = s; }
}
也可以获取和设置地图的属性:
#{bean.value['key']}
支持类似:
@ManagedBean
class Bean {
private Map<String, Boolean> kvMap;
public boolean getValue( String key ) { return kvMap.get( key ); }
public void setValue( String key, boolean value ) { kvMap.put( key, value ); }
}
到目前为止一切顺利。
我发现因为我花了更多时间在JSF上,但我正在尝试编写可重用的代码块。具体来说,我可以通过<ui:composition>
阻止<ui:include>
块中的小块xhtml。更重要的是,对我来说,许多更有用的东西都是嵌套的复选框(我们的UI设计师只是对它们的加法;-),并且<ui:repeat>
变得非常方便。
为了使用<ui:repeat>
和<ui:include>
而不使用不合适的输入量,我一直在使用别名,可以通过<ui:param>
创建,也可以内联var
。 1}} <ui:repeat>
的属性。
由于我一直在编写越来越多嵌套的UIComponents,特别是那些从地图中的地图中获取值的东西,我发现在提交表单时,推导出JSF将寻找的正确的setter方法签名变得越来越难(出于某种原因,写getter似乎更自然)。
我对你的大师的问题是:
有没有办法让JSF告诉我它希望setter签名看起来像什么?由于JSF通常不会抱怨解析为仅限getter的表达式(认为它是只读属性),我发现缺乏反馈令人沮丧,而且在我之前似乎需要大量摆弄不同的方法签名终于击中那个神奇的右一个。
我希望有一些技术,比如FacesContext ...在运行时查询或查看一些编译的中间文件,如类文件,它会指向深度嵌套属性的正确setter签名。如果有这样的事情,我认为这将节省我很多时间试图弄清楚如何通过反复试验来构建一个二传手。
希望我已经清楚地表达了我所追求的内容,并提前感谢您的回复。
答案 0 :(得分:8)
我知道您的问题基本上归结为“Map
的设定器应如何显示?”。
答案很简单:你不需要任何一个。 EL在put()
本身使用Map
方法。您只需要为整个Map
提供一个getter。在获取地图值时,EL将使用Map
本身的get()
方法。这就是内置MapELResolver
所做的幕后工作。
所以这应该做:
@ManagedBean
class Bean {
private Map<String, Boolean> kvMap;
public Map<String, Boolean> getValue() { return kvMap; }
}
如果密钥不包含句点,则用作#{bean.value['key']}
或#{bean.value.key}
。您也可以在输入组件中使用它。
<h:selectBooleanCheckbox value="#{bean.value.key}" />
对于工具,Eclipse的JBoss Tools插件对普通的javabeans具有良好的EL自动完成支持,但它不能自动完成地图键。进一步的Eclipse有自己的工具来自动生成bean属性以及基于列表或现有属性的getter和setter。