0

複数のファイルが含まれる1つのファイルがあります

<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 を 2 回ロードしていて、両方が同じ値をコピーしていることです。では、どうすれば同じ機能を実現できますか

4

1 に答える 1

1

これは確かに厄介なアプローチです。それを維持し、拡張している間、なぜあなたが混乱してブロックされたのか理解できます. これらすべてのモデルを別々のマネージド 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>ここで説明されている理由で機能しないことに注意してください: <ui:repeat var> に依存する動的 <ui:include src> には何も含まれていません

于 2015-05-28T09:19:22.030 に答える