jsf2-jsf动态组件,用于恢复状态



我正在尝试在JSF页面中动态显示HtmlInputText。然而,我得到了

javax.faces.FacesException: Cannot add the same component twice: j_idt10:hitDyn

在对页面的第一次请求期间,输入文本呈现良好。在页面回发期间,当我在输入组件中输入一些文本并按enter键时,就会发生这种异常。在.xhtml页面中,我有以下代码:

<h:form>
    <h:outputLabel value="Welcome!"></h:outputLabel>
    <f:metadata>
        <f:event type="preRenderView" listener="#{dynamicBacking.addDynComp}" />
    </f:metadata>
    <h:panelGroup id="dynOuter"></h:panelGroup>
</h:form>

在backingbean中,我有以下代码:

@ManagedBean(name="dynamicBacking")
public class DynamicBacking {
    public void addDynComp() {
        Application app = FacesContext.getCurrentInstance().getApplication();
        HtmlInputText hit = (HtmlInputText)app.createComponent(HtmlInputText.COMPONENT_TYPE);
        hit.setId("hitDyn");
        UIComponent parent = findComponent("dynOuter");
        if( parent != null ) {
            parent.getChildren().add(hit);
        }
    }
    public UIComponent findComponent(final String id) {
        FacesContext context = FacesContext.getCurrentInstance(); 
        UIViewRoot root = context.getViewRoot();
        final UIComponent[] found = new UIComponent[1];
        root.visitTree(new FullVisitContext(context), new VisitCallback() {     
            @Override
            public VisitResult visit(VisitContext context, UIComponent component) {
                if(component.getId().equals(id)){
                    found[0] = component;
                    return VisitResult.COMPLETE;
                }
                return VisitResult.ACCEPT;              
            }
        });
        return found[0];
    }
}

我想在回发中恢复动态组件的状态可能有一些问题。我在JSF页面的生命周期中添加动态组件是否太晚了?我知道在ASP.NET中,我可以在Page.Load阶段添加一个动态控件。但到目前为止,我还不知道如何在JSF中实现同样的功能。求你了,救命!

出现异常是因为组件是在初始页面加载时添加到树中的。执行回发时,侦听器会再次被调用,它会尝试添加另一个具有相同id的组件,这会导致异常。该问题的解决方案是在添加组件时检查请求是否不是回发。以下代码显示如何检查回发:

if (FacesContext.getCurrentInstance().isPostback()) {....

相关内容

  • 没有找到相关文章

最新更新