如何在JSF页面中设置bean属性值?

4

我有一个Facelet组件,也有它的后备bean。当我将我的组件包含到某个页面中时,我会将页面上的bean传递给我的组件:

<ui:include src="./WEB-INF/templates/myTemplate.xhtml">
                    <ui:param name="pageBean" value="#{thisPageBean}" />
</ui:include>

我的组件也有后备Bean,我尝试将调用页面Bean的值传递给它:

<c:set target="#{componentBean}" property="field" value="#{pageBean.field}" />

但是这种方法行不通吗?有没有办法将一个bean的值传递给另一个bean?

我正在尝试创建一个复杂的自定义组件,它必须对传递给它的内容进行一些验证和其他操作。也许我走错了路?

4个回答

3

您可以将bean作为组件的属性传递(当您说“组件”时,我假设您正在使用 ui:component )。

对于一个组件:

<ui:component binding="#{componentBean.myComponent}">
  <f:attribute name="foo" value="#{pageBean.field}" />
  <h:outputText value="#{componentBean.something}" />
</ui:component>

您可以使用以下代码创建一个具有这些方法的后备Bean:
private Object field;
private UIComponent component;

public void setMyComponent(UIComponent c) { component = c; }
public UIComponent getMyComponent() { return component; }

private void lookupFields() {
  field = component.getAttributes().get("foo");
}

public String getSomething() {
  if (field == null) {
    lookupFields();
  }
  return "" + field;
}

这种方法不是很优雅,但我对Facelets includes的机制并不是很熟悉,这是我想到的第一件事。请注意,当视图被保存时,属性可能会被保留 - 对于在属性映射上设置的内容,我无法记住。


谢谢,这对我有帮助,但我找到了其他实现我想要的功能的方法。 - user124722

2
通常你会给一些输入控件赋值,例如:
<h:inputText value='#{pageBean.field}'/>

这意味着需要获取和设置someField属性的值。 请提供详细信息,说明在您的情况下应该确定#{pageBean.field}的值。


一个伟大的简单直接回答问题的答案! - Olle89

0

这是我其中一个facelets文件中的一些代码。正如您所看到的,bean的值作为参数传递:

<ui:param name="bean" value="#{thisPageBean}" />

而且可以使用[dto]符号访问bean、dto的属性。

<h:panelGroup>
    <h:selectOneMenu id="titleMenu" value="#{bean[dto].title}">
        <f:selectItems value="#{suburbsMBean.titles}" />
    </h:selectOneMenu>
    <h:message for="titleMenu" styleClass="error" />
</h:panelGroup>

0

在JSF 2.0中,您可以使用参数调用bean方法。因此,您可以尝试将setter方法放置在注释中,如下所示:

<!-- #{componentBean.setField(pageBean.field)} -->

因此,当页面加载时,setter方法将被触发。


为什么?这个问题有更好的解决方案。 - Kukeltje

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接