JSF, свойство обновления нескольких компонентов в форме

StackOverflow https://stackoverflow.com/questions/1805365

Вопрос

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

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

<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 :(Все получатели и установщики хороши и допустимы, так как этот конструктор bean пуст).(Изначально свойство 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...

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

Редактировать :Я добавил a для своего пользовательского компонента, управляемого пользователем.Хотя, ничего не изменилось...

<managed-property>
    <property-name>dog</property-name>
    <property-class>package.Dog</property-class>
    <value>#{Dog}</value>
</managed-property>
Это было полезно?

Решение

Вам необходимо предварительно установить вложенные компоненты во время построения или инициализации родительских компонентов.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.

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top