Таймер обратного отсчета через несколько страниц JSP - PullRequest
1 голос
/ 15 марта 2011

Эй, я разрабатываю онлайн-тест с использованием сервлетов / jsps, и мне было интересно, как создать таймер, который отсчитывает от 6 минут, в течение которых тест завершится, как только он достигнет нуля.Есть ли в java класс таймера, который можно использовать? Если да, то как бы я реализовал его на странице jsp?

Любая помощь с этим будет принята с благодарностью.

PS СпособЯ реализую таймер не только должен быть языком Java.Я не ссорился с использованием javascript, но не знал, как реализовать его на нескольких страницах без сброса счетчика.

Ответы [ 5 ]

3 голосов
/ 15 марта 2011

Вы можете пойти по этому маршруту:

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

В этой части каждый раз, когда вы нажимаете на страницу, используя jsp / servlets,«нажать» в оставшееся время, и используя что-то вроде обратный отсчет JavaScript , вы можете элегантно отобразить оставшееся время без сброса самого счетчика.

0 голосов
/ 15 марта 2011

Вам нужно будет запустить клиентскую часть таймера в javascript, поскольку у jsp-страницы / сервлета не будет возможности уведомить клиента, когда таймер выключен. Я бы предложил следующее: Запустите таймер JavaScript (используя setTimeout при загрузке страницы), когда они отправляют ответ, также отправляют время начала вопроса, чтобы вы могли рассчитать, сколько времени у них осталось, если таймер выключится, используйте javascript, чтобы уведомить их (и сервер, когда они нажмут), что тест завершен.

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

0 голосов
/ 15 марта 2011

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

Или вы можете поместить в форму скрытое поле «timerCurrentValue», которое обновляется каждую секунду по времени JavaScript, и отправлять его на каждом шаге теста, чтобы следующая страница перезапускала время с данным значением. *

0 голосов
/ 15 марта 2011

Самое простое решение - сохранить значение тайм-аута в сеансе пользователя. Затем вы можете вставить тайм-аут JavaScript на страницу или использовать тег обновления в сгенерированном HTML-коде (замените 0 здесь рассчитанным тайм-аутом:

<meta http-equiv="Refresh" CONTENT="0; URL=/timeout.jsp"/>

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

0 голосов
/ 15 марта 2011

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

void myTestCaseThatStartsTimer() {

    // inline class - actually legal in Java
    class TestShutdownHook implements Runnable {
        Test test;
        TestShutdownHook(Test test) { this.test = test; }
        public void run() {
            Thread.sleep(1000 * 60 * 6); // 6 minutes, catch it's InterruptedException...
            test.triggerShutdown();
        }
    }
    Threat hook = new Thread(new TestShutdownHook(this));
    hook.start();

    // rest of test here


}
...