0

私のアプリケーションでは、次の定数クラスがあります

public class Constants {
    ...
    public static final int MAX_NUM_OF_PICTURES = 2
    ...
}

以前、JSPを使用していたとき、次のように、この定数に基づいてファイルをアップロードするための入力フィールドを動的にレンダリングすることができました。

<%
    for (int i = 1; i < Constants.MAX_NUM_OF_PICTURES + 1; i++) {
%>
<tr>
    <td>Upload Picture <%= i %></td>
    <td><input name="<%= i%>" type="file" /></td>
</tr>
<tr>
    <td>Description <%= i %></td>
    <td><input type="text" name="<%= "description" + i%>" id="description" /></td>
</tr>
<%
    }
%>

現在、JSFを使用して上記のタスクを実行しようとしています。これらの入力フィールドが動的に生成されない場合は、バッキングBeanで次のプロパティを簡単に定義できます。

@ManagedBean
@RequestScoped
public class MrBean {
   ...
   private UploadedFile picture1;
   private String       pictDescription1;
   ...
}

ただし、これらのフィールドは動的に生成されるようになったため、これらのアップロードされたファイルをキャプチャするために事前に定義する必要があるプロパティの数を知ることはできません。

この問題にどのように取り組むべきかについて誰かが私にアドバイスをくれたらとてもありがたいです。

よろしくお願いします、

ジェームス・トラン

4

1 に答える 1

2

これらのプロパティを別のjavabeanクラスに配置し、管理対象Beanにそれらのjavabeanのコレクションを含めます。

例えば

public class Picture {

    private UploadedFile file;
    private String description;

    // ...
}

@ManagedBean
@ViewScoped
public class Profile {

    List<Picture> pictures;

    public Profile() {
        pictures = new ArrayList<Picture>();

        for (int i = 0; i < Constants.MAX_NUM_OF_PICTURES; i++) {
            pictures.add(new Picture());
        }
    }

    // ...
}

次に、たとえばループすることができます<ui:repeat>(または、多分<h:dataTable>ですが、1つではなく2つの繰り返し行が必要な場合、これは実際には適していません)。

<table>
    <ui:repeat value="#{profile.pictures}" var="picture" varStatus="loop">
        <tr>
            <td>Upload Picture #{loop.index + 1}</td>
            <td><t:inputFileUpload value="#{picture.file}" /></td>
        </tr>
        <tr>
            <td>Description #{loop.index + 1}</td>
            <td><h:inputText value="#{picture.description}" /></td>
        </tr>
    </ui:repeat>
</table>

ファイルのアップロードに使用しているコンポーネントライブラリがわからないため、トマホークだけだと思いました。

于 2011-10-16T13:02:27.897 に答える