Struts 2无法找到从动作

时间:2015-06-06 08:01:25

标签: java macos jsp netbeans struts2

我不是母语为英语的人,所以如果我犯了一些惯用的错误,我会道歉。我在Struts2上是全新的。 我开发了一个包含3个JSP页面的Web项目,一个部署描述符(web.xml),一个struts配置文件(struts.xml),里面配置了2个动作(一个名为index的动作和一个名为welcome的动作)和一个实现的类欢迎行动的行动逻辑。当我尝试索引操作时,它工作得很好,但如果我在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
  • App Server:GlassFish 4.0
  • 服务器位置:localhost:8080
  • 上下文路径:/ AppStruts2Example
  • 网址项目:http://localhost:8080/AppStruts2Example/

网站项目开发信息

  • 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.action或/ index - &gt;两者都将我重定向到WelcomeFromIndexAction.jsp

项目在以下时间失败:

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

我认为这可能是GlassFish Server的一个问题,所以我在VM上安装了Debian,并在那里安装了Tomcat 7。我的下一步是部署web应用程序whit&#34; Clean and Build&#34;来自NetBeans。它生成了一个我部署到Tomcat 7中的WAR文件,但是我遇到了同样的问题。在这令人失望之后,我禁用了Debian VM(Tomcat 7),我又回来使用GlassFish 4.0

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

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

所以,我在这里,需要有人帮助我。我很感激你的回答。

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

感谢&#39;第

2 个答案:

答案 0 :(得分: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;  
                    }
                }

执行相同操作后如果问题仍然存在,请仔细检查您的配置

答案 1 :(得分:0)

解决此问题的最佳方法是使用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 -version

如果您看到Maven,Java和OS X的相关信息,那么Maven工作正常。