Можно ли постоянно отображать данные из сервлета на jsp, используя AJAX? - PullRequest
0 голосов
/ 05 марта 2020

Я работаю над Java веб-приложением, которое выполняет команды в командной строке в фоновом режиме и отображает результаты на веб-странице. Я уже реализовал несколько команд, и все работает нормально, но теперь у меня есть асинхронная команда, которая постоянно отправляет данные в командную строку, пока она не остановится. Я был близок к тому, чтобы сдаться, когда я узнал о AJAX и снова нашел новую надежду выполнить команду через JavaScript, но теперь я снова зашел в тупик, так как не могу найти способ постоянно отправлять данные на jsp.

Итак, мой вопрос: Возможно ли вообще постоянно читать из командной строки и постоянно перенаправлять вывод в jsp, пока не будет остановлена ​​другой кнопкой? ?

Это кнопка, которая должна начинаться с асин c чтения:

<input type="button" onclick="sendRequest();" name="async" value="Start asynchronous reading"/>

Следующие JavaScript -коды AJAX:

var xmlhttp = new XMLHttpRequest();
function sendRequest() {
    url = "../TestServlet";
    xmlhttp.open("POST", url, true);
    xmlhttp.onreadystatechange = handleRequest;
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.send(createQueryString());
}

function createQueryString() {
    return "async=true";
}

function handleRequest() {
    if(xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
        alert("Response: "+xmlhttp.responseText);
    }
}

Мой сервлет имеет следующий (тестовый) код для выполнения команды (я взял ping для тестирования, поскольку он также регулярно отправляет данные, но останавливается автоматически)

response.setContentType("text/html;charset=UTF-8");
    try {
        ProcessBuilder pb = new ProcessBuilder();
        pb.command("ping", "192.168.116.1"); //Test-command
        Process process = pb.start();
        Thread clThread = new Thread(() -> {
            StreamGobbler streamGobbler = new asyncTest.StreamGobbler(process.getInputStream(), System.out::println); //everything that's printed here with sout should be forwarded to the jsp
            ExecutorService executor = Executors.newSingleThreadExecutor();
            executor.submit(streamGobbler);
            executor.shutdown();
        });
        clThread.start(); 
        process.waitFor();
        System.out.println("Task dispatched");
    }catch(Exception e) {
        System.out.println(e.toString());
    }

Единственное возможное решение, о котором я мог подумать, - это сброс ReadyState к 0, когда команда завершается, чтобы создать как al oop, остановленный только при нажатии Stop-Button , но я не знаю, если это компилируемо.

Редактировать после ответа Jaromanda X ' : Для доступа к частичным данным я изменил if в JavaScript на readyState == 3 , но я до сих пор не знаю, куда мне направить данные в моем сервлете (возможно, с response.getWriter () .println ();

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