【问题标题】:Struts is taking incorrect return string. Instead of "input" it should take "success" [duplicate]Struts 采用不正确的返回字符串。而不是“输入”,它应该采取“成功”[重复]
【发布时间】:2016-01-21 06:14:20
【问题描述】:

我正在使用 struts 2 和 hibernate 开发应用程序。我的 jsp 页面上有一个提交按钮,该按钮正在执行操作 EvaluateRating

JSP 页面

<s:form action="EvaluateRating">
//  Some jsp code here //
    <s:hidden name="Year" value="2015" />
    <s:submit value="Evaluate" cssStyle="float:right"/>
</s:form>

这个动作映射到struts.xml

struts.xml

<action name="EvaluateRating" class="Action.RatingAction" method="EvaluateRating">
    <result name="success" type="redirectAction">
        <param name="Year">${Year}</param>
        <param name="actionName">MgrPage</param>
    </result>
    <result name="input">/Index.jsp</result>
</action>

我的EvaluateRating() 方法如下:

RatingAction.java

public String EvaluateRating() {
    this.setYear(this.getYear());
    return "success";
}

我面临的问题是我从该方法返回了 success,但它仍然将 input 作为返回字符串并重定向到 Index.jsp 页面。相反,它应该采用 success 并重定向到操作 MgrPage

如果我不在 struts.xml 中写 &lt;result name="input"&gt;/Index.jsp&lt;/result&gt; 行。它给了我以下错误:

Struts 问题报告

Struts 检测到一个未处理的异常:

消息:没有为动作 Action.RatingAction 和结果输入定义结果

Stacktraces
No result defined for action Action.RatingAction and result input 
    com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:373)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:275)
    com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)
    org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:239)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:239)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:252)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:161)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:193)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:563)
    org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
    org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1556)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1513)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Thread.java:745)

【问题讨论】:

    标签: java jsp struts2 struts2-interceptors interceptorstack


    【解决方案1】:

    似乎在该操作之前应用了一些拦截器,并因此返回输入。

    检查并删除此操作的拦截器。

    【讨论】:

    • 我没有在该操作中编写任何拦截器代码。您可以在上面看到我的 struts.xml 代码。
    • +1 用于理解它是一个返回 INPUT 结果的拦截器。 -1 建议删除拦截器而不是修复问题。
    • @Andrea 我建议删除造成问题的不必要的自定义拦截器。
    • 没错。那是一个错误。拦截器不会引起问题,它只是引起您的注意。如果你的厨房着火了,而且火警在尖叫,你的解决办法是关掉火警?
    • 同意您的担忧。我的意思是说如果自定义拦截器导致问题而不是调查它并找到解决方案。
    【解决方案2】:

    我没有在该操作中编写任何拦截器代码。您可以在上面看到我的 struts.xml 代码。

    如果您没有为某个操作指定任何拦截器,则您使用的是为您的包定义的默认拦截器堆栈。

    如果您没有更改包的默认拦截器堆栈,则您使用的是默认拦截器堆栈,即defaultStack

    <interceptor-stack name="defaultStack">
        <interceptor-ref name="exception"/>
        <interceptor-ref name="alias"/>
        <interceptor-ref name="servletConfig"/>
        <interceptor-ref name="i18n"/>
        <interceptor-ref name="prepare"/>
        <interceptor-ref name="chain"/>
        <interceptor-ref name="scopedModelDriven"/>
        <interceptor-ref name="modelDriven"/>
        <interceptor-ref name="fileUpload"/>
        <interceptor-ref name="checkbox"/>
        <interceptor-ref name="datetime"/>
        <interceptor-ref name="multiselect"/>
        <interceptor-ref name="staticParams"/>
        <interceptor-ref name="actionMappingParams"/>
        <interceptor-ref name="params"/>
        <interceptor-ref name="conversionError"/>
        <interceptor-ref name="validation">
            <param name="excludeMethods">input,back,cancel,browse</param>
        </interceptor-ref>
        <interceptor-ref name="workflow">
            <param name="excludeMethods">input,back,cancel,browse</param>
        </interceptor-ref>
        <interceptor-ref name="debugging"/>
        <interceptor-ref name="deprecation"/>
    </interceptor-stack>
    

    拦截器堆栈是一个拦截器列表,用于过滤从页面到动作的请求,并在动作执行后到页面

    您必须始终定义(本地到操作,或全局到包)INPUT 结果,以避免得到

    消息:没有为动作 Action.RatingAction 和结果输入定义结果

    为什么以及何时从 Interceptors 返回 INPUT 结果?有不同的原因:验证错误、转换错误等。

    请务必仔细阅读

    Struts2 INPUT result: how does it work? How are conversion / validation errors handled?


    要查看哪个是错误,您可以将input 结果映射到您来自的同一页面,并且(如果使用 XHTML 默认主题),错误将出现在生成它的字段旁边(可能是@ 987654327@,因为它是唯一的)。相反,如果您想在其他页面(如 index.jsp)中打印它,您可以循环访问 fieldErrors,您将通过使您的操作扩展 ActionSupport 来获得。


    也就是说,你使用了错误的命名(年份必须是年份,不要在 OGNL(struts 标签)和配置(struts.xml)中以大写字母开头,所以首先纠正它,并删除 @987654330 @ 那完全没用。

    【讨论】:

    • 你试过了吗?请不要忘记接受并投票,谢谢
    猜你喜欢
    • 2022-01-23
    • 2020-07-02
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2021-03-20
    相关资源
    最近更新 更多