JSF,在表单中更新多个bean属性

3

我编辑了我的问题,使其更加精确,因为我有更多的时间来写它。

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

这是我的受控BeanUser.java: (所有的getter和setter都是良好有效的,因为这是一个bean,构造函数为空)。 (最初Dog属性在验证方法中初始化,因此它具有值且不为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); //表单提交后值未更改

我不知道你是否明白我的问题,我想在我的JSF表单中操作Dog类属性,尽管我不会直接修改Dog bean,只修改User.Dog...

顺便说一下,faces-config没问题:

编辑: 我已经为我的User托管bean添加了一个<managed-property>。 尽管如此,没有任何变化...

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

请更正您的问题 - 您的Dog类被声明为User。 - Bozho
2个回答

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,则可以通过`faces-config.xml`将其作为托管属性注入到`User`中。
<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命名约定进行命名。

谢谢,我一回家就会尝试这个。当你必须在没有任何有用知识的情况下完成一个完整的项目时,就会发生这种情况。我即将毕业,但老师只告诉我们简单的JSP。当我们涉及到一个大而完整的应用程序时,JSP无法简单地完成任何事情。谢谢,我确认到家后会尝试这个解决方案 ;)!(我不知道<managed-property>标签。这就是我们所说的:学习Hibernate、JSF、JSTL和Ajax同一周。目前还不错;) - wlarcheveque

0
这样应该可以运行。我建议通过调试器运行代码,但我的第一个猜测是 User.dognull。此外,我对大写的bean名称 User 有点担心。 应该是user(除非您正在引用类User 中的静态字段,在JSF环境中这将是一个可怕的错误)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接