给出以下示例:
<h:inputText id="foo" size="#{configBean.size}" />
我想在getter方法中获取调用组件id
的{{1}},以便我可以通过foo
键从属性文件返回大小。
foo.length
我怎样才能做到这一点?
答案 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描述的方法。