Как получить результат на той же странице, почему требуется ввод?

В моем проекте я обновляю детали, поэтому я создал действие, но в ответ я получаю исключение

No result defined for action org.employee.actions.EmployeeMyProfileAction and result input

В struts.xml (До)

<action name="savePersonalDetails"  class="org.employee.actions.EmployeeMyProfileAction" method="updateEmployeeDetails">
        <result name="success">empMyProfile.jsp</result>
</action>

(После)

<action name="savePersonalDetails" class="org.employee.actions.EmployeeMyProfileAction" method="updateEmployeeDetails">
    <result name="success">empMyProfile.jsp</result>
    <result name="input">emp-personal-form.jsp</result>
</action>

Ajax Call

function checkPersonal(id) {

    if (checkEverythingP()) {
        $.ajax({
            type : 'POST',
            url : 'savePersonalDetails',
            data : $('#personalform').serialize(),
            success : function(data) {
                alert('success');
            },
            error : function() {
                alert('error');
            }
        });
    }
}

Это дает мне сообщение об успехе в JQuery, но не соответствует объявленному классу действия. Я не понял, почему это происходит после того, как все правильно. Я отослал много сайтов для этого, но не решен Пожалуйста, предложите мне, что происходит не так.

2 ответа

Решение

Не все правильно, как вы думали, потому что в success функция обратного вызова, которую вы получили INPUT результат. Этот результат возвращается workflow перехватчик, который находится в defaultStack - стек перехватчиков, используемых по умолчанию, если ваше действие не отменяет конфигурацию перехватчиков. Он проверяет, есть ли у вызова действия ошибки проверки, такие как ошибки действия или ошибки поля (ошибки преобразования), затем возвращает результат, указанный параметром inputResultName, По умолчанию этот параметр установлен на "вход". Если перехватчик возвращает результат, он разрывает цепочку перехватчиков и вызов метода действия. Вы отметили это, говоря, что это не собирается объявленному классу действия.

Решение состоит в том, чтобы переопределить конфигурацию перехватчиков действия, чтобы использовать базовый стек, т.е. validation и / или workflow перехватчики.

<action name="savePersonalDetails"  class="org.employee.actions.EmployeeMyProfileAction" method="updateEmployeeDetails">
  <interceptor-ref name="basicStack"/>
  <result name="success">empMyProfile.jsp</result>
</action>

Если вам все еще нужно выполнить проверку, вы можете сделать это программно или настроить workflow перехватчик, чтобы отфильтровать ваш метод действия. Последний вариант следует использовать только в том случае, если у вас достаточно причин для этого, поскольку он преодолевает цель самого перехватчика.

Предполагая, что вы знаете, каков результат INPUT и как он работает, вы делаете здесь не то.

Когда вы выполняете AJAX-вызов, 1) результат будет проанализирован (а затем, в конечном итоге, введен) на вашей текущей странице, или, альтернативно, вы можете использовать этот результат для выполнения перенаправления с помощью javascript (window.location = "newUrl";).

Вы не можете вернуть целую страницу, а затем использовать этот ответ для создания новой страницы (если только внутри iframe или аналогичного, но это манипуляция с DOM / страницей, тогда случай 1).

Тогда это

<action name="savePersonalDetails" class="org.employee.actions.EmployeeMyProfileAction" method="updateEmployeeDetails">
    <result name="success">empMyProfile.jsp</result>
    <result name="input">emp-personal-form.jsp</result>
</action>

не может быть правильным, потому что оба результата должны быть целой страницей (в случае классического POST) или фрагментом JSP / JSON / чем угодно (в случае AJAX CALL).

Вы должны изменить это на что-то вроде

<action name="savePersonalDetails" class="org.employee.actions.EmployeeMyProfileAction" method="updateEmployeeDetails">
    <result name="success">emp-personal-form.jsp</result>
    <result name="input">emp-personal-form.jsp</result>
    <result name="error">emp-personal-form.jsp</result>
</action>

и включить в первые строки emp-personal-form.jsp сообщение с ошибками (в случае результатов INPUT или ERROR) или сообщение об успешном завершении (в случае результата SUCCESS), а затем предоставьте ссылку для перехода со страницы.

В противном случае, используйте стандартный POST и верните ту же страницу в случае INPUT или ERROR, или страницу успеха в случае SUCCESS:

<action name="savePersonalDetails" class="org.employee.actions.EmployeeMyProfileAction" method="updateEmployeeDetails">
    <result name="success">profileCorrectlyUpdated.jsp</result>
    <result name="input">empMyProfile.jsp</result>
    <result name="error">empMyProfile.jsp</result>
</action>

Но ничто не мешает вам использовать стандартный POST и возвращаться на той же странице также в случае УСПЕХА.

Примечание: чтобы узнать, как отображать сообщение (об успехе или ошибке) только при необходимости, прочтите это.

Другие вопросы по тегам