JSF,表单中的多bean更新属性

时间:2009-11-26 19:41:17

标签: java jsf properties javabeans

由于我有更多时间来编写,我编辑的问题更加准确。

我有一个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>

2 个答案:

答案 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.dognull。另外,我对大写豆名User有点警惕。那应该是user(除非你指的是类User中的静态字段,这在JSF环境中会是一个可怕的错误。)