我必须在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;
}
}
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用Oleg Varaksin为PrimeFaces Extensions创建的DynaForm组件.看动态表单,JSF世界早就等了.
最后,正如Luiggi所提到的,根据问题的复杂性,也许只需要一个简单<ui:repeat>的组件绑定到例如a Map就可以了(但这取决于你的确切要求).