我必须在 JSF 中创建一个应用程序。它有两种形式用于两个体育赛事的数据输入,但要求是用户应该能够添加其他事件,即第三、第四等,具有自己的数据输入属性。
应该自动生成这些新事件的相应数据输入表单(在 BE DB 中包含所有必需的表),以及表单上保存/编辑功能的业务逻辑。
这在 JSF 中可能吗?如果是,我该怎么做?
是的,这在 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
(但这取决于您的确切要求)。
我已经在我的 JSF CMS 中完成了这种表单,我创建了一个链接到数据库的自定义 JSF 组件,以便在组件之后创建和使用表单和字段。基本上我呈现一个普通的 HTML 表单并拦截 POST 内容。如果您有兴趣,我可以发送一些源代码。