我正在尝试使用数据库中的数据创建一个测验,但我有点迷茫。
我有3张桌子:
- 测验
- 问题(多对一:测验)
- 答案(多对一:问题)
所以我写了这段代码来显示每个问题及其答案:
<p>Questions</p>
<ui:repeat value="#{questionBean.fetchQuestionsFromQuizz(quizzBean.fetchQuizz(quizzBean.quizzId))}" var="i" varStatus="current">
<p>#{i.question}</p>
<h:selectOneRadio value="#{i.selectedAnswerId}">
<f:selectItems value="#{answerBean.fetchAnswersFromQuestion(i)}" var="item"
itemLabel="#{item.answer}" itemValue="#{item.id}" />
</h:selectOneRadio>
</ui:repeat>
我通过GET参数获取"quizzBean.quizzId"。
h:selectOneRadio 的值是我的问题实体中的 selectedAnswerId 属性,因此我尝试将其与用户的所选答案绑定。
所以我正在尝试在提交按钮中传递测验 id 以在 bean(@RequestScoped) 中检查它们,但是一旦单击提交按钮,测验 id 为空......
这是按钮:
<h:commandLink value="Submit" action="#{questionBean.checkTheAnswers()}">
<f:setPropertyActionListener target="#{questionBean.fromQuizzId}" value="#{quizzBean.quizzId}" />
</h:commandLink>
这是方法(一个简单的打印):
public void checkTheAnswers(){
System.out.println("FROMQUIZZID : " + fromQuizzId);
}
那么你知道为什么 quizzId 是空的吗?
你有一个requestScoped托管Bean,并且你使用http GET方法传递quizzId,在这种情况下,你应该使用托管bean的@PostConstruct init方法初始化带有GET方法的值的quizzId。
@PostConstruct
public void init() {
try {
FacesContext facesContext = FacesContext.getCurrentInstance();
Map<String, String> params = facesContext.getExternalContext().getRequestParameterMap();
if (params.containsKey("quizzId") {
quizzId= params.get("quizzId");
....