如何在getter方法中找出调用组件?

时间:2012-02-03 09:05:25

标签: java jsf

在我的页面中,我有2个(以及更多的)图像容器。我想绑定他们的url属性,以便每个容器根据其id具有不同的源。 我的JSP中有类似的东西:

<webuijsf:image id="image2" binding="#{Page1.img_2}" url="#{Page1.imgSRC}" />

在支持bean代码中,我有一个imgSRC getter,但是我希望能够在getter中知道它被调用的组件,并根据组件的ID我将使用某种{ {1}}决定返回组件的URL。

这有可能吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:7)

当您使用4年前放弃的Woodstock组件库时,我敢打赌您正在维护一个从未升级过的旧版JSF 1.x应用程序来替换死亡的Woodstock组件库。在JSF 1.x中没有API提供的方法,它允许您获取getter中的当前组件。

在JSF 2.x中,您可以使用UIComponent#getCurrentComponent()

public String getImgSRC() {
    UIComponent component = UIComponent.getCurrentComponent(FacesContext.getCurrentInstance());
    // ...
}

但在JSF 1.x中,此方法不可用。我建议采用不同的方法。如果唯一的目的是消除属性/ getter样板代码,那么您可以使用Map来保存值。地图可以像EL中的Javabeans一样对待。

这样的事情:

private static Map<String, String> imageURLs = new HashMap<String, String>();

static {
    imageURLs.put("img1", "foo.png");
    imageURLs.put("img2", "bar.png");
    imageURLs.put("img3", "baz.png");
    // ...
}

public Map<String, String> getImageURLs() {
    return imageURLs;
}

可以用作:

<webuijsf:image url="#{Page1.imageURLs.img1}" />
<webuijsf:image url="#{Page1.imageURLs.img2}" />
<webuijsf:image url="#{Page1.imageURLs.img3}" />
...