java - 如何比较数据库和用户输入的字符串?

标签 java jsf

我正在尝试做一份考试问卷。我正在从数据库中检索问题和选择。我在 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/

相关文章:

java - 如何从java中的文件夹目录中获取png图像名称、路径、高度和宽度?

java - Android 中的 PNG 图像和 InputStream

java - 如何将 Eclipse RCP 插件 JAR 转换为插件目录,反之亦然?

java - 上下文已损坏,但 session 仍然打开

java - 创建程序集存档 bin : You must set at least one file 时出错

java - Android 保存高分

css - RichFaces CSS 不工作

JSF 2.0 - Ajax 提交输入验证

jsf - 如何在使用 <p :message>? 时自动隐藏/关闭错误消息

java - 打印注释中的空格