Радиокнопка не возвращает значение JSP - PullRequest
0 голосов
/ 30 января 2020

Я разрабатываю тест в JSP, и переключатели в настоящее время возвращают NULL вместо назначенного значения. Как мне это исправить?

И да, я знаю, что скриптлеты не должны использоваться в JSP, но я не уверен, как решить эту проблему. Я сделаю некоторые исследования по этому вопросу позже, но сейчас я просто хочу знать, почему переключатели возвращают значение NULL.

Выходы System.out.println предназначены только для отслеживания значений, они будут удалены в финальном коде. Я включил основной код на всякий случай, если есть ошибка, которую также необходимо исправить. Извините за отсутствие комментирования кода, это проект, который я должен был сделать очень быстро для домашней работы.

Connection conn = null;
ResultSet rs;
Statement st;
String action;
Scanner input = new Scanner(System.in);
System.out.println("Enter Question ID (int):");
int score = 0;

int QID = Integer.parseInt(input.nextLine());
try {
    Class.forName("org.mariadb.jdbc.Driver");
    System.out.println("Connecting to a selected database...");
    conn = DriverManager.getConnection(
            "jdbc:mariadb://ebs-db.eastbarnetschool.com/Quiz", "Quiz","quiz123");
    System.out.println("Connection made");

    CallableStatement stmt = conn.prepareCall("{call QuestionTitle(?, ?)}");
        stmt.setInt(1, QID); 
        stmt.registerOutParameter(2, Types.VARCHAR);
        stmt.execute();
        String description = stmt.getString(2);
        System.out.println(description);
%>
<br>
<br/>
<center>

<table border="1" width="500px" bgcolor="lightblue" cellspacing="0" cellpadding="0">
<tr>
<td width="100%">

<form name="quiz" method="post">

<h1 align="center"><font color="white" face="arial">Quiz</font></h1>
<table border="0" width="500px" cellspacing="2" cellpadding="6">
<tr>
<td width="50%"><font color="steelblue" face="arial" size=4><span style="font-weight:normal"> QUESTION <%=QID%></span></font></td>
<tr>
<td width="100%"><font color="black" face="arial" size=4><span style="font-weight:normal"><%=description%></span></font></td></tr>

<% 
     CallableStatement stmt1 = conn.prepareCall("{call DisplayAnswers(?)}");
    stmt1.setInt(1, QID); 
    rs = stmt1.executeQuery();
    stmt1.execute();

    ArrayList<String> answers = new ArrayList<String>();

    while(rs.next()) {
        String ADescription = rs.getString("Answer_Description");
        answers.add(ADescription);
        }

%>
<tr>
<td>        
1:<input type="radio" name="button" value= "<%=answers.get(0)%>" /><font face="arial" size=3><%=answers.get(0) %></font></td>
    <tr>
    <td>
2: <input type="radio" name="button" value="<%=answers.get(1)%>" /><font face="arial" size=3><%=answers.get(1) %></font></td>
    <tr>
    <td>
3: <input type="radio" name="button" value="<%=answers.get(2)%>" /><font face="arial" size=3><%=answers.get(2) %></font></td>
    <tr>
    <td>
4: <input type="radio" name="button" value="<%=answers.get(3)%>" /><font face="arial" size=3><%=answers.get(3) %></font></td>

<tr><td><center><input type="submit" value="Next" name="next"><input type="submit" value="Submit" name="submit"></center></td></tr> 
</table>
</form>     
<%  
System.out.println(answers);        

action = request.getParameter("button");
System.out.println("\n" + action);

if (action == null){
    System.out.println("Please select a button");
}

CallableStatement stmt2 = conn.prepareCall("{call GetCorrectAnswer(?, ?)}");
    stmt2.setInt(1, QID); 
    stmt2.registerOutParameter(2, Types.VARCHAR);
    stmt2.execute();
    String CorrectDescription = stmt2.getString(2);
    System.out.println("\nCorrect Answer: " + CorrectDescription);

    System.out.println("\nChosen: " + (request.getParameter("button")));

    if(request.getParameterValues("button") != null) {
       if(correctAnswer.equals(CorrectDescription)) {
            out.println("Correct!");
            score ++;
        }

        else{
            out.println("Incorrect!");  
    }   

    }

    //System.out.println("Score = "+ score);

1 Ответ

0 голосов
/ 30 января 2020

Ваша хранимая процедура, DisplayAnswers не кажется правильной. Он должен иметь параметры OUT, если вы ожидаете получить значения из них. Также обязательно вызовите stmt1.registerOutParameter(2, java.sql.Types.VARCHAR); после исправления реализации вашей хранимой процедуры, DisplayAnswers. Кроме того, если вы используете хранимую процедуру, вы должны получить значение типа String answerDescription = stmt1.getString(2);.

Однако я рекомендую использовать PreparedStatement вместо CallableStatement в этом случае, то есть сформировать запрос как

SELECT answer_description FROM answers WHERE qid = ?

, а затем получить набор результатов после установки значения параметра. Проверьте https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html для получения более подробной информации.

...