我正在尝试做一份考试问卷。我正在从数据库中检索问题和选择。我在 ui:repeat
中使用 h:inputText
。但是当我试图得到答案时,它只重复了最后一个答案。我是 JSF 的新手,希望有人能帮助我。谢谢!
这是 JSF:
<h:body>
<h:outputLabel>Examination</h:outputLabel>
<h:form>
<ui:repeat var="item" value="#{bean.q}" varStatus="status">
<tr>
<td>
<br/>
#{status.index+1}.
#{item.question}<br/>
A. #{item.ans_1}<br/>
B. #{item.ans_2}<br/>
C. #{item.ans_3}<br/>
D. #{item.ans_4}<br/>
<h:outputLabel value="Answer:" />
<h:inputText value="#{bean.answer}" required="true">
<f:validateLength maximum="1"/>
<f:validateRegex pattern="(^[_A-D]$)" />
</h:inputText>
<br/>
</td>
</tr>
</ui:repeat>
<br/>
<h:commandButton id="btn" value="Check" action="#{bean.check}"/>
</h:form>
</h:body>
这是 bean :
public List<Return> getQ(){
DatabaseManager db = new DatabaseManager();
Connection conn = db.connection("jdbc:sqlserver://LAPTOP-","sa","1234567890");
List<Return> qList = new ArrayList<Return>();
try{
PreparedStatement ps = conn.prepareStatement("SELECT * FROM [JavaEE].[dbo].[tbl_Finals]");
ResultSet rs = ps.executeQuery();
while(rs.next()){
Return e=new Return();
e.setQuestion(rs.getString("question"));
e.setAns_1(rs.getString("a1"));
e.setAns_2(rs.getString("a2"));
e.setAns_3(rs.getString("a3"));
e.setAns_4(rs.getString("a4"));
qList.add(e);
}
conn.close();
}catch(Exception e){e.printStackTrace();
}
return qList;
}
public void check(){
DatabaseManager db = new DatabaseManager();
Connection conn = db.connection("jdbc:sqlserver://LAPTOP","sa","1234567890");
try{
PreparedStatement ps = conn.prepareStatement("SELECT * FROM [JavaEE].[dbo].[tbl_Finals]");
ResultSet rs = ps.executeQuery();
while(rs.next()){
i++;
System.out.println(getAnswer());
if(getAnswer().equals(rs.getString("ans"))){
c++;
System.out.println(i+ ". CORRECT");
}
else{
System.out.println(i+ ". WRONG");
}
}
conn.close();
}catch(Exception k){;
}
System.out.println("Your score is: " +c);
}
最佳答案
1)
实际上你有多个 inputTexts
指向同一字段 #{bean.answer}
。提交表单时,您的每个 inputText 都会调用 bean.setAnswer(..)
你最终得到最后一个 inputText
的值在那个领域。
向您的 Return
添加一个字段类:
public class Return {
...
private String userAnswerInput;
public void setUserAnswerInput(..){..};
public String getUserAnswerInput(){..};
}
并将您的输入更改为 <h:inputText value="#{item.userAnswerInput}" ...>
这样您就可以获得填写 Return
的用户的答案与每个提问相对应的实例。
2)
你必须修改你的check()
循环遍历 Return
列表的方法实例。
3)
您不应该构建 Return
的列表getter 中的实例,因为它被调用多次。而是在一个单独的公共(public)方法中创建列表,并用 @PostContruct
注释。 。 getter 应减少为 public List<Return> getQ(){return qList;}
.
关于java - 如何比较数据库和用户输入的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53763473/