1

我试图开发一个Struts2应用程序,在单击超链接时使用Struts动作映射将用户引导到hello.jsp时调用动作。我收到以下错误:Struts 2 - HTTP状态404 - 没有为行动定义的结果

HTTP Status 404 - No result defined for action com.manaar.action.HelloAction and result success 

我的文件如下。我的映射看起来像它的顺序。我也在这里检查了其他帖子,但似乎无法找到导致此问题的原因或解决方案。真的很感激任何建议。非常感谢,J

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java"%> 
<%@ taglib uri="/struts-tags" prefix="s"%> 
<html> 
<head> 
    <title><s:text name="app.title" /></title> 
    <link rel="stylesheet" href="mystyle.css" type="text/css" /> 
</head> 
<body> 
<center> 
    <h2> 
     Struts 2 Actions 
    </h2> 
    <br> 
    <br> 
    Welcome 
    <s:property value="#session.user" default="Guest" />! 
    <s:if test="#session.user!=null"> 
     <s:url id="logout" action="logout" /> 
     | <s:a href="%{logout}">Logout</s:a> | 
    </s:if> 
    <br> 
    <table cellspacing="5" width="180"> 
     <tr bgcolor="#f0edd9" height="25" align="center"> 
      <td> 
       <s:url id="hello" action="hello"/> 
       <s:a href="%{hello}">Hello Action</s:a> 
       </td> 
      </tr> 
      <tr bgcolor="#f0edd9" height="25" align="center"> 
       <td> 
       <s:a href="add_user.jsp">Add User</s:a> 
       </td> 
      </tr> 
      <tr bgcolor="#f0edd9" height="25" align="center"> 
       <td> 
       <s:a href="user.jsp">View Users</s:a> 
       </td> 
      </tr> 
      <tr bgcolor="#f0edd9" height="25" align="center"> 
       <td> 
       <s:a href="login.jsp">Login</s:a> 
      </td> 
     </tr> 
    </table> 
</center> 
</body> 
</html> 

struts.xml

<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
"http://struts.apache.org/dtds/struts-2.0.dtd"> 

<struts> 
<!-- Configuration for the default package. --> 
<package name="default" extends="struts-default"> 
    <action name="hello" class="com.manaar.action.HelloAction" method="wateva"> 
     <result name="success">/hello.jsp</result> 
    </action> 
</package> 

HelloAction.java

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package com.manaar.action; 
import com.opensymphony.xwork2.Action; 
import static com.opensymphony.xwork2.Action.SUCCESS; 

public class HelloAction implements Action { 

String message; 

public String getMessage() { 
    return message; 
} 

public void setMessage(String message) { 
    this.message = message; 
} 

    /** 
* 
* @return 
* @throws Exception 
*/ 
@Override 
public String execute() throws Exception { 
    setMessage("Hello From Struts!"); 
    return SUCCESS; 
} 
} 
+1

尝试在HelloAction中创建一个方法wateva,并从该方法返回SUCCESS,或者您可以在struts.xml中调用execute方法而不是whateva –

+0

我尝试彻底删除方法wateva,并且得到相同的错误。然后我尝试从struts.xml调用execute。同样的错误 –

回答

2

您可以使用config-browser plugin。如果您想要在浏览器中查看配置以及如何将操作映射到URL,这会很有用。

其实,您使用convention-plugin的问题的原因。如果您将struts2-convention-plugin-2.3.x.jar置入WEB-INF/lib,则会使用它。安装后,它将扫描struts-plugin.xml中定义的软件包,并按照约定创建一个附加到struts.xml的配置。除了您的操作符合插件使用的规则,操作"hello"为类HelloAction创建,但不幸的是它没有结果"success"。要将此结果添加到该操作中,应在该类上使用@Result注释,或使用@ResultPath注释来指定可找到的结果的路径,而不是默认的WEB-INF/content。如果您应用struts.convention.result.path配置设置,也可以做同样的事情。

@Result(name = SUCCESS, location = "/hello.jsp") 

另外请注意,您在struts.xml的行动"hello"定义的映射少的意思,除非它映射到指定的方法。 JSP的名字假设为index.jsp

+0

非常感谢。我正在阅读进一步的配置浏览器和如何使用。我也删除了错字方法(wateva),但我仍然得到相同的错误。如果我想在我的课程中注释@Result,我应该在哪里添加注释?还有我的班级需要什么样的进口声明。谢谢! –

+0

您可以将它放在类或用于映射操作的方法上,也可以放在属性'results'的'@ Action'注释中,也可以放在'@ Results'注释体中。注释位于org.apache.struts2.convention包中。注释“,它与常规插件一起提供。 –

+0

也考虑进一步阅读第二个链接,有大量示例说明如何使用注释配置动作映射。 –

0

我想你错过了在HelloAction中编写方法“wateva”。因此,要么将其写入执行位置,要么将其从struts映射中移除。

<struts> 
<!-- Configuration for the default package. --> 
<package name="default" extends="struts-default"> 
    <action name="hello" class="com.manaar.action.HelloAction"> 
     <result name="success">/hello.jsp</result> 
    </action> 
</package> 
+0

我从struts映射中删除了wateva,但是这并没有解决问题 –