如何在getter方法中获取调用组件的ID?

时间:2010-12-17 11:22:53

标签: java jsf jsf-2 el

给出以下示例:

<h:inputText id="foo" size="#{configBean.size}" />

我想在getter方法中获取调用组件id的{​​{1}},以便我可以通过foo键从属性文件返回大小。

foo.length

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:3)

从JSF 2.0开始,组件范围中有一个新的隐式EL变量:#{component},它引用当前的UIComponent实例。在其getter方法中,你需要getId()

所以你可以这样做:

<h:inputText id="foo" size="#{configBean.getSize(component.id)}" />

public int getSize(String componentId) {
    return variableConfig.getSizeFor(componentId);
}

另外,您也可以将variableConfig设为@ApplicationScoped @ManagedBean,以便您可以这样做:

<h:inputText id="foo" size="#{variableConfig.getSizeFor(component.id)}" />

(无论何时想要将参数传递给方法,都需要使用EL中的完整方法名而不是属性名,因此只有variableConfig.sizeFor(component.id)不起作用,或者您必须重命名实际{ {1}}类中getSizeFor()的方法

答案 1 :(得分:1)

我认为BalusC给出的答案是最好的答案。它显示了为什么JSF 2.0比1.x有如此大的改进的许多小原因之一。

如果你使用1.x,你可以尝试一个EL函数,它将组件的ID放在请求范围内,以你的支持bean方法可以获取的名称。

E.g。

<h:inputText id="foo" size="#{my:getWithID(configBean.size, 'foo')}" />

EL方法的实现可能如下所示:

public static Object getWithID(String valueTarget, id) {
    FacesContext context = FacesContext.getCurrentInstance();
    ELContext elContext = context.getELContext();

    context.getExternalContext().getRequestMap().put("callerID", id);

    ValueExpression valueExpression = context.getApplication()
        .getExpressionFactory()
        .createValueExpression(elContext, "#{"+valueTarget+"}", Object.class);

    return valueExpression.getValue(elContext);
 }

在这种情况下,只要调用config bean的getSize()方法,调用组件的ID就可以通过请求范围中的“callerID”获得。为了使它更整洁,你应该添加一个finally块,以便在调用完成后从范围中删除变量。 (请注意,我没有尝试上面的代码,但希望能够证明这个想法)

再次,当你使用JSF 1.x时,这将是最后的手段。最干净的解决方案是使用JSF 2.0和BalusC描述的方法。