我必须在JSF中创建应用程序。它在两个体育赛事中有两种数据输入形式,但是要求用户应该能够添加其他事件,即第三,第四等,以及它们自己的数据输入属性。JSF中的动态表单生成
应该自动生成这些新事件的相应数据输入表单(包含BE DB中的所有必需表)以及表单上的保存/编辑功能的业务逻辑。
这在JSF中可能吗?如果是的话,我该怎么办?
我必须在JSF中创建应用程序。它在两个体育赛事中有两种数据输入形式,但是要求用户应该能够添加其他事件,即第三,第四等,以及它们自己的数据输入属性。JSF中的动态表单生成
应该自动生成这些新事件的相应数据输入表单(包含BE DB中的所有必需表)以及表单上的保存/编辑功能的业务逻辑。
这在JSF中可能吗?如果是的话,我该怎么办?
是的,这在JSF 2中是可行的。有多种方法可以做到这一点。
支持以编程方式向JSF组件树添加组件,但有几点需要注意。首先是在请求处理过程中,您无法随机执行此操作。虽然确切点尚未指定,但实际上PreRenderViewEvent
完美适用于此。其次,早期版本的Mojarra 2.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;
}
}
另一种选择是使用奥列格Varaksin为PrimeFaces扩展创建的DYNAFORM组件。见Dynamic forms, JSF world was long waiting for。
最后,正如Luiggi所说,根据问题的复杂程度,可能有一个简单的<ui:repeat>
,其组件绑定到例如一个Map
是你所需要的(但这取决于你的确切要求)。
该应用程序的运行时更新几乎不可能与任何框架(尤其是数据库部分)。您应该考虑将数据保存在提供无模式设计的xml文件或nosqldb中。由于您可以使用Java代码将组件添加到视图树,所以动态GUI可以使用JSF。 –
是的,这是可能的。您可以动态创建组件或使用'List lstYourClass'并使用''标记组件以通用方式向用户显示“lstYourClass”的内容。国际海事组织和基于你的实际问题,我会与我的第二个提案。 –
你可能会从中得到一些启发:http://stackoverflow.com/search?q=user:157882+[dynamic-forms] – BalusC