Struts 1 - Вызов большего количества действий через один пост без изменения struts-config - PullRequest
0 голосов
/ 11 мая 2018

Я работаю над унаследованным приложением (Struts 1, собственный каркас, Java 6, в WebSphere 7), где мне нужно изменить поведение операции.

Давайте назовем их (1) CopyItem , (2) AlterItem , (3) MarkAsCopied .

Кнопка, называемая одной службой, которую необходимо заменить тремя другими службами.В зависимости от результата первого, вызовите второй и так далее.Я хочу в конце перейти туда, куда меня приведет первый (так, чтобы это выглядело как исходное поведение с точки зрения пользователя).

Изначально я думал, что обертываю каждый нужный мне параметр в форму, POSTэто, а затем на стороне Java, я бы назвал действие выполнить для каждого сервиса.Технически из CopyItemAction.execute () из CopyItem Я бы назвал AlterItem и MarkAsCopied также выполняется.

Iчувствую, что это довольно далеко от чистого решения.

У вас есть идея получше, как это сделать?

1 Ответ

0 голосов
/ 24 мая 2018

В итоге я сделал это через синхронизированный Ajax. Это определенно плохая практика, поэтому я не рекомендую иметь доступ к бэкэнд-коду. Однако в моем случае это оказалось не слишком уродливым решением. Основано на предложении Дейва Ньютона (https://stackoverflow.com/users/438992/dave-newton)).
Имейте в виду, что действия Struts по-прежнему вызываются в соответствии с конфигурацией, определенной в struts-config.xml.

Я создал функцию js ниже и вызывал службы с указанными формами один за другим. Таким образом, отправка формы (POST) вызывает действие Struts, но не перемещается. После их успешного запуска я перенаправил страницу.

    function submitForm(form) {
        if (form !== null && form !== undefined) {

            let formData = new FormData(form);
            let xhr = new XMLHttpRequest();
            xhr.open('POST', form.getAttribute('action'), false);

            var successResponse = false;
            xhr.onreadystatechange = function() {
                if(xhr.readyState == XMLHttpRequest.DONE) {
                    successResponse = xhr.status == 200;
                }
            }

            xhr.send(formData);
            return successResponse;
        }
    }

В заключение: это не рекомендуемое решение, но если вы находитесь в такой ситуации, как я, то оно работает.

...