JSF 2 - ui:repeat中的自定义输入文本组件问题

时间:2014-11-21 11:00:28

标签: jsf-2

我需要你的帮助......,请...

我正处于从 JSF 1.2 JSF 2.1的迁移过程中。

我使用的实现是使用facelets的 Sun的Mojarra 实现, JSF 1.2 中的实现不是标准的一部分,但是,因为 JSF 2.0 他们成为。

现在我正在使用 javax.faces.PARTIAL_STATE_SAVING 作为 true 。 (试错,但我的自定义组件都没有。)

我们有一些自定义的JSF组件,在大多数情况下它们工作正常。但是,以下示例无法正常工作:

<ui:repeat value="#{myBean.list}" var="item">            
       <tr style="cursor:pointer;">   
             <td class="texttable col_med col15Personal">   
                    <bf:TextBox   
                           compId="aliasName"  
                           value="#{item.aliasName}"  
                           compStyle="font-size:1em;"    
                           maxLength="15" showAutoLabel="false"/>   
             </td>   
       </tr>   
</ui:repeat>  

bf:TextBox 是一个自定义文本框,它扩展了 HtmlPanelGroup ,并有2个自定义子组件:

自定义标签(扩展 HtmlOutputlabel )和自定义输入(扩展 HtmlInputText

如果在没有 ui:repeat 的情况下使用此组件,一切正常。但是当它内部出现问题时。

在第一个renderreponse阶段,一切都很好。但是当您执行帖子时,在restoreview阶段,自定义 HtmlPanelGroup (label和inputText)的子项不存在于viewRoot中,因此提交的值不存在。

相同的代码剪辑正确地在 JSF 1.2 中工作。

我知道 ui:重复(示例 c:forEach )还有其他选择,但由于我正在进行迁移过程,因此更改所有内容非常复杂涉及此类型的代码。

提前谢谢大家,

1 个答案:

答案 0 :(得分:1)

我找到了解决问题的方法。由于主要目标是对应用程序进行最小的更改...我避免更改使用ui:repeat的所有页面。相反,我已经更改了我的自定义组件以将子项保存到状态持有者(saveState方法),然后我恢复子组件,如果组件有一个ui:repeat作为父级。

if (getInsideUIRepeat() != null && getInsideUIRepeat().booleanValue()) {  
            values[42] = this.getChildren();  
        }  

这是从saveState方法中提取的。

 if (getInsideUIRepeat() != null && getInsideUIRepeat().booleanValue()) {  
           List<UIComponent> children = (List<UIComponent>) values[42];  
            if (children != null) {  
                this.getChildren().clear();  
                this.getChildren().addAll(children);  
            }  
        }  

这是从restoreState方法中提取的。

private boolean hasUIRepeatAsParent() {  
    UIComponent parent = this.getParent();  
    while (parent != null) {  
        if (parent instanceof UIRepeat) {  
            return true;  
        }  
        parent = parent.getParent();  
    }  
    return false;  
}  

这是检查组件是否具有UIRepeat作为父

的方法

再次感谢大家......