DataTable, содержащий inputText: возможно ли это с помощью пользовательского компонента JSF - PullRequest
9 голосов
/ 10 декабря 2008

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

В нескольких словах пользователь должен иметь inputText, когда он вводит свои данные, и кнопку «добавить», которая добавляет новый вводимый текст для ввода других данных. Когда пользователь закончил, он нажимает еще одну кнопку отправки. Я искал что-то уже сделанное, но ничего не нашел, поэтому решил создать свой собственный компонент jsf

Идея состояла в том, чтобы создать компонент, объединяющий dataTable, содержащий inputText для каждой строки в datatable, плюс кнопку, которая добавляет строку в коллекцию, связанную с datatable.

Я просматриваю документацию и книги по jsf, но я немного запутался и не уверен, возможно ли создать такой компонент ... Кто-нибудь может мне помочь? ТИА

1 Ответ

12 голосов
/ 10 декабря 2008

Можно делать все что угодно.


Вы можете создать что-то близкое к тому, что вы хотите, используя существующие элементы управления. Хороший способ получить максимальную отдачу от JSF - адаптировать модель для представления. Например, в этом представлении отображаются параметры редактирования, которые позволяют добавлять значения в таблицу данных.

<f:view>
    <h:form>
        <h:dataTable value="#{people.list}" var="row">
            <h:column>
                <f:facet name="header">
                    <h:outputText value="#" />
                </f:facet>
                <h:selectBooleanCheckbox value="#{row.selected}" />
            </h:column>
            <h:column>
                <f:facet name="header">
                    <h:outputText value="First Name" />
                </f:facet>
                <h:inputText value="#{row.firstname}" />
            </h:column>
            <h:column>
                <f:facet name="header">
                    <h:outputText value="Last Name" />
                </f:facet>
                <h:inputText value="#{row.lastname}" />
            </h:column>
            <f:facet name="footer">
                <h:panelGroup>
                    <h:commandButton value="Add Row" action="#{people.addPerson}" />
                    <h:commandButton value="Delete Selected"
                        action="#{people.deleteSelected}" />
                    <h:commandButton value="Finish" action="#{people.finish}" />
                </h:panelGroup>
            </f:facet>
        </h:dataTable>
    </h:form>
</f:view>

People bean:

public class People implements Serializable {

    private static final long serialVersionUID = 1L;

    private List<Person> people = new ArrayList<Person>();

    public People() {
        // initialise with one entry
        people.add(new Person());
    }

    public List<Person> getList() {
        return people;
    }

    public String addPerson() {
        people.add(new Person());
        return null;
    }

    public String deleteSelected() {
        Iterator<Person> entries = people.iterator();
        while (entries.hasNext()) {
            Person person = entries.next();
            if (person.isSelected()) {
                entries.remove();
            }
        }
        return null;
    }

    public String finish() {
        System.out.println(people);
        return "someNavigationRule";
    }

}

Персональный боб:

public class Person implements Serializable {

    private static final long serialVersionUID = 1L;

    private String firstname;
    private String lastname;
    private transient boolean selected = false;

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public boolean isSelected() {
        return selected;
    }

    public void setSelected(boolean selected) {
        this.selected = selected;
    }

}

лица-config.xml:

<managed-bean>
    <managed-bean-name>people</managed-bean-name>
    <managed-bean-class>addmultiple.People</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

Этот подход довольно гибкий и с некоторыми CSS, может выглядеть довольно хорошо. С некоторыми изменениями в представлении и модели вы можете редактировать только последнюю строку, например.


Если полученный опыт недостаточно богат или если вам нужно что-то, что вы можете использовать повторно, вы можете создать собственный элемент управления. Трудно разобраться в деталях, не зная точно, что вы хотите, но вам, вероятно, понадобится:

  1. Новый Рендерер для передачи HTML и декодирования запросов формы.
  2. (возможно) новый компонент , возможно, расширяющий UIData и конкретную форму для предоставления специфичных для renderkit (например, HTML) атрибутов.
  3. Новый класс тегов JSP , позволяющий использовать элемент управления в JSP.
  4. Определения для всего вышеперечисленного в face-config.xml (см. spec ).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...