首页 > 解决方案 > 如何使用 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();
        }
    }

}

标签: javajspservletscountdown

解决方案


推荐阅读