2010-09-20 6 views
0

J'ai un écran d'édition qui affiche une série de propriétés (champs) éditables d'une entité. Et cette liste de champs est dynamique, dans le sens où n'importe quel champ peut être ajouté/retiré de la liste sans aucun changement de code. J'ai un modèle quelque chose comme ça. Mon backingBean a une carte de ces propriétés (pour d'autres raisons, nous avons choisi la carte comme la structure de données) Lier les propriétés dynamiques à l'aide de JSF

public class Property{ 

private String displayName; 
private String value; 
private int displayOrder; 
//other props,getters,setters etc.. 
} 

public class BackingBean{ 

private Map<String,Property> editableProps; 
//other props,getters,setters etc.. 
} 

Le problème est avec itérer sur cette carte et produire une zone de texte pour chacun de l'entrée. Depuis a4j: répétition (richfaces) n'a pas itérer sur une carte, j'ai décidé d'utiliser JSTL et le fragment de code ressemble à quelque chose comme ça,

<c:forEach items="${mybean.editableProps}" 
       var="item" > 
    <tr> 
    <td> 
     <c:out value="${item.value.displayName}"/> 
    </td> 
    <td> 
     <input type="text" value="${item.value.value}" /> 
    </td> 
    </tr> 
</c:forEach> 

Cela fonctionne bien, sauf pour le fait que la liaison d'un champ de l'interface utilisateur à la propriété de haricot ne se produira pas automatiquement. Si j'essaie d'utiliser h: inputText à l'intérieur c: forEach, le composant n'est pas rendu (supposons que jstl var n'est pas disponible pour le jsf). Y a-t-il une façon JSF de faire tout cela (Utiliser hashmap)? Pour qu'une zone de texte soit produite pour chaque entrée de la carte et que toute modification y soit liée à la propriété java bean sous-jacente.

+0

9 mois plus tard et j'ai la même question EXACT. L'avez-vous déjà résolu? –

+0

Non, il suffit de l'implémenter de manière non-jsf. – chedine

Répondre

0

Le code proposé fonctionnera dans les versions actuelles de JSF. Mais aussi, un moyen plus facile d'y parvenir est de faire de votre haricot une carte elle-même.

@Component("prop") 
public class PropertyBean extends HashMap<String, Property>{ 
    public PropertyBean() { 
     this.put("prop1", property1); 
     this.put("prop2", property2); 
    } 
} 

Et dans les facelets

<h:outputText value="#{prop.prop1.displayName}" /> 
<h:outputText value="#{prop.prop1.value}" /> 
Questions connexes