8

对于 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>具体来说,我可以通过包含的块中的小块 xhtml <ui:include>。更重要的是,对我来说,许多更有用的东西是嵌套的复选框集(我们的 UI 设计师对它们很感兴趣 ;-),它们<ui:repeat>变得非常方便。

总是,为了使用<ui:repeat>并且<ui:include>没有大量的打字,我一直在使用别名,无论是通过创建<ui:param>还是内联类似的var属性<ui:repeat>

随着我一直在编写越来越多的嵌套 UIComponent,尤其是从地图中的地图获取其值的东西,我发现越来越难以推断出 JSF 在提交表单时将寻找的正确 setter 方法签名(对于某些原因写 getter 似乎更自然)。

那么我对各位大师的问题是:

有什么方法可以让 JSF 告诉我它期望 setter 签名的样子吗?由于 JSF 通常不会抱怨解析为 getter-only 的表达式(认为它是只读属性),因此我发现缺乏反馈令人沮丧,而且在我之前似乎需要大量摆弄不同的方法签名终于击中了那个魔法

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

希望我已经清楚地表达了我所追求的,在此先感谢您的回复。

4

1 回答 1

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; }
}

这将用作#{bean.value['key']}#{bean.value.key}如果密钥不包含句点。您也可以在输入组件中使用它。

<h:selectBooleanCheckbox value="#{bean.value.key}" />

至于工具,Eclipse 的 JBoss Tools 插件对普通 javabean 有很好的 EL 自动完成支持,但它不能自动完成映射键。此外,Eclipse 有自己的工具来自动生成 bean 属性以及基于列表或现有属性的 getter 和 setter。

于 2012-05-15T13:07:17.143 回答