JSF中的动态表单生成

lea*_*ner 3 forms jsf dynamic

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

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

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

Arj*_*jms 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用Oleg Varaksin为PrimeFaces Extensions创建的DynaForm组件.看动态表单,JSF世界早就等了.

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