Как вернуть эти проанализированные данные пользователю с помощью PrintWriter или JSP? - PullRequest
0 голосов
/ 12 января 2020

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

I удалось создать этот обратный отсчет для печати в консоли, используя поток с временем ожидания 1000, но я не знаю, как отправить данные обратно пользователю динамически c способом. Я пытался с PrintWriter, но для некоторых причина, по которой это не работает. Мне нужно использовать response.setAttribute в al oop для каждой проходящей секунды и вызывать requestDispatcher или что-то еще? кейс, а почему?)

<html>
<head>
    <title>Welcome to the Mega Timer</title>
</head>
<body>
<h1>Please Enter your Event</h1>
<br>
<form method="GET" action ="CounterServlet">
    <h2>Please Enter The Event name</h2><br>
    <input type = "text" name = "eventName">
    <h2>Please Enter the date</h2><br>
    <input type = "date" name = "eventData">
    <input type = "time" name = "eventTime">
    <br>
    <input type = "Submit" value = "Submit">
</form>
</body>
</html>

сервлет

public class CounterServlet extends HttpServlet {

    public void doGET(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

        response.setContentType("text/html");

        String eventName = request.getParameter("eventName");
        String eventDate = request.getParameter("eventDate");
        String eventTime = request.getParameter("eventTime");

        String dateAndTime = eventDate + eventTime.substring(0, 5);
        CounterService service = new CounterService();
        LocalDateTime theParsedUserInput = service.parseDate(dateAndTime);
        service.setDateTime(theParsedUserInput);
        Runnable r = new Counter(service);
        Thread a = new Thread(r);
        a.start();

        PrintWriter out = response.getWriter();
        out.println("<html><body>"+a+"</body></html>");
    }
}

бизнес-логика c (основной метод используется только для тестирования в консоли)

public class CounterService {
    LocalDateTime dateTime;

    public LocalDateTime getDateTime() {
        return dateTime;
    }

    public void setDateTime(LocalDateTime dateTime) {
        this.dateTime = dateTime;
    }

    public LocalDateTime parseDate(String eventDate) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
        dateTime = LocalDateTime.parse(eventDate, formatter);
        return dateTime;
    }


    public static void main(String[] args) {

        CounterService cs = new CounterService();
        LocalDateTime a = LocalDateTime.of(2021, 11, 11, 21, 43, 44);
        cs.setDateTime(a);


        Runnable r = new Counter(cs);
        new Thread(r).start();

    }

}

И работоспособный

package com.example.service;

import java.time.LocalDateTime;

public class Counter implements Runnable {
    CounterService counter;

    public Counter(CounterService cs) {
        this.counter = cs;
    }

    public void setCounter(CounterService cs) {
        this.counter = cs;
    }

    public void run() {
        try {
            boolean x = true;
            while (x) {
                LocalDateTime countFromThisDate = counter.getDateTime();
                LocalDateTime substracting = countFromThisDate.minusSeconds(1);
                counter.setDateTime(substracting);
                Thread.sleep(1000);
                System.out.println(counter.getDateTime());
            }
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }

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