1

我使用了 Struts2 Annotation

web.xml的是:

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

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

我的 JSP 是:

      <s:form action="test" method="post">
            <s:textfield name="id" label="Id"></s:textfield>        
            <s:submit value="Submit"></s:submit>
     </s:form>

我的课是:

      @Namespace("/")
      public class Test extends ActionSupport {

  private static final long serialVersionUID = 1L;

      @Action(value = "test", results = { @Result(name = "success", location =     "success.jsp") })
      public String input() {

         System.out.println("input call");
         return SUCCESS;
     }

 }

我收到错误:

HTTP Status 404 - There is no Action mapped for namespace / and action name test.

文件夹结构:

我的文件夹结构是

4

3 回答 3

3

请执行下列操作。

将您的测试操作放在一个名为“com.mydomain.action”的包中,第一部分可以是您想要的任何内容,但它必须以“.action”结尾,struts2-conventions 会选择您的操作。如果还有其他包,例如:“com.mydomain.action.here”,那么“action”后面的包将被解释为 struts2 命名空间。

请将“success.jsp”重命名为“test.jsp”并将其移动到:“/WEB-INF/content/test.jsp”,/WEB-INF/content 是默认命名空间中的操作将解析其视图的位置。对于 /here 包,视图需要放在 /WEB-INF/content/here 下

让我们重写您的测试操作以保持约定默认值:

public class Test extends ActionSupport {
   private static final long serialVersionUID = 1L;
   public String execute() {
         System.out.println("input call");
         return SUCCESS;
   }
 }

还有一点要注意。您可以调用您的视图 test-success.jsp 而不仅仅是测试。这是因为约定将首先查找一个视图,该视图具有从操作返回的字符串附加到操作名称,在本例中为测试。

同样,虽然类是驼峰式的: MyMagicTest 对这样一个动作类的 veiw 将是 my-magic-test.jsp

现在注释适合:

现在你知道你可以在没有 xml 或注释的情况下做很多事情......约定在需要时使用注释来覆盖默认值。您这样做是为了走捷径,因此注释表示例外情况。不要使用它们来定义开箱即用的约定。

有关约定的更多信息,请参阅:https ://cwiki.apache.org/WW/convention-plugin.html ,我强烈建议您全面阅读,以便了解许多可能的功能。

于 2013-03-02T08:02:11.547 回答
0

没有为命名空间“xxx”和操作名称“yyy”映射操作

对于刚开始使用 Struts2 的初学者在配置动作流时经常出现的错误。要消除此错误,您需要将 URL 正确映射到操作方法。

在 Struts2 中,每个动作肯定都映射到某个方法。但是您应该将显式映射到操作方法的操作与默认隐式映射到方法的操作区分开来execute()

URL 格式存在差异。如果您使用DMI,您可以在 URL 中使用感叹号映射方法名称,并将您发布到操作的方法分派。或者您可以使用如下方法属性

<s:submit value="Submit" method="input"/>    

如果您使用约定插件和注释,请确保您没有使用 XML 配置和注释双重配置您的操作。第一个优先并覆盖配置。因此,摆脱映射中的任何操作,struts.xml并在操作、方法和包上应用注释。

不幸的是,并非所有 IDE 都通过插件支持 Struts2 注释配置,但您仍然可以在单独的struts-xxx.xml配置中使用双重配置映射,您可以提供 IDE 但不包含在 mainstruts.xml .

于 2013-03-02T10:58:58.893 回答
0

我意识到这是一个老问题,但我最近遇到了这个问题并使用以下方法解决了它,所以我想我会在这里记录它。

我解决它的方法是将java类(在您的情况下为Test.java)放在名为“actions”的包下,而不是将其留在默认包中。

还要记得公开执行函数并删除 struts.xml。

于 2017-09-04T09:33:35.190 回答