2014-10-07 43 views
4

在我的项目,我更新的细节,所以我创建的动作,但它给了我的异常响应为如何在同一页上获得结果为什么需要输入?

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调用

function checkPersonal(id) { 

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

它给了我JQuery的成功消息,但它不会去宣布的操作类。我不明白为什么在一切正确之后发生。我提到了许多网站,但没有解决。请告诉我发生了什么问题。

+0

很可能发生了一些错误,并返回“输入”结果。 – 2014-10-07 18:17:41

回答

2

并非所有事情都是正确的,因为您在success回调函数中收到了INPUT结果。此结果由workflow interceptor返回,该值在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拦截过滤动作方法。只有当你有足够的理由这样做时,才应该使用最后一个选项,因为它克服了拦截器本身的目的。

+3

在我添加了interceptor-ref标签后,控件不会进入指定的操作类的方法。我不知道为什么它不行。我检查了请求和响应,作为对页面的响应。 – MegaBytes 2014-10-08 04:45:40

+0

好的,再试一次。假设你不明白什么是自定义堆栈。 – 2014-10-08 08:05:56

+3

谢谢罗马,现在正在添加' 错误 emp- personal-form.jsp' – MegaBytes 2014-10-09 08:48:59

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消息与错误的第一行(输入或错误导致的情况下),或成功的消息(在的情况下, SUCCESS结果),然后提供一个链接来远离页面。

否则,使用标准的POST和输入或错误,或成功页面的情况下,在成功的情况下返回相同的页面:

<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和返回在SUCCESS的情况下也是一样的页面。

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

相关问题