2009-11-26 8 views
3

J'ai modifié ma question pour être plus précis car j'ai plus de temps pour l'écrire.JSF, propriété de mise à jour de plusieurs beans sous une forme

J'ai une forme de JSF qui devrait modifier la valeur des propriétés différentes d'un chien:

<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> 

Ceci est mon bean géré User.java: (Tout le getter et setter sont bonnes et valables, car cela est un constructeur de bean est vide). (Initialement propriété de chien est initialisé dans une méthode de validation, il a donc une valeur et est not null)

public class User { 
    public User() {} 
    String name; 
    Dog dog; 

    (...get, set, ect...) 

Ceci est un autre grain que je ne l'ai pas ensemble géré comme il est utilisé uniquement par classe utilisateur Dog.java:

public class Dog{ 
    public User() {} 
    String dog_name; 

(...) 

Offcourse ceci est un exemple simple pour comprendre la chose.

Lorsque j'envoie le formulaire, la propriété User.name mettra à jour, mais pas la propriété User.dog.name.

Comment les deux valeurs des classes Java peuvent-elles être mises à jour?

Une fois le formulaire soumis je montre les valeurs actuelles, seule la User.name a changé:

System.out.println (User.name); // valeur modifiée après l'envoi du formulaire System.out.println (User.dog.name); // valeur non modifiée après que le formulaire est soumis

Je ne sais pas si vous comprenez mon problème ici, je veux manipuler les propriétés de classe de chien dans mon formulaire de JSF bien que je ne modifierai pas le haricot de chien directement, seulement le User.Dog ...

Soit dit en passant, des visages-config est ok:

EDIT: J'ai ajouté un bean géré pour mon utilisateur. Bien que, rien n'est changé ...

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

Corrigez votre question - votre classe de classe Dog est déclarée comme utilisateur – Bozho

+0

Désolé, copier/coller typo. :) – wiooz

Répondre

2

Vous devez préinstancier les beans imbriqués pendant la construction ou l'initialisation des beans parents. JSF ne le fera pas pour vous.

Ainsi, au lieu de:

public class User { 
    Dog dog; 
} 

vous devez instancier directement:

public class User { 
    Dog dog = new Dog(); 
} 

ou dans le constructeur:

public class User { 
    Dog dog; 
    public User() { 
     this.dog = new Dog(); 
    } 
} 

ou si Dog est en fait un bean géré, injecter comme propriété gérée dans User par 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> 

Dans ce tout ce que je suppose que vos propriétés et accesseurs sont nommés selon le Javabean naming conventions.

+0

Merci, je vais essayer dès que je rentre à la maison. C'est ce qui arrive lorsque vous devez terminer un projet complet sans aucune connaissance utile que je termine l'école, mais l'enseignant nous a seulement parlé de simples JSP. Rien ne peut être fait simplement dans JSP lorsque nous nous référons à une application complète et complète. Merci, je confirme cette solution quand j'arrive à la maison;)! (Je ne connaissais pas la balise C'est ce que nous appelons: apprendre Hibernate, JSF, JSTL et Ajax la même semaine. – wiooz

0

Cela devrait fonctionner. Je suggère d'exécuter le code via un débogueur, mais ma première supposition serait que User.dog est null. En outre, je suis un peu méfiant par le nom de haricot majuscule User. Cela devrait être user (sauf si vous faites référence à des champs statiques dans la classe User, ce qui serait une erreur terrible dans un environnement JSF).

Questions connexes