我必须在JSF中创建一个应用程序。它有两个表单用于两个体育赛事的数据输入,但要求用户应该能够添加其他事件,即第三、第四等,并具有自己的数据输入属性。
应自动生成这些新事件的相应数据输入表单(以及be DB中的所有必需表),以及用于在表单上保存/编辑功能的业务逻辑。
这在JSF中是可能的吗?如果是,我该怎么做?
发布于 2012-11-11 00:43:12
是的,这在JSF2中是可能的。有多种方法可以做到这一点。
支持以编程方式将组件添加到JSF组件树,但有几点需要注意。首先,您不能在请求处理过程中的任意时间执行此操作。尽管(尚未)指定确切的点,但在实践中,PreRenderViewEvent可以很好地实现这一点。
其次,mojarra2.x的早期版本包含几个bug,这些bug极大地限制了对组件树的编程更改的数量和种类。MyFaces和更高版本的Mojarra都可以。如果您正在使用Mojarra,那么在撰写本文时使用最新发布的版本可能是安全的。
第三个警告是,一些组件不允许动态添加( RichFaces DataTable曾经是这样的组件,也许现在仍然是)。
一个基本的例子:
@ManagedBean
public class DynamicBacking implements SystemEventListener {
@PostConstruct
public void init() {
Faces.getViewRoot().subscribeToViewEvent(PreRenderViewEvent.class, this));
}
@Override
public void processEvent(SystemEvent event) throws AbortProcessingException {
HtmlOutputText text = new HtmlOutputText();
text.setValue("test");
Faces.getViewRoot().getChildren().add(text);
}
@Override
public boolean isListenerForSource(Object source) {
return source instanceof UIViewRoot;
}
}另一种选择是使用Oleg为PrimeFaces扩展创建的DynaForm组件。参见Dynamic forms, JSF world was long waiting for。
最后,正如Luiggi提到的,根据你的问题的复杂性,也许你只需要一个绑定了组件的简单<ui:repeat>,比如一个Map (但这取决于你的确切需求)。
发布于 2012-11-11 01:42:31
我已经在我的JSF CMS中完成了这类表单,我已经创建了一个链接到数据库的自定义JSF组件,这样表单和字段就可以在组件中创建和使用。基本上,我呈现一个普通的HTML表单并拦截POST内容。我可以发送一些源代码,如果你感兴趣。
https://stackoverflow.com/questions/13319934
复制相似问题