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

时间:2017-06-17 08:25:27

标签: jsf jsf-2 composite-component

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

// ...
<script>
  var data = <?php echo json_decode($row['images']); ?>
      Object.keys(data).forEach(function(key) {
          var img = new Image();
          img.src = data[key];
          img.setAttribute("class", "banner-img");
          img.setAttribute("alt", "effy");
          img.classList.add('img-responsive');
          document.getElementById("img-container").appendChild(img);
      });
</script>
    <div id="img-container"></div>
    <h5>
        <a target="_blank" href="<?php echo $row['product_url']; ?>">
           <?php echo $row['product_title']; ?>
        </a>
    </h5>
// ...

如何在我的支持组件中访问<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}" />方法的后台bean中尝试了以下内容。

processUpdates

Answer ItemSource = (Answer) getValueExpression("ItemSource").getValue(context.getELContext()); String formid = String.format("sc%d", ItemSource.getAnswerId()); String get = context.getExternalContext().getRequestParameterMap().get(formid); 始终为空。有没有办法获得输入值?

PS:我知道在jsf中使用普通的html并不是它的目的。我只是强调了我的计划是如何实现的。

1 个答案:

答案 0 :(得分:3)

我从未使用带有jsf属性的普通html,因此我不知道它是否适用。

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

<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,因此更喜欢静态(或根本没有)嵌套组件ID。避免使用动态ID,除非您确实需要动态ID,并确切知道您正在做什么。