java - 如何使用 PrintWriter 或 JSP 将解析后的数据返回给用户?
问题描述
我想建立一个倒计时,其中用户在表单中输入日期和时间,服务器将他发送回该日期之前的剩余时间,并逐秒动态更新。
我设法通过使用睡眠时间为 1000 的线程来创建此倒计时以在控制台中打印,但我不知道如何以动态方式将数据发送回用户。我尝试使用 PrintWriter 但由于某种原因它不起作用。我是否需要在每经过一秒的循环中使用 response.setAttribute 并调用 requestDispatcher 或其他什么?无论如何,这里是代码。
形式 - (在这种情况下,方法应该是 post 还是 get n,为什么?)
<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>");
}
}
业务逻辑(main方法仅用于控制台测试)
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();
}
}
}
解决方案
推荐阅读
- java - Java 软件:在特定日期后禁用
- mysql - 复杂查询 orddr by 和 group by 一起在语句上
- c# - WPF 在添加新行之前禁用与 DataGrid 的 TemplateColumn 交互
- javascript - 正则表达式 - 查找可以包含字符但不能以字符结尾的模式(javascript)?
- javascript - 如何使用变量为对象属性赋值?
- logstash - logstash,grok - 多行数据后如何匹配可选字段?
- java - '<> 不是抽象的,并且不会覆盖抽象方法 keyReleased',即使没有使用 keyReleased
- android - Layout Inspector - 如何查找文本元素的当前字体
- python - 如何使用 SQLAlchemy 声明性 ORM 在声明的属性上设置索引?
- excel - 从新工作表执行 ADO 宏的问题