3

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

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

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

4

2 回答 2

6

是的,这在 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 组件。请参阅动态表单,JSF 世界期待已久

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

于 2012-11-10T16:43:12.097 回答
1

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

于 2012-11-10T17:42:30.970 回答