我试图在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>
在支持bean中,我有以下代码:
@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中实现相同目标。请帮助!
答案 0 :(得分:0)
出现异常是因为组件在初始页面加载时添加到树中。执行回发时,会再次调用侦听器,并尝试添加具有相同ID的另一个组件,这会导致异常。该问题的解决方案是在添加组件时检查请求是否不是回发。以下代码显示了如何检查回发:
if (FacesContext.getCurrentInstance().isPostback()) {....