Как сохранить и отобразить результаты в конце теста

#java #jsp #servlets

#java #jsp #сервлеты

Вопрос:

У меня есть простая программа для тестирования, которая выбирает 10 случайных вопросов из базы данных и представляет их пользователю. В конце теста, когда пользователь нажимает кнопку отправить, я хотел бы отобразить результат пользователю.

Ниже приведен фрагмент кода, который запускает тест

 import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class serv3p extends HttpServlet    
{

 protected void doPost(HttpServletRequest req, HttpServletResponse res)    
                     throws ServletException, IOException    
    {
        res.setContentType("text/html");
        PrintWriter out = res.getWriter();
        String qKey = req.getParameter("sQuestionID");
        int iQuestionID = Integer.parseInt(qKey);


        try{
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            String sourceURL = new String("jdbc:odbc:MyQuiz");//DSN name
            Connection databaseConnection = DriverManager.getConnection(sourceURL);
            if (databaseConnection != null)
                out.println("<P>Connection made<BR>");

            if (iQuestionID < 11) out.println("QuestionID is: "   qKey);
            Statement myStatement = databaseConnection.createStatement();
            ResultSet results = myStatement.executeQuery ("SELECT TOP 10 QuestionBank.QuestionText, QuestionBank.Choice1, QuestionBank.Choice2,"
             "QuestionBank.Choice3, QuestionBank.Choice4,QuestionBank.Answer FROM QuestionBank ORDER BY RND(QuestionID)");



            //ResultSet results = myStatement.executeQuery ("SELECT * FROM QuestionBank WHERE QuestionID = '" qKey "'");

            if (results.next())
                {
                String r1, r2, r3, r4, r5;
                r1 = results.getString(1);
                r2 = results.getString(2);
                r3 = results.getString(3);
                r4 = results.getString(4);
                r5 = results.getString(5);
                //r6 = results.getString(6);
                out.println("<BODY BGCOLOR='lightblue'></BODY>"  
                    "<FORM method = "post" action = "http://localhost:8080/servlet/Relay">"  
                    "<TABLE BORDER = 2 CELLPADDING = 4 CELLSPACING = 2>"  
                    "<TR><TD COLSPAN = 6 ALIGN = CENTER><H2><B>Quick Quizz : Sports</B></H2></TD></TR>");
                out.println("<TR><TD>"   r1   "</TD></TR>");
                out.println("<TR><TD><input type = "radio" name = "answer" value = "1">"   r2   "</TD></TR><BR>");
                out.println("<TR><TD><input type = "radio" name = "answer" value = "2">"   r3   "</TD></TR><BR>");
                out.println("<TR><TD><input type = "radio" name = "answer" value = "3">"   r4   "</TD></TR><BR>");
                out.println("<TR><TD><input type = "radio" name = "answer" value = "4">"   r5   "</TD></TR><BR>");
                out.println("</TABLE>");
                results.close();
                iQuestionID  ; qKey = ""   iQuestionID;
                out.println("<BR>End of Database Records<BR>");
                if (iQuestionID < 11)

                    {
                    out.println("<BR><BR><INPUT type = "submit" value = "Press for Next Question">"  
                                "<INPUT type = "hidden" name = "sQuestionID" value = '"   qKey   "'><p>"  
                                "<INPUT type = "hidden" name = "choice" value = "Play"></FORM></BODY></HTML>");
                    }

                else
                    {out.println("<BR><BR><INPUT type = "submit" value = "Press to Exit">"  
                                 "<INPUT type = "hidden" name = "sQuestionID" value = '"   qKey   "'><p>"  
                                 "<INPUT type = "hidden" name = "choice" value = "serv43a"></FORM></BODY></HTML>");

                    }
                out.close();
                }
            }
            catch(ClassNotFoundException cnfe)
                {System.out.println(cnfe);}
            catch(SQLException sqle)
                {System.out.println("Error is: "   sqle);}

    }
}
  

Ответ №1:

Почему бы не использовать базу данных для хранения вычисленного результата, а затем отобразить его на странице результатов? Если вам не нужно сохранять результаты в течение какого-либо периода времени (например, более часа или около того), вы всегда можете проверять и удалять старые записи так часто, как это необходимо.

Комментарии:

1. итак, в моей базе данных у меня будет что-то вроде таблицы результатов с полями QuestionID,Answer, AnswerValue. На данный момент у меня нет страницы результатов. Не могли бы вы, пожалуйста, объяснить мне, как это сделать. Спасибо

2. Как вы справляетесь с переходом от вопроса к вопросу? Каким бы ни был этот метод, я бы сказал, что вы могли бы использовать что-то подобное, чтобы перейти на страницу результатов, когда закончите.

3. хорошо, я воспользуюсь тем же методом. проблема в том, как рассчитать результат.

4. Если вы сохраняете ответы в базе данных, я полагаю, вы могли бы просто сохранить, был ли ответ правильным или нет, а затем вычислить ответ на основе этого. Это будет некоторая комбинация сохранения ответов, за которой следует выполнение запроса для получения итоговых результатов (например, правильных 7/10 вопросов), а затем вычисления оценки на основе этого.

Ответ №2:

Что ж, вопрос, который вы должны задать себе, заключается в следующем: хочу ли я сохранять результаты в течение определенного периода времени (например, опрос), или вы просто хотите использовать это как тест, подобный программному обеспечению, которое возвращает точный результат после теста, но затем просто уничтожает это значение вместе с завершением работы программного обеспечения,

если вы хотите сохранить это на более длительный период времени, вы могли бы записать все значения в базу данных access или даже на SQL Server,

если вы считаете, что значения, которые вы хотите сохранить, не настолько совпадают, я бы предложил вам записать их в текстовый файл, поскольку его легко хранить и для его записи не требуется столько времени, сколько для подключения к базе данных,

чтобы получить свой результат, вам нужно будет жестко закодировать правильные ответы с помощью swich cases или if / else, просто жестко закодируйте место вашей строки с правильным ответом и добавьте результат в private int (или float / double)

отобразить это не так сложно, если вы хотите отобразить материалы от большого количества участников op, просто используйте расширенный цикл for с println, который отображает имя участника и цифры, или даже поместите это в JFrame. это зависит от вас,


мой совет

(вы хотите сохранить много данных) => Базы данных SQL / (access)

( немного данных, которые вы хотите сохранить) => текстовый файл, и если вы знаете точное количество участников ( XML)

(просто diplay) распечатайте свой результат,

вам нужно будет жестко запрограммировать этот результат, и это зависит от того, как вы выбрали значения.


последний совет: Не открывайте слишком много подключений к БД, это только замедлит ваш прогресс, а такие вещи, как правильный ответ, легко программируются, поскольку они не являются переменными, и у вас есть только около 10 вопросов


Вопрос 1: (редактировать)

нет проблем, вам нужно всего около 10 правильных вопросов, потому что вчера вечером я обсуждал проблему со своим другом, и если вы действительно хотите сохранить результаты на более длительный период времени, вы можете захотеть иметь возможность добавить больше вопросов, если нет,

просто используйте способ if else для каждого вопроса

if(Question1.equals(«Вопрос1»)) { без проблем, вам нужно всего около 10 правильных вопросов, потому что я обсуждал проблему с моим другом прошлой ночью, и если вы действительно хотите сохранить результаты на более длительный период времени, вы могли бы захотеть иметь возможность добавить больше вопросов, если нет,

просто используйте способ if else для каждого вопроса

if(Question1.equals(«Вопрос1»))

{

Переключение (ответ)

пример 1: очки ; перерыв;

случай 2: перерыв;

пример 3: перерыв;

по умолчанию: перерыв;

}

}

ещё

{

if(Question2.equals(«Вопрос2»))

{

Переключение (ответ)

пример 1: перерыв;

пример 2: очки ; перерыв;

пример 3: перерыв;

по умолчанию: перерыв;

}

ещё

{

}

}

и так далее, заполните вопросы, подобные этому,

Строковый вопрос = «Вопрос1»;

если (Вопрос.равно («Вопрос1»)) { … }

если вы хотите сделать это с помощью базы данных, вы также можете поместить ответ в дополнительный атрибут, и тогда вы могли бы сделать это следующим образом

int[] answerOnTheQuestions = ответы из теста (поместите их в массив Int) int[] answers = (ссылка вашей базы данных на нужную таблицу и столбец здесь ) int score = 0;

для (int counter = 0; счетчик < вопросов.длина; счетчик )

{

если (ответы на вопросы [счетчик] == ответы [счетчик])

{

оценка ;

}

}

Запишите результаты в свою таблицу вместе с именем участника, которое вы можете получить в графическом интерфейсе или на консультации.

Я надеюсь, что это помогло 🙂

Комментарии:

1. большое вам спасибо, я думаю, что пойду по пути sql / database, потому что я также хотел бы просмотреть все результаты как администратор. Если это не сильно беспокоит, не могли бы вы, пожалуйста, привести мне пример того, как жестко закодировать правильные ответы с использованием операторов if

2. если это помогло, пожалуйста, примите ответ ^^ удачи с вашим проектом, я надеюсь, это помогло (отредактировал мой ответ

3. Еще раз спасибо. я думаю, что воспользуюсь предложением базы данных. Вот как организована моя база данных

4. Еще раз спасибо. я думаю, что воспользуюсь предложением базы данных. Вот как моя база данных организована в 7 столбцов, т.Е. QuestionID questionText Выбор 1 Выбор 2 Выбор 3 Выбор 4 Ответ Как вы думаете, это будет работать так. Я все равно собираюсь попробовать

5. ну, я думаю, что это будет работать следующим образом, просто поместите все поля в массив и используйте идентификаторы для определения места в массиве (не забудьте), если вы хотите записать свой индекс в БД или получить идентификатор из своей таблицы (массив начинается с 0, таблицы начинаются с 1 ), а еще лучше используйте массив 2 dim, например [ID] [NeededItem] в двойном цикле for это не должно быть проблемой