JSF 2.0: как я могу динамически генерировать компонент ввода - PullRequest
0 голосов
/ 16 октября 2011

В моем приложении есть следующий класс констант

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 для решения вышеуказанной задачи. Если эти поля ввода не генерируются динамически, я легко могу определить следующие свойства в моем компоненте поддержки:

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

Однако, поскольку эти поля теперь генерируются динамически, я не могу знать, сколько свойств мне нужно было бы определить заранее, чтобы захватить эти загруженные файлы.

Буду очень признателен, если кто-нибудь даст мне совет, как мне решить эту проблему?

С уважением,

Джеймс Тран

1 Ответ

2 голосов
/ 16 октября 2011

Поместите эти свойства в другой класс javabean и получите коллекцию этих javabean в вашем управляемом бине.

* 1003 Е.Г. *

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>, но это не очень подходит, если вы хотите две повторяющиеся строки вместо одной).

<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>

Я понятия не имею, какую библиотеку компонентов вы используете для загрузки файлов, поэтому я предположил, что это просто томагавк.

...