从 Composite Component 获取 Backing Component 中的表单数据

Get form data in Backing Component from Composite Component

我的复合组件包含以下形式:

<cc:interface componentType="answerCompositeComponent">
    <cc:attribute name="AnswerType" type="code.elephant.domainmodel.AnswerType" required="true" />
    <cc:attribute name="ItemSource" type="code.elephant.domainmodel.Answer" required="true" />
    <cc:attribute name="QuestionId" type="java.lang.Long" required="true" />
</cc:interface>
<cc:implementation>
    <input jsf:id="sc#{cc.attrs.ItemSource.answerId}" />
</cc:implementation>

如何在我的支持组件中访问 <input jsf:id="sc#{cc.attrs.ItemSource.answerId}" /> 的值?我在覆盖 processUpdates 方法的支持 bean 中尝试了以下内容。

Answer ItemSource = (Answer) getValueExpression("ItemSource").getValue(context.getELContext());
String formid = String.format("sc%d", ItemSource.getAnswerId());
String get = context.getExternalContext().getRequestParameterMap().get(formid);

String get 始终为空。有没有办法获取输入的值?

PS:我知道在jsf中使用plain html并不是它的目的。我只是想知道我的计划是如何实现的。

我从来没有用过 plain html 和 jsf 属性,所以我不知道它是否适用。

通常,这是访问组合中嵌套组件的常用方法:

<cc:interface componentType="answerCompositeComponent">
    <cc:attribute name="AnswerType" type="code.elephant.domainmodel.AnswerType" required="true" />
    <cc:attribute name="ItemSource" type="code.elephant.domainmodel.Answer" required="true" />
    <cc:attribute name="QuestionId" type="java.lang.Long" required="true" />
</cc:interface>
<cc:implementation>
    <h:inputText id="questionInput" binding="#{cc.input}" />

    <!-- maybe something like this might work
        <input jsf:id="questionInput" jsf:binding="#{cc.input}" />
    -->
</cc:implementation>

哪里

@FacesComponent("answerCompositeComponent")
public class AnswerCompositeComponent extends UINamingContainer
{
    private UIInput input;

    @Override
    public void processUpdates(FacesContext context)
    {
        super.processUpdates(context);

        Object value = input.getValue();
        Object localValue = input.getLocalValue();
        Object submittedValue = input.getSubmittedValue();

        // do your things with values 
    }

    public UIInput getInput()
    {
        return input;
    }

    public void setInput(UIInput input)
    {
        this.input = input;
    }
}

请注意,复合支持组件是 NamingContainer,因此更喜欢静态(或完全 none)嵌套组件 ID。避免使用动态 ID,除非您确实需要它们并且您确切地知道自己在做什么。