2016-11-26 1 views
0

Je travaille sur un projet JSF 2.2, 8.x jbossui: répéter h: selectManyCheckbox je ne peux pas obtenir des valeurs dans une liste

Je crée une forme dynamique uniquement avec selectManyCheckbox.

J'ai le code suivant:

<h:form> 



        <table border="5"> 


<ui:repeat var="question" value="#{beanQuiz.traninigee.questions}"> 
     <tr> #{question.question} </tr> 

     <tr> 
     <h:selectManyCheckbox value="#{beanQuiz.questionAnswers[question]}" 
             converter="javax.faces.Integer"> 
        <f:selectItems var="response" 
            value="#{question.responses}" 
            itemLabel="#{response.reponse}" 
            itemValue="#{response.responseId}" /> 
       </h:selectManyCheckbox> 
      </tr> 
     </ui:repeat> 

       </table> 
<h:commandButton value="Submit" action="result" styleClass="btn btn-success btn-cons m-b-10" /> 
     <h:commandButton value="Reset" type="reset" styleClass="btn btn-warninig btn-cons m-b-10"/> 

     </h:form> 

selectedArticles est la liste des entités.

Je vois sur le web que la valeur d'une selectManyCheckbox peut pointer vers une chaîne [] ou une liste. Avec ce code, les articles sélectionnés ne contiennent pas toutes les valeurs vérifiées, seulement le dernier groupe vérifié.

Que dois-je faire pour obtenir toutes les valeurs cochées?

@ManagedBean 
@SessionScoped 
public class beanQuiz implements Serializable{ 


    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    @EJB 
    private trainingServiceLocal local; 

    private List<Integer> selectedreponses; 

    private List<Training> trainings; 

    private Training traninigee=new Training(); 



public String redirectquiz(int idt){ 

    traninigee=local.findtrainingbyId(idt); 



    return "quiz"; 
} 


    public List<Integer> getSelectedreponses() { 
     return selectedreponses; 
    } 

    public void setSelectedreponses(List<Integer> selectedreponses) { 
     this.selectedreponses = selectedreponses; 
    } 

    public int getInc() { 
     return inc; 
    } 

    public void setInc(int inc) { 
     this.inc = inc; 
    } 


    private int inc; 

    public Training getTraninigee() { 
     return traninigee; 
    } 

    public void setTraninigee(Training traninigee) { 
     this.traninigee = traninigee; 
    } 

    @PostConstruct 
    public void init() { 
     inc=0; 
     trainings = local.findAlltrainings(); 


     //traninigee=local.findtrainingbyId(1); 
     //System.out.println("-----||||||||||||----**---"+traninigee); 




    } 


// private static Map<String,Object> color2Value; 
// static{ 
//  color2Value = new LinkedHashMap<String,Object>(); 
//  for() 
//  color2Value.put("Color2 - Red", "Red"); //label, value 
//  
// } 





    public List<Training> getTrainings() { 
     return trainings; 
    } 




    public void setTrainings(List<Training> trainings) { 
     this.trainings = trainings; 
    } 

mon diagramme de classes est comme ça: j'ai obtenu une classe de formations qui contrains liste des questions (OneToMany) ma question de classe contient la liste des reponses (une à plusieurs) et mes réponses de classe est un classe simple qui contient la réponse sous forme de chaîne im en utilisant JPA

Classe Training 
{ 
    @OneToMany(fetch = FetchType.EAGER,mappedBy="training") 
    private List<Question> questions; 
} 



classe Question 

{ 

@OneToMany(mappedBy="question",cascade=CascadeType.ALL,fetch=FetchType.LAZY) 
    private List<Respons> responses; 

} 




classe response { 
@Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int responseId; 
    private Boolean isValid; 

    //bi-directional many-to-one association to Question 

} 

mon quiz liste expl .xhtml

<ui:repeat var="cat" value="#{beanQuiz.trainings}"> 




<h:commandButton action="#{beanQuiz.redirectquiz(cat.trainingId)}" value="#{cat.name} " styleClass="btn btn-block btn-success"> 




</h:commandButton> 





<br></br> 

</ui:repeat> 

et ma page de résultat où im va montrer le résultat de vérifiés selectboxes

 <h:form> 

      <p>selected responses: </p> 

      <br/> 

      <p>#{}</p> 

<c:forEach items="#{beanQuiz.questionAnswers.values()}" var="res"> 


       <p> #{res}</p> 
<p>------------</p> 
       <br></br> 

</c:forEach> 
     </h:form> 
+0

Pouvez-vous joindre une partie de votre code de beans backing? Au moins les parties pertinentes car il serait plus facile d'obtenir l'image –

+0

@MaciejKowalski je suis désolé j'ai mis à jour mon poste – tero17

Répondre

2

Ok, voici donc ce que vous avez à faire:

a) Modifier le backing bean en supprimant la liste et de le remplacer par une carte qui apparier des questions à la liste des réponses:

@ManagedBean 
@SessionScoped 
public class BackingBean implements Serializable{ 


@EJB 
private wagentServiceLocal local; 

private Training training=new Training(); 

private Map<Question, List<Integer>> questionAnswers 
     = new HashMap<Question, List<Integer>>(); 

// When setting up the training to be used in the multiChebox tag 
// set up the map of question to list of chosen responses. 
public String redirectquiz(int idt){ 

    training=local.findtrainingbyId(idt); 

    for(Question question: traninigee.getQuestions()){ 
      questionAnswers.put(question, new ArrayList<Integer>());    
    } 

    return "quiz"; 
} 

public Map<Question, List<Integer>> getQuestionAnswers() { 
    return questionAnswers; 
} 

public void setQuestionAnswers(Map<Question 
       , List<Integer>>  questionAnswers) { 
    this.questionAnswers = questionAnswers; 
} 

b) Vous modifiez le selectManyCheckBox d'utiliser une liste séparée pour chacune des questions:

<ui:repeat var="question" value="#{beanQuiz.training.questions}"> 
     <tr >#{question.question} : 
     </tr> 
     <tr> 
     <h:selectManyCheckbox value="#{beanQuiz.questionAnswers[question]}" 
             converter="javax.faces.Integer"> 
        <f:selectItems var="response" 
            value="#{question.responses}" 
            itemLabel="#{response.name}" 
            itemValue="#{response.id}" /> 
       </h:selectManyCheckbox> 
      </tr> 
     </ui:repeat> 

Merci à cela, chaque groupe de cases aura son propre objet de la liste et ne seront pas interféré par d'autres groupes. Il vous suffit de changer votre logique sur la façon dont vous extrayez les résultats pour chacune des questions ou utilisez 'questionAnswers.values ​​();', itérez et combinez toutes les réponses relatives à la question.

Espérons que cela aide

+0

Ajouté toutes les pièces maintenant. J'ai changé un peu le nom de rendre les choses plus claires pour les autres –

+0

Salut maciej j'ai mis à jour mon poste avec ma conception de cas réels je peux appliquer votre solution à mon problème pouvez-vous l'ajuster à mon cas réel – tero17

+0

Ok j'ai mis à jour le poste et j'ai mis au point une nouvelle, meilleure approche qui utilise Map pour jumeler les questions à la liste des réponses sélectionnées. Vérifiez-le. Encore une fois j'ai refactored le nom un peu. –