【问题标题】:How to set bean property from composite attribute?如何从复合属性设置 bean 属性?
【发布时间】:2014-11-03 21:09:00
【问题描述】:

我正在尝试在使用复合组件时设置支持 bean 属性(支持 bean 是复合 attribute)。

有一个 bean 属性(例如,finalDraft)我想有条件地用属性填充(有条件地,因为不需要该属性)。

支持 bean:

class Bean ... {
   String finalDraft; // getters+setters

   @PostConstruct
   void init() {
       String draftAttr = (...) getAttributes("draft");
       if(draftAttr!=null) {
           finalDraft = draftAttr;
       }
   }
}

复合:

<composite:interface>
    <composite:attribute name="bean" required="true" ... />
    <composite:attribute name="draft" type="java.lang.String" />
</composite:interface>

到目前为止,我尝试使用 bean@PostConstruct 中的 getAttributes("draft"),但它解析为 null(注意:view-scope)。

还有其他方法吗?

【问题讨论】:

    标签: jsf-2 attributes composite-component backing-beans


    【解决方案1】:

    只是不要将 bean 绑定到复合组件。而是直接传递属性:

    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:composite="http://java.sun.com/jsf/composite"
        xmlns:h="http://java.sun.com/jsf/html">
        <h:body>
            <composite:interface>
                <composite:attribute name="showDraft" default="true" />
                <composite:attribute name="draft" />
            </composite:interface>
            <composite:implementation>
                <h:inputText value="#{cc.attrs.draft}" 
                    rendered="#{cc.attrs.showDraft}" />
            </composite:implementation>
        </h:body>
    </html>
    

    然后您就可以在主页中使用它:

    <comp:draftInput value="#{bean.finalDraft}" />
    

    <comp:draftInput showDraft="false" />
    

    恐怕你对这里的 backing bean 感到困惑。一件事是您当前的@ViewScoped bean 中的内容,另一件事是复合组件。组合对当前视图的托管 bean 一无所知,它只接收参数并显示它们。它可能是一个单一的 facelet 视图,也可能在他的背后有一个类,它只知道组合而对范围一无所知。

    【讨论】:

    • 感谢您的回复。在我的用例中,draft 属性不是boolean,而是要在文本组件中使用的String(很像inputText 组件的默认值)。 input 的值绑定到一个 bean 属性(bean.finalText 我决定省略它,因为我只想访问支持 bean 中的 draft 属性)。我的问题是,如果草稿存在,我无法使用草稿文本设置 finalText
    • 我已经通过调用f:event 并明确调用我想要的设置器(以及相应的参数,在我的情况下是draft)来解决它
    • @nuno,仍然不明白为什么在加载时使用复合属性填充 bean 属性。你的 bean 中没有那个属性吗?
    • 我决定在复合组件渲染上设置 bean 属性,因为我做了一些就地验证,并且 bean 实际上是一个超类 - bean 的实现根据命令而有所不同给定的。无论如何,我解决了&lt;f:event type="javax.faces.event.PreRenderComponentEvent" listener="#{cc.attrs.bean.setFinalText(cc.attrs.draft)}" /&gt;
    猜你喜欢
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    相关资源
    最近更新 更多