【问题标题】:Struts 2 could not find a result for success returned from an actionStruts 2 找不到从动作返回的成功结果
【发布时间】:2015-08-21 05:23:36
【问题描述】:

我不是以英语为母语的人,所以如果我犯了一些惯用的错误,我深表歉意。我是 Struts2 的新手。 我开发了一个 Web 项目,其中包含 3 个 JSP 页面、一个部署描述符 (web.xml)、一个 struts 配置文件 (struts.xml),其中配置了 2 个动作(一个名为 index 的动作和一个名为 Welcome 的动作)和 1 个实现欢迎操作的操作逻辑。当我尝试索引操作时,它工作得很好,但是如果我在 URL (welcome.action) 中调用欢迎操作,我会收到以下错误

Struts Problem Report
Struts has detected an unhandled exception:
Messages:   
No result defined for action actions.WelcomeAction and result success
com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:373)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:275)
...

现在我给你更多关于项目和环境的信息:

开发环境

  • 操作系统:Mac OS X 10.10.3
  • JRE:1.8.0_20
  • IDE:NetBeans 7.4
  • 应用服务器:GlassFish 4.0
  • 服务器位置:localhost:8080
  • 上下文路径:/AppStruts2Example
  • 网址项目:http://localhost:8080/AppStruts2Example/

Web 项目开发信息

  • Java EE 版本:7
  • Struts2 版本:2.3.15

代码描述如下

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <session-config>
    <session-timeout>
        30
    </session-timeout>
  </session-config>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

struts.xml

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
  <constant name="struts.devMode" value="true" />
  <constant name="struts.configuration.xml.reload" value="true" />

  <!-- Configuration for the default package. -->
  <package name="default" extends="struts-default">
    <action name="index">
       <result>/WelcomeFromIndexAction.jsp</result>
    </action>
    <action name="welcome" class="actions.WelcomeAction">
       <result name="success">/WelcomeFromWelcomeAction.jsp</result>
    </action>
  </package>
</struts>

actions.WelcomeAction.java

package actions;
import com.opensymphony.xwork2.ActionSupport;

public class WelcomeAction extends ActionSupport{

  @Override
  public String execute(){
    System.out.println("Inside of execute method in WelcomeAction.");
    System.out.println("Result: " + SUCCESS);
    return SUCCESS;
  }
}

index.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
  <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Index JSP</title>
  </head>
  <body>
      <h1>Welcome to index.jsp!</h1>
  </body>
</html>

WelcomeFromIndexAction.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
  <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Index Action</title>
  </head>
  <body>
      <h1>Welcome From Index Action</h1>
      <br />
      <h3>Current Page: WelcomeFromIndexAction.jsp</h3>
  </body>
</html>

WelcomeFromWelcomeAction.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
  <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Welcome Action</title>
  </head>
  <body>
      <h1>Welcome From Welcome Action</h1>
      <br />
      <h3>Current Page: WelcomeFromWelcomeAction.jsp</h3>
  </body>
</html>

项目在以下情况下运行良好:

  • 我在浏览器上直接写任何一个JSP的URL
  • 我调用了 index 操作,如下所示:/index.action 或 /index -> 都将我重定向到 WelcomeFromIndexAction.jsp

项目在以下情况下失败:

  • 我调用了欢迎操作,如下所示:/welcome.action 或 /welcome -> 都向我显示了一个带有如上所述 Struts 问题报告的网页

我认为可能是 GlassFish Server 的问题,所以我在 VM 上安装了 Debian,并在那里安装了 Tomcat 7。我的下一步是从 NetBeans 部署带有“Clean and Build”的 Web 应用程序。它为我生成了一个 WAR 文件,我将其部署到 Tomcat 7 中,但我遇到了同样的问题。在这令人失望之后,我禁用了 Debian VM (Tomcat 7),然后我重新开始使用 GlassFish 4.0

正如您在 WelcomeAction.java 中看到的,它在 execute 方法中有一个 println 语句。当我在浏览器上调用欢迎操作时,我可以看到 Struts 有效地调用了该方法,这些行打印在输出上,并且在此调用之后,当 Struts2 必须处理结果时,然后向我显示错误。这证实了我 Struts2 没有找到结果而不是动作,但我不知道为什么。

我尝试使用新旧版本的过滤器(FilterDispatcher/StrutsPrepareAndExecuteFilter)配置过滤器调度程序。两者我都遇到同样的问题。 我尝试在 struts.xml 中配置与索引操作完全相同的欢迎操作(实际上默认情况下),但也不起作用。只有索引操作运行良好。 我尝试了很多方法在 struts.xml 中配置欢迎操作,但没有任何效果。

所以,我在这里,需要有人帮助我。感谢您的回答。

注意:Stackoverflow 不允许我发布图片,因为我是新手。因此,我将一个重要的打印屏幕上传到了我的 Dropbox。 https://dl.dropboxusercontent.com/u/101502868/NetBeans%20Struts2%20Error.png 在这个打印屏幕上,您可以看到添加的库、执行方法的执行、自定义的打印行和 Struts 错误的开始。

谢谢。

【问题讨论】:

  • 您的配置看起来不错.. 可能是您正在部署一个旧的 struts.xml 文件
  • 用maven重新创建你的项目,因为你可能有错误的依赖项
  • 使用配置浏览器插件struts.apache.org/docs/config-browser-plugin.html它会帮你找到映射
  • @EliseoCastro 回答你自己,而不是编辑你的问题,只需添加一个答案;)

标签: java macos jsp netbeans struts2


【解决方案1】:

在名为editUser的动作类中使用自定义方法在struts.xml中创建条目,以便控制直接转到该perticuler方法并根据您的逻辑处理结果

<action method="editUser" name="editUser" class="com.action.EditUserAction">
                        <result name="true">/jsp/editUser.jsp</result>
                        <result name="false">jsp/index.jsp</result>
</action>

并在您的类中添加自定义方法而不是覆盖执行方法

class EditUserAction extendes ActionSupport{
                    public String editUser(){
                    String status = "false";
                        /**
                            do your buisness logic
                        */      
                    return status;  
                    }
                }

如果问题仍然存在,请仔细检查您的配置

【讨论】:

    【解决方案2】:

    解决此问题的最佳方法是使用 Maven 创建您的项目并管理您可能需要的所有依赖项。这是唯一对我有用的解决方案。

    这是使用 Maven 创建 Struts 2 Web 应用程序的官方指南(非常简单的示例):http://struts.apache.org/docs/create-struts-2-web-application-using-maven-to-manage-artifacts-and-to-build-the-application.html

    如果您没有安装 Maven 是 OS X 并且您不知道如何安装它,请按照以下步骤安装它:

    下载Maven(本例使用Maven 3.3.3,压缩文件名为apache-maven-3.3.3-bin.tar.gz):http://maven.apache.org/download.cgi 解压下载的文件(本例假设下载的文件位于 /Users/YourUser/Downloads/)。解压后,将创建一个与您下载的 maven 文件名称和路径相同的新目录。 (在此示例中:/Users/YourUser/Downloads/apache-maven-3.3.3/) 打开终端 使用以下命令将您的 maven 目录移动到您的主目录:

    mv ~/Downloads/apache-maven-3.3.3/ ~/

    现在,您必须编辑位于您的主目录 (~/.bash_profile) 上的文件 .bash_profile。要对其进行编辑,我们将使用 vi commando,如下所示:

    vi ~/.bash_profile

    打开后必须按 i 进行编辑

    现在你可以编辑文件了,所以你必须写以下内容:

    导出 JAVA_HOME=$(/usr/libexec/java_home)

    导出 MAVEN=$HOME/apache-maven-3.3.3/bin

    关闭终端并再次打开它。就是这样,应该已经安装了 Maven。使用以下命令验证 Maven 是否正常工作:

    mvn-版本

    如果您看到有关您正在使用的 Maven、Java 和 OS X 的信息,那是因为 Maven 工作正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-09
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 2016-07-10
      • 1970-01-01
      相关资源
      最近更新 更多