Jsf 自定义复合组件可以读取,但可以';无法检索提交的值

Jsf 自定义复合组件可以读取,但可以';无法检索提交的值,jsf,composite-component,Jsf,Composite Component,这就是我在循环中呈现复合组件的方式,它可以工作,但是当我切换到编辑模式并使用sumbmit新值时,我无法从InputText中检索它们 @FacesComponent("customComponent") public class CustomComponent extends UIInput implements NamingContainer, Serializable { private static final long serialVersionUID = 1L;

这就是我在循环中呈现复合组件的方式,它可以工作,但是当我切换到编辑模式并使用sumbmit新值时,我无法从InputText中检索它们

@FacesComponent("customComponent")
public class CustomComponent extends UIInput implements NamingContainer, Serializable {

    private static final long serialVersionUID = 1L;

    @Override
    public String getFamily() {
        return UINamingContainer.COMPONENT_FAMILY;
    }

    private UIComponent component;
    private HtmlInputText inputTextValue;

    @Override
    public void encodeBegin(FacesContext context) throws IOException {

        AttributeObject attrObject = (AttributeObject) getAttributes().get("value");
        Boolean enableInput = (Boolean) getAttributes().get("enableInput");

        if (attrObject.getAttributeValue() != null) {
            if (attrObject.getAttributeDescriptor().getDataType() == DataTypeConstants.TEXT && enableInput) {
                InputText inputText = new InputText();
                inputText.setRequired(true);
                inputText.setValueExpression("binding",
                        createValueExpression("#{searchController.myComponent}", UIComponent.class));
                inputText.setId("editableTextId");
                inputText.encodeAll(context);
                inputText.setParent(this);
                component = inputText;
            } else if (attrObject.getAttributeDescriptor().getDataType() == DataTypeConstants.TEXT
                    && enableInput == false) {
                OutputLabel outputLabel = new OutputLabel();
                outputLabel.setValue(attrObject.getAttributeValue());
                outputLabel.encodeAll(context);
                outputLabel.setId("nonEditatbleId");
                component = outputLabel;
            }
        }

    }

    private ValueExpression createValueExpression(String valueExpression, Class<?> valueType) {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        return facesContext.getApplication().getExpressionFactory()
                .createValueExpression(facesContext.getELContext(), valueExpression, valueType);
    }
@FacesComponent(“自定义组件”)
公共类CustomComponent扩展UIInput实现NamingContainer,可序列化{
私有静态最终长serialVersionUID=1L;
@凌驾
公共字符串getFamily(){
返回UINamingContainer.COMPONENT_族;
}
私有组件;
私有HtmlInputText InputExtValue;
@凌驾
public void encodeBegin(FacesContext上下文)引发IOException{
AttributeObject attrObject=(AttributeObject)getAttributes().get(“值”);
Boolean enableInput=(Boolean)getAttributes().get(“enableInput”);
if(attrObject.getAttributeValue()!=null){
if(attrObject.getAttributeDescriptor().getDataType()==DataTypeConstants.TEXT&&enableInput){
InputText InputText=新的InputText();
inputText.setRequired(真);
inputText.setValueExpression(“绑定”,
createValueExpression(“#{searchController.myComponent}”,UIComponent.class));
inputText.setId(“editableTextId”);
inputText.encodeAll(上下文);
inputText.setParent(本文件);
组件=输入文本;
}else if(attrObject.getAttributeDescriptor().getDataType()==DataTypeConstants.TEXT
&&enableInput==false){
OutputLabel OutputLabel=新的OutputLabel();
outputLabel.setValue(attrObject.getAttributeValue());
outputLabel.encodeAll(上下文);
outputLabel.setId(“noneditableId”);
组件=输出标签;
}
}
}
私有值表达式createValueExpression(字符串值表达式,类值类型){
FacesContext FacesContext=FacesContext.getCurrentInstance();
返回facesContext.getApplication().getExpressionFactory()
.createValueExpression(facesContext.getELContext(),valueExpression,valueType);
}

好的,我想我找到了导致所有这些疯狂性能问题的原因。我在一个getter中做了一些逻辑,因为getter被多次调用,导致了性能问题。

使用XHTML来创建组件,而不是Java。在99%的情况下,问题会像魔术一样自行解决。这里有一些值得阅读的东西:谢谢你,巴卢斯这正是我以前做的..问题是我有性能问题,因为我迭代了很多字段(最多1500个)我对每个组件都使用了rendered属性,但我在某个地方读到,rendered确实没有在页面上显示html,但所有这些组件都在uicomponent树中生成。我相信这里就是这样。当我切换到java代码时,我能够操纵哪些组件应该得到,哪些组件不应该堆积在下面是树。阅读速度更快,我也在尝试写作。谢谢你的回答。我也尝试过c:测试,但没有成功。我有一个链接放在这里,你已经回答了!是的,我知道我正在阅读。谢谢。这个答案是关于你在问题的评论中所说的,对吗?我很抱歉,我应该这样做我回答了different(你完全正确)这个问题是因为我有性能问题。我用一种完全不同的方式解决了这些问题,正如balus所说,我使用了“rendered属性”。我刚刚发现问题在我的逻辑深处,而不是jsf组件中。