从 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,除非您确实需要它们并且您确切地知道自己在做什么。
我的复合组件包含以下形式:
<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,除非您确实需要它们并且您确切地知道自己在做什么。