Итак, я хочу построить обратный отсчет времени, когда пользователь вводит дату и время в форму, а сервер отправляет ему время, оставшееся до этой даты, и динамически обновляет его каждую секунду.
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();
}
}
}