【发布时间】:2011-11-28 14:46:30
【问题描述】:
我在 JSF2.0 和 Tomcat 6 中使用 Primefaces 组件。目标是从 bean 动态创建服务器组件。只是为了测试,我做了接下来的事情:
private Panel editorPanel;
private CommandButton btn;
public void createComponents()
{
this.setEditorPanel(new Panel());
this.getEditorPanel().setRendered(true);
btn = new CommandButton();
btn.setId("btn1");
btn.setRendered(true);
btn.setAjax(true);
btn.setValue("Click!");
btn.addActionListener(new ActionListener()
{
@Override
public void processAction(ActionEvent arg0) throws AbortProcessingException
{
addNewButton();
}
});
this.getEditorPanel().getChildren().add(btn);
}
public void addNewButton()
{
CommandButton btn2 = new CommandButton();
btn2.setRendered(true);
this.getEditorPanel().getChildren().add(btn2);
}
标记:
<p:panel binding="#{mybean.editorPanel}">
</p:panel>
在第一页加载按钮被渲染。按下按钮后,由于请求,我的 bean 正在重新创建,但从未触发“addNewButton”方法处的断点。在该请求之后,该按钮消失了。 Bean 被标记为@RequestScoped 和@ManagedBean(name="mybean")。标记中未动态呈现的其他组件可以成功使用 bean 方法。 这个按钮我做错了什么?
谢谢
编辑:我知道我可以以相同的方法添加按钮作为前一个按钮,但目标是动态添加一些组件。
编辑 2:我将 ActionListener 的单独实现作为公共内部类,我得到下一个:
Caused by: java.lang.InstantiationException:web.beans.pages.TemplateEditBean$BtnListener
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at javax.faces.component.StateHolderSaver.restore(StateHolderSaver.java:103)
... 90 more
【问题讨论】:
-
你什么时候打电话给
createComponents()?与具体问题无关,我建议您重新考虑这种方法。<h:dataTable>或可能是<p:dataGrid>或<p:dataList>更容易。 stackoverflow.com/questions/3409053/… -
我在调用 bean 构造函数时调用此方法。使用 datatable 对我不利,因为我想将页面中的不同组件动态添加到我想要的位置。
-
好,回到问题,有
<h:form>父母吗? -
是的,当然,
p:panel在里面 -
服务器日志中有异常吗?我希望在这里看到
IllegalStateException。 EL 不能访问/创建匿名类的实例。另见stackoverflow.com/questions/5432897/…
标签: java jsf jsf-2 primefaces dynamic-forms