Как добавить <h: inputtext> динамически в JSF?

В моем приложении я хочу добавить динамически для ex: мое приложение просит ввести город и предоставляет один, но пользователь хочет добавить больше городов, мне нужно предоставить его более динамично, так как это сделать в JSF?

Ответ 1

Использовать таблицу (h:dataTable).

Общая идея: у вас есть список строк (каждый из них представляет название города). В начале списка всего 1 элемент - 1 пустая строка.

Если вы хотите добавить еще один город, выполните некоторые действия (например, нажмите кнопку "Добавить больше городов" ), и это действие добавит еще одну пустую строку в список, и ваша таблица должна быть переименована (через ajax или целое перезагрузка страницы).

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

<h:dataTable value="#{dataTableBean.cities}" var="city">
    <h:column>
    <f:facet name="header" >
        <h:outputText value="City name"/>
    </f:facet>    
    <h:inputText value="#{city}"/>
    </h:column>
</h:dataTable>

<h:commandButton value="Add one more city" action="#{dataTableBean.enlargeList}"/>
<h:commandButton value="Submit" action="#{dataTableBean.processList}"/>

В bean:

private List<String> cities = new LinkedList<String>();

//getter and setter
...

public String enlargeList () {
    cities.add ("");
    return "refreshTable"; //the easiest way - just reload the page
}

Ответ 2

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

Ответ 3

Вы можете использовать компонент и связать его с HtmlPanelGrid при поддержке bean. Затем вы можете динамически добавлять компоненты по мере необходимости. Здесь я добавил outputText.

Код страницы:

<ice:panelGrid binding="#{backingBean.gridComponent}"/>

Поддержка Bean:

private HtmlPanelGrid gridComponent;

public void someFunction(){

HtmlOutputText outPutText = new HtmlOutputText();
outPutText.setValue("Some Text");

gridComponent.getChildren().add(outPutText);

}

//SETTERS/GETTERS