重复多个ui:包含每个自己的bean并从中收集所有提交的数据

时间:2015-05-28 06:58:48

标签: jsf managed-bean uiinclude

我有一个文件,其中包含多个文件

<ui:include src="file1.xhtml" />
<ui:include src="file2.xhtml" />
<ui:include src="file3.xhtml" />
<ui:include src="file4.xhtml" />

提交文件后,我将获取所有包含文件的Managed bean并调用save方法

FacesContext ctx = FacesContext.getCurrentInstance();
File1ManagedBean fmb =(File1ManagedBean)ctx.getApplication().evaluateExpressionGet(ctx, "#{file1ManagedBean}", File1ManagedBean.class);
fmb.saveApplication();

现在在这个文件中我有另一个名为&#34;添加另一个成员&#34;这将再次重复那些包含文件。那是我无法做到的事情。我尝试过使用ui:repeat,但问题是我正在加载相同的托管bean两次,并且两者都在复制相同的值。那么,我怎样才能实现相同的功能

1 个答案:

答案 0 :(得分:1)

这确实是一种尴尬的做法。我可以理解为什么你在维护和扩展它时会感到困惑和阻塞。只是不要让所有这些模型分开托管bean。只需将所有这些模型作为单个托管bean的属性,即可在单个位置管理它们。

E.g。

@Named
@ViewScoped
public class FileManagedBean implements Serializable {

    private List<FileModel> fileModels;

    @PostConstruct
    public void init() {
        fileModels = new ArrayList<>();
        addFileModels();
    }

    public void addFileModels() {
        fileModels.add(new File1Model());
        fileModels.add(new File2Model());
        fileModels.add(new File3Model());
        fileModels.add(new File4Model());
    }

    public void saveFileModels() {
        for (FileModel fileModel : fileModels) {
            fileModel.saveApplication();
        }
    }

    public List<FileModel> getFileModels() {
        return fileModels;
    }

}
<c:forEach items="#{fileManagedBean.fileModels}" var="fileModel">
    <ui:include src="#{fileModel.includeSrc}" /><!-- inside include file, just use #{fileModel}. -->
</c:forEach>
<h:commandButton value="Add" action="#{fileManagedBean.addFileModels}" />
<h:commandButton value="Save" action="#{fileManagedBean.saveFileModels}" />

请注意<ui:repeat><ui:include>由于此处说明的原因而无法工作:Dynamic <ui:include src> depending on <ui:repeat var> doesn't include anything