Как я могу сравнить строки из базы данных и ввода пользователя? - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь сделать экзаменационные анкеты.Я извлекаю вопросы и варианты из базы данных.Я использую h:inputText внутри ui:repeat.Но когда я пытался получить ответ, он только дублировал последний ответ.Я только новичок в использовании 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>

Вот боб:

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 Ответ

0 голосов
/ 13 декабря 2018

1)

Фактически у вас есть несколько inputTexts, которые указывают на одно и то же поле #{bean.answer}.При отправке формы каждый из ваших inputTexts вызывает 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 экземпляры в вашем получателе, так как он вызывается несколько раз.Вместо этого создайте список отдельным публичным методом, помеченным @PostContruct.Геттер должен быть уменьшен до public List<Return> getQ(){return qList;}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...