【发布时间】:2016-03-29 08:37:09
【问题描述】:
接着传说中的 BalusC 对这篇文章的回复:
How to programmatically or dynamically create a composite component in JSF 2
如果我有足够的积分,我会在该帖子上附加评论 - 但我没有足够的积分。
问题如下。
我正在尝试设置一个命令按钮,它将一个 JSF 复合组件动态添加到一个 xhtml 文件中。意图是多次单击它会在页面上放置组件的多个实例。
所以我在 XHTML 文件上有一个按钮:
<h:commandButton action="#{assessingController.addQuestion}" value="Add a Question"></h:commandButton>
调用 AssessingController 上的方法:
public void addQuestion() {
UIComponent parent = null;
includeCompositeComponent(parent, "http://xmlns.jcp.org/jsf/composite/components", "questionComposite", "someId");
}
UIComponent parent = null; - 因为它必须以某种方式实例化或引用,然后才能传递到 includeCompositeComponent 。但如下所述 - 使其为 null 可能会导致空指针异常,(那么我应该怎么做呢?)
includeCompositeComponent方法是按照上篇博文中BalusC提到的JSF 2.2方法:
public void includeCompositeComponent(UIComponent parent, String taglibURI, String tagName, String id) {
FacesContext context = FacesContext.getCurrentInstance();
UIComponent composite = context.getApplication().getViewHandler()
.getViewDeclarationLanguage(context, context.getViewRoot().getViewId())
.createComponent(context, taglibURI, tagName, null);
composite.setId(id);
parent.getChildren().add(composite);
}
当我点击命令按钮时,记录如下:
javax.faces.el.EvaluationException: java.lang.NullPointerException
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at javax.faces.component.UICommand.broadcast(UICommand.java:315) ...
Caused by: java.lang.NullPointerException
at controllers.AssessingController.includeCompositeComponent(AssessingController.java:123)
AssessingController.java:123 是这一行:
parent.getChildren().add(composite);
Composite 不为空(已检查)。 所以,很明显,也许 - parent 为空,这就是问题所在。
那么我怎样才能更好地参考UIComponent parent 呢?
我是否需要让它引用 xhtml 文件中的某些内容?我假设它需要某种占位符来充当父级(?)。现在 xhtml 页面上的所有内容都是 commandButton。
谢谢大家。
【问题讨论】:
标签: jsf jsf-2.2 composite-component