JSF, свойство обновления нескольких бинов в форме - PullRequest
3 голосов
/ 26 ноября 2009

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

У меня есть форма JSF, которая должна изменять значение различных свойств собаки:

<h:form id="submit">
     <h:outputLabel value="Dog name:"/>
     <h:inputText value="#{User.dog.name}" id="dogName"/>
     <h:outputLabel value="Name :"/>
     <h:inputSecret value="#{User.name}" id="name" />
     <h:commandButton type="submit" value="Submit" />
</h:form>

Это мой управляемый боб User.java: (Все геттеры и сеттеры хороши и действительны, так как это конструктор бина пуст). (Изначально свойство Dog инициализируется в методе проверки, поэтому оно имеет значение и равно not null)

public class User {
    public User() {}
    String  name;
    Dog dog;

    (...get, set, ect...)

Это другой бин, который я не установил как управляемый, так как он используется только классом User Dog.java:

public class Dog{
    public User() {}
    String  dog_name;

(...)

Конечно, это простой пример для понимания вещи.

Когда я отправляю форму, свойство User.name обновляется, но не свойство User.dog.name.

Как можно обновить значения обоих классов Java?

После отправки формы я показываю текущие значения, только User.name изменилось:

System.out.println (User.name); // значение изменилось после отправки формы System.out.println (User.dog.name); // значение НЕ изменяется после отправки формы

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

Кстати, face-config в порядке:

РЕДАКТИРОВАТЬ: Я добавил для моего бина, управляемого пользователем. Хотя ничего не изменилось ...

<managed-property>
    <property-name>dog</property-name>
    <property-class>package.Dog</property-class>
    <value>#{Dog}</value>
</managed-property>

Ответы [ 2 ]

2 голосов
/ 27 ноября 2009

Вам необходимо предварительно определить вложенные бины во время создания или инициализации родительских бинов. JSF не сделает этого за вас.

Так что вместо:

public class User {
    Dog dog;
}

вам нужно создать его экземпляр напрямую:

public class User {
    Dog dog = new Dog();
}

или в конструкторе:

public class User {
    Dog dog;
    public User() {
        this.dog = new Dog();
    }
}

или, если Dog на самом деле является управляемым бином, введите его как управляемое свойство в User от faces-config.xml:

<managed-bean>
    <managed-bean-name>dog</managed-bean-name>
    <managed-bean-class>mypackage.Dog</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

<managed-bean>
    <managed-bean-name>user</managed-bean-name>
    <managed-bean-class>mypackage.User</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
        <property-name>dog</property-name>
        <value>#{dog}</value>
    </managed-property>
</managed-bean>

Во всем этом я предполагаю, что ваши свойства и методы получения и установки имеют имена в соответствии с Соглашениями о присвоении имен Javabean .

0 голосов
/ 26 ноября 2009

Это должно работать. Я предлагаю запустить код через отладчик, но мое первое предположение было бы, что User.dog - это null. Кроме того, я немного осторожен с именем бина в верхнем регистре User. Это должно быть user (если вы не ссылаетесь на статические поля в классе User, что было бы ужасной ошибкой в ​​среде JSF).

...