如何在同一页面上获得结果为什么需要输入?

时间:2014-10-07 14:16:40

标签: java jquery ajax validation struts2

在我的项目中,我正在更新详细信息,因此我创建了操作,但它在响应中给出了异常

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 个答案:

答案 0 :(得分:2)

并非所有内容都符合您的想法,因为在success回调函数中,您收到了INPUT个结果。此结果由workflow interceptor返回,defaultStack位于inputResultName - 默认情况下使用的拦截器堆栈(如果您的操作未覆盖拦截器配置)。它检查操作调用是否包含操作错误或字段错误(转换错误)等验证错误,然后返回参数validation指定的结果。默认情况下,此参数设置为“input”。如果拦截器返回一个结果,它会破坏一系列拦截器并调用action方法。你注意到它说它没有进入声明的动作类

解决方案是覆盖动作的拦截器配置以使用基本堆栈,即没有workflow和/或<action name="savePersonalDetails" class="org.employee.actions.EmployeeMyProfileAction" method="updateEmployeeDetails"> <interceptor-ref name="basicStack"/> <result name="success">empMyProfile.jsp</result> </action> 拦截器。

workflow

如果您仍需要执行验证,则可以以编程方式或配置{{1}}拦截器来过滤您的操作方法。只有在你有足够理由这样做时才应该使用的最后一个选项,因为它克服了拦截器本身的目的。

答案 1 :(得分:1)

假设你知道what the INPUT result is and how it works,你在这里做错了。

当您执行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的情况下返回相同的页面,或者在成功的情况下返回成功页面:

<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并在同一页面中返回。

注意:要知道如何仅在需要时显示(成功或错误)消息,read this