Вывод сообщений в TextArea каждый раз когда вызывается метод

Рейтинг: 0Ответов: 1Опубликовано: 04.04.2023

Есть html форма:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head></head>
<body>

<form th:method="post" action="/" th:object="${dates}">
    <textarea class="logs" name="logs" id="logs"></textarea>
</form>

<script>
    const logsTextArea = document.querySelector('#logs');
    let lastUpdatedMessage = '';

    function getLogsAndUpdateTextArea() {
        fetch('/logs')
            .then(response => response.text())
            .then(data => {
                if (data !== lastUpdatedMessage) {
                    logsTextArea.value += data;
                    logsTextArea.scrollTop = logsTextArea.scrollHeight;
                    lastUpdatedMessage = data;
                }
            });
    }

    setInterval(getLogsAndUpdateTextArea, 1);
</script>

</body>
</html>

На форме textarea, куда выводятся сообщения из класса CreateFile.getMessage();

Есть REST-контроллер, который выводит сообщения в textarea

@RestController
@RequestMapping("/logs")
public class LogsController implements MessageUpdateListener {

    private final CreateFile createFile;
    private String lastMessageUpdate = "";
    private String currentMessageUpdate = "";

    @Autowired
    public LogsController(CreateFile createFile) {
        this.createFile= createFile;
        this.createFile.addMessageUpdateListener(this);
    }

    @GetMapping
    public ResponseEntity<String> getLogs() {
        String message = createFile.getMessage();
        if (!message.equals(lastMessageUpdate)) {
            currentMessageUpdate = message;
            lastMessageUpdate = message;
        }
        return ResponseEntity.ok(currentMessageUpdate + "\n");
    }

    @Override
    public void onMessageUpdate(String message) {
        currentMessageUpdate = message;
    }
}

Интерфейс:

public interface MessageUpdateListener {
    void onMessageUpdate(String message);
}

Класс CreateFile:

@Service
public class CreateFile {

    private String message = "";
    private final List<MessageUpdateListener> messageUpdateListeners = new ArrayList<>();

    @Autowired
    public CreateFile() {}

    public void addMessageUpdateListener(MessageUpdateListener listener) {
        messageUpdateListeners.add(listener);
        listener.onMessageUpdate(message);
    }

    public void removeMessageUpdateListener(MessageUpdateListener listener) {
        messageUpdateListeners.remove(listener);
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        if (!this.message.equals(message)) {
            this.message = message;
            notifyMessageUpdateListener(message);
        }
    }

    private void notifyMessageUpdateListener(String message) {
        for (MessageUpdateListener listener : messageUpdateListeners) {
            listener.onMessageUpdate(message);
        }
    }

    public List<Usl> readDBF(String[] check_otd) {
        ***
        setMessage("Чтение данных ");
        ***
    }

    public List<Usl> selectCorrectUsl(String[] checks) {
        List<Usl> list = readDBF(checks);
        
        setMessage("Проверка корректности услуг. Начало");

        return list;
    }

}

Метод setMessage вызывается во многих местах класс, но для простоты оставила в двух местах. Все работает в принципе, только есть один момент. Если текст сообщения не изменяется, то в textarea не выводится информация. Как сделать чтобы при каждом вызове setMessage в textarea сразу же выводилась информация?

Ответы

▲ 0

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