JSF, свойство обновления нескольких компонентов в форме
-
05-07-2019 - |
Вопрос
Я отредактировал свой вопрос, чтобы быть более точным, поскольку у меня есть больше времени, чтобы написать его.
У меня есть форма 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).