JSF,EL,Managed Beans - 如何判断getter和setter签名是什么?

par*_*par 7 jsf el javabeans

使用JSF,Managed Beans和EL 2.2,我通常知道表单的形式:

#{bean.value}
Run Code Online (Sandbox Code Playgroud)

将映射到托管bean类中的相应函数集,如下所示:

@ManagedBean
class Bean {
    private String value;
    public String getValue() { return value; }
    public void setValue( String s ) { value = s; }
}
Run Code Online (Sandbox Code Playgroud)

也可以获取和设置地图的属性:

#{bean.value['key']}
Run Code Online (Sandbox Code Playgroud)

由以下内容支持:

@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 ); }
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

我发现我花了更多时间在JSF上,但是我正在尝试编写可重用的代码块.具体来说,<ui:composition>我可以包含块中的小块xhtml <ui:include>.更重要的是,对我来说,许多更有用的东西都是嵌套的复选框(我们的UI设计师只是对它们的加法;-),并且<ui:repeat>变得非常方便.

总是,为了使用<ui:repeat><ui:include>不使用不合适的打字量,我一直在使用别名,通过<ui:param>或通过类似var属性的内联创建<ui:repeat>.

因为我一直在编写越来越多的嵌套UIComponents,特别是那些从地图中的地图中获取值的东西,我发现在提交表单时,推导出JSF会寻找的正确的setter方法签名变得越来越难(对于某些人来说)写getter的原因似乎更自然).

我对你的问题大师的问题是:

有没有办法让JSF告诉我它希望setter签名看起来像什么?由于JSF通常不会抱怨只能解决getter的表达式(认为它是一个只读属性),我发现缺乏反馈令人沮丧,而且在我之前似乎需要大量摆弄不同的方法签名终于打到那个神奇的.

我希望有一些技术,比如FacesContext ...在运行时查询或查看一些编译的中间文件,如类文件,它会指向深度嵌套属性的正确setter签名.如果有这样的事情,我认为这将节省我很多时间试图弄清楚如何通过反复试验构建一个二传手.

希望我已经清楚地表达了我所追求的内容,并提前感谢您的回复.

Bal*_*usC 8

我知道你的问题基本上归结为"一个Map看起来像一个看台的人怎么样?" .

答案很简单:你不需要任何一个.EL put()Map自身上使用该方法.你只需要为整体提供一个吸气剂Map.在获取地图值时,EL将使用自身的get()方法Map.这都是内置的幕后故事MapELResolver.

所以这应该做:

@ManagedBean
class Bean {
    private Map<String, Boolean> kvMap;
    public Map<String, Boolean> getValue() { return kvMap; }
}
Run Code Online (Sandbox Code Playgroud)

这是将被用作#{bean.value['key']}或者#{bean.value.key}如果键不包含周期.您也可以在输入组件中使用它.

<h:selectBooleanCheckbox value="#{bean.value.key}" />
Run Code Online (Sandbox Code Playgroud)

至于工具,Eclipse的JBoss Tools插件对普通的javabeans有很好的EL自动完成支持,但它不能自动完成地图键.进一步的Eclipse有自己的工具来自动生成bean属性以及基于列表或现有属性的getter和setter.