0

我有一个包含多个文件的文件

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

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

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

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

4

1 回答 1

1

这确实是一种尴尬的做法。我可以理解为什么您在维护和扩展它时会感到困惑和阻塞。只是不要让所有这些模型分离托管 bean。只需使所有这些模型成为单个托管 bean 的属性,该 bean 在一个地方管理它们。

例如

@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>取决于 <ui:repeat var> 不包括任何东西

于 2015-05-28T09:19:22.030 回答