【问题标题】:Dynamic Form generation in JSFJSF 中的动态表单生成
【发布时间】:2012-10-30 11:21:11
【问题描述】:

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

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

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

【问题讨论】:

  • 应用程序的这种运行时更新几乎不可能使用任何框架(尤其是 db 部分)。您应该考虑将数据保存在提供无模式设计的 xml 文件或 nosqldb 中。使用 JSF 可以实现动态 GUI,因为您可以使用 java 代码将组件添加到视图树。
  • 是的,有可能。您可以动态创建组件或使用List<YourClass> lstYourClass 并使用<ui:repeat> 标记组件以通用方式向用户显示lstYourClass 的内容。 IMO,根据您的实际问题,我会提出我的第二个建议。
  • 你可能会从中得到一些启发:stackoverflow.com/search?q=user:157882+[dynamic-forms]

标签: forms jsf dynamic


【解决方案1】:

是的,这在 JSF 2 中是可能的。有多种方法可以做到这一点。

支持以编程方式将组件添加到 JSF 组件树,但有一些注意事项。首先是您不能在请求处理期间随机执行此操作。尽管(尚未)指定确切的点,但实际上PreRenderViewEvent 非常适合这一点。

其次,Mojarra 2.x 的早期版本包含几个错误,这些错误极大地限制了对组件树进行编程更改的数量和种类。 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 Varaksin 为 PrimeFaces Extensions 创建的 DynaForm 组件。见Dynamic forms, JSF world was long waiting for

最后,正如 Luiggi 所提到的,根据您问题的复杂性,可能是一个简单的<ui:repeat>,其组件绑定到例如Map 就是您所需要的(但这取决于您的具体要求)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • Alexander Lavoie,我想要那个代码 :) 你能把 dario.bensic Monky gmail com 发给我吗?
    • 好吧,我的解决方案不是 AJAX,而是标准的 HTML 打印和 servlet 捕获解决方案。可能另一种解决方案对 JSF 更友好。
    • 如果不是AJAX也没问题。如果能发给我,不胜感激!
    猜你喜欢
    • 2013-06-17
    • 1970-01-01
    • 2012-11-15
    • 2010-10-21
    • 2011-06-18
    • 2014-12-20
    • 2010-10-11
    • 2015-12-16
    • 2014-08-23
    相关资源
    最近更新 更多