由于我有更多时间来编写,我编辑的问题更加准确。
我有一个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>
这是我的托管bean User.java
:
(所有getter和setter都很好且有效,因为这是一个bean构造函数为空)。
(最初Dog属性在验证方法中初始化,因此它有一个值,并且是not null
)
public class User {
public User() {}
String name;
Dog dog;
(...get, set, ect...)
这是另一个我没有设置的bean,因为它只被User类使用
Dog.java
:
public class Dog{
public User() {}
String dog_name;
(...)
Offcourse这是一个理解事物的简单例子。
当我发送表单时,User.name
属性将更新,但不会更新User.dog.name
属性。
如何更新两个java类的值?
提交表单后,我会显示当前值,只有User.name
已更改:
的System.out.println(User.name); //提交表单后更改值 的System.out.println(User.dog.name); //表单提交后未更改
我不知道你是否理解我的问题,我想在我的JSF表格中操纵Dog类属性,我不会直接修改Dog bean,只有User.Dog
...
顺便说一下,faces-config还可以:
编辑: 我为我的用户托管bean添加了一个。虽然,没有任何改变......
<managed-property>
<property-name>dog</property-name>
<property-class>package.Dog</property-class>
<value>#{Dog}</value>
</managed-property>
答案 0 :(得分:2)
您需要在构建或初始化父bean期间预先实例化嵌套bean。 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
实际上是托管bean,请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>
在这一切中,我假设您的属性和getter以及setter都是根据Javabean naming conventions命名的。
答案 1 :(得分:0)
这应该有效。我建议通过调试器运行代码,但我的第一个猜测是User.dog
是null
。另外,我对大写豆名User
有点警惕。那应该是user
(除非你指的是类User
中的静态字段,这在JSF环境中会是一个可怕的错误。)