Как получить результат на той же странице, почему требуется ввод?
В моем проекте я обновляю детали, поэтому я создал действие, но в ответ я получаю исключение
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 и возвращаться на той же странице также в случае УСПЕХА.
Примечание: чтобы узнать, как отображать сообщение (об успехе или ошибке) только при необходимости, прочтите это.