【问题标题】:Get programmatically cc:interface definition以编程方式获取 cc:interface 定义
【发布时间】:2016-06-18 19:25:21
【问题描述】:

在这个例子中:

<composite:interface>
    <composite:attribute name="value" required="false" />
    <composite:editableValueHolder name="txtText"/>
</composite:interface>

<composite:implementation>
    <h:inputText id="txtText" value="#{cc.attrs.value}" />
</composite:implementation>

我想检索设置为 editableValueHolder 的内容,就像我对属性所做的那样(例如 component.getAttributes().get("value")),但我没有找到这样做的方法

【问题讨论】:

  • component 本身检索这些信息,我想像component.getInterfaces().get('editableValueHolder') 这样的东西。这样做的目的是知道我的复合目标是哪个 EditableValueHolder
  • 不检索什么,检索where,在一个bean,组件类,在组件xhtml中
  • 从组件类中检索
  • 我从来不需要使用这样的结构(还),所以我正在考虑一个用例。 'target's(与 name 隐式相同)是固定的(名称是固定的),因此您已经可以知道目标输入是什么。您能否按照您的要求描述您尝试解决此问题的实际功能用例?

标签: jsf interface composite-component


【解决方案1】:

此信息存储在复合组件 BeanInfo 中,可用作由UIComponent.BEANINFO_KEY 键入的复合组件属性。

public static final String BEANINFO_KEY

此常量的值用作组件属性映射中的键,其值是描述复合组件的java.beans.BeanInfo 实现。这个BeanInfo 被称为复合组件BeanInfo

&lt;cc:editableValueHolder&gt;复合组件 BeanInfoList&lt;AttachedObjectTarget&gt; 属性中创建一个 EditableValueHolderAttachedObjectTarget 实例,该属性可通过键 AttachedObjectTarget.ATTACHED_OBJECT_TARGETS_KEY 获得。

static final String ATTACHED_OBJECT_TARGETS_KEY

复合组件BeanDescriptor值集中的key,其值为List&lt;AttachedObjectTarget&gt;

总而言之,为了得到txtText

<cc:interface componentType="yourComposite">
    ...
    <cc:editableValueHolder name="txtText" />
</cc:interface>
<cc:implementation>
    <f:event type="postAddToView" listener="#{cc.init}" />
    <h:inputText id="txtText" ... />
    ...
</cc:implementation>
@FacesComponent("yourComposite")
public class YourComposite extends UINamingContainer {

    public void init() {
        BeanInfo info = (BeanInfo) getAttributes().get(UIComponent.BEANINFO_KEY);
        List<AttachedObjectTarget> targets = (List<AttachedObjectTarget>) info.getBeanDescriptor().getValue(AttachedObjectTarget.ATTACHED_OBJECT_TARGETS_KEY);

        for (AttachedObjectTarget target : targets) {
            if (target instanceof EditableValueHolderAttachedObjectTarget) {
                String name = target.getName();
                UIInput txtText = (UIInput) findComponent(name);
                // ...
            }
        }

    }

}

话说,这一切都是不必要的笨拙。简单得多,more canonical approach 只是将子组件直接绑定到支持组件。

<cc:interface componentType="yourComposite">
    ...
    <cc:editableValueHolder name="txtText" />
</cc:interface>
<cc:implementation>
    <h:inputText binding="#{cc.txtText}" ... />
    ...
</cc:implementation>
@FacesComponent("yourComposite")
public class YourComposite extends UINamingContainer {

    private UIInput txtText; // +getter+setter

    // ...
}

【讨论】:

  • 'none-clumsy' 的方式是我想的,第一部分我永远不会发现。
  • 再次感谢 BalusC! ;)
【解决方案2】:

你可以通过managedBean得到你想要的。

一个简单的 POJO:

public class MyObject{

private String attribute;
private String editableValueHolder ;

//getter and setter
//...
}

你的 ManagedBean:

@ManagedBean
@ViewScoped
public class myManagedBean{

private MyObject selected;

//getter and setter
//...
}

您的网页:

<ui:composition
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:myLib="http://lib.dz/taglib">

<h:form>

<h:panelGrid columns="2">
    <h:outputText value="Attribute" />
    <h:inputText value="#{myManagedBean.attribute}" />
    <h:outputText value="EditableValueHolder " />
    <h:inputText value="#{myManagedBean.editableValueHolder }" />
</h:panelGrid>

</h:form>
</ui:composition>

【讨论】:

  • :-)... 不幸的是,事情没那么简单。问题中使用的概念是核心 jsf 的东西,而不仅仅是 bean 属性
猜你喜欢
  • 1970-01-01
  • 2011-11-12
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多