2012-11-10 67 views
3

我必须在JSF中创建应用程序。它在两个体育赛事中有两种数据输入形式,但是要求用户应该能够添加其他事件,即第三,第四等,以及它们自己的数据输入属性。JSF中的动态表单生成

应该自动生成这些新事件的相应数据输入表单(包含BE DB中的所有必需表)以及表单上的保存/编辑功能的业务逻辑。

这在JSF中可能吗?如果是的话,我该怎么办?

+0

该应用程序的运行时更新几乎不可能与任何框架(尤其是数据库部分)。您应该考虑将数据保存在提供无模式设计的xml文件或nosqldb中。由于您可以使用Java代码将组件添加到视图树,所以动态GUI可以使用JSF。 –

+0

是的,这是可能的。您可以动态创建组件或使用'List lstYourClass'并使用''标记组件以通用方式向用户显示“lstYourClass”的内容。国际海事组织和基于你的实际问题,我会与我的第二个提案。 –

+1

你可能会从中得到一些启发:http://stackoverflow.com/search?q=user:157882+[dynamic-forms] – BalusC

回答

6

是的,这在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是你所需要的(但这取决于你的确切要求)。

1

我已经在我的JSF CMS中完成了这种表单,我创建了一个链接到数据库的自定义JSF组件,所以表单和字段都是在组件之后创建和使用的。基本上我呈现一个正常的HTML表单并拦截POST内容。如果您有兴趣,我可以发送一些源代码。

+0

Alexander Lavoie,我想那个代码:)你可以寄给我dario.bensic monky gmail com? – DarioBB

+0

那么我的解决方案不是AJAX,更多的是一个标准的HTML打印和servlet捕获解决方案。其他解决方案可能更适合JSF。 –

+0

没有问题,如果它不是AJAX。如果你能发送它,我将非常感激! – DarioBB