【问题标题】:Using <ui:repeat><h:inputText> on two list of string to print the first one and get the second one在两个字符串列表上使用 <ui:repeat><h:inputText> 打印第一个并获取第二个
【发布时间】:2018-07-26 17:14:58
【问题描述】:

我目前正在使用 JSF 和 PrimeFaces 在 Java8 中开发一个 Web 应用程序。我成功地使用 ui:repeat 打印了第一个字符串列表,但我无法检索用户的答案(我想将其添加到 bean FormulaireComplete 的列表响应中)。

我必须承认我不知道如何在 a.xhtml 中初始化对象列表。它可能来自这里,但我真的不确定。我在 stackoverflow 上找到了一些示例,但该列表已经创建了很多元素。

将包含响应的 FormulaireComplete 类(我没有将 getter 和 setter 放在这里,但它们当然存在于代码中):

@Named
@RequestScoped
public class FormulaireComplete  implements Serializable {
	private List<Reponse> reponses;

	public FormulaireComplete() {
		super();
		reponses = new ArrayList<>();
	}

	//validate form
	public String complete() {
		ReponsesDAO.create(reponses);
		return "../admin.xhtml?faces-redirect=true";
	}
}

<div id="postFormulaire" class="ui-g">
				<ui:repeat id="repeater" value="#{utilisateur.questionnaire.questions}" var="question" class="ui-g-12">  
				   	<div class="ui-g-12"><b>#{question.titreQuestion}</b> #{question.question}</div>
				   	
				    <div class="ui-g-1"/>
				    <p:inputTextarea class="ui-g-9" id="reponse" value="#{formulairecomplete.reponses.commentaire}" label="f"></p:inputTextarea>
			        <p:selectOneMenu id="onemenu" class="ui-g-1" style="max-height:45px" value="#{formulairecomplete.reponses.note}" >
					   	<f:selectItem itemValue = "NA" itemLabel = "NA" /> 
					   	<f:selectItem itemValue = "1" itemLabel = "1" /> 
					   	<f:selectItem itemValue = "2" itemLabel = "2" /> 
					   	<f:selectItem itemValue = "3" itemLabel = "3" /> 
					   	<f:selectItem itemValue = "4" itemLabel = "4" /> 
					   	<f:selectItem itemValue = "5" itemLabel = "5" /> 
					   	<f:selectItem itemValue = "6" itemLabel = "6" /> 
					   	<f:selectItem itemValue = "7" itemLabel = "7" /> 
					   	<f:selectItem itemValue = "8" itemLabel = "8" /> 
					   	<f:selectItem itemValue = "9" itemLabel = "9" /> 
					   	<f:selectItem itemValue = "10" itemLabel = "10" /> 
			        </p:selectOneMenu>
				    <div class="ui-g-1"/>
				    
				    <div class="ui-g-2"/><p:separator id="separator" class="ui-g-8" /><div class="ui-g-2"/>
				</ui:repeat> 
				<div class="ui-g-5"/><h:commandButton id="validerForm" class="ui-g-2" value="Valider Formulaire" action="#{formulairecomplete.complete}"></h:commandButton><div class="ui-g-5"/>
			</div>

【问题讨论】:

    标签: jsf primefaces javabeans


    【解决方案1】:

    您没有数据结构来将您的问题响应映射到您的问题。我建议创建一种将问题和答案包装在一起的新类型。

    关联问题和答案的数据结构:

    public class Response {
       private Question question;
       private Answer answer;
    }
    

    单独加载问题和答案并将它们映射到这种新数据类型的托管 bean:

    @Named
    @RequestScoped
    public class FormulaireComplete implements Serializable {
        private List<Response> responses;
    
        public FormulaireComplete() {
            super();
            reponses = new ArrayList<>();
        }
    
        @PostConstruct
        init() {
             List<Question> questions = loadQuestions();
             List<Answer> answers = loadAnswers();
             for(Question q: questions) {
                 for(Answer a: answers) {
                     if(q.id == a.id) {
                         this.responses.add(new Response(q, a));
                     }
                 }
             }
        }
    
        //validate form
        public String complete() {
            ReponsesDAO.create(reponses);
            return "../admin.xhtml?faces-redirect=true";
        }
    }
    

    显示数据,并初始化答案:

      <ui:repeat value="#{bean.responses}" var="response">
        #{response.question.description}
    
        <p:inputTextarea value="#{response.answer.input}"></p:inputTextarea>
    
        <p:selectOneMenu value="#{response.answer.score}">
          <f:selectItems ... />
        </p:selectOneMenu>
      </ui:repeat>
    

    【讨论】:

    • 我不想这样做(因为它涉及一些更改)但我认为你是对的,这是最好的选择!谢谢@DavidZ!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 2017-08-10
    相关资源
    最近更新 更多