【问题标题】:Struts 2 annotation issues in actionStruts 2 注释问题在行动
【发布时间】:2013-03-02 07:06:41
【问题描述】:

我用过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.

文件夹结构:

【问题讨论】:

  • 如果您有问题,最好告诉我们问题所在。对于初学者,您的项目中是否有 struts2-conventions-plugin jar?其次,您使用 maven 来处理依赖关系?
  • 是的,我有 struts2-conventions-plugin jar 并且我从过去 1 年开始研究 struts2 xml 基础,所以我对 struts2 xml 基础有所了解,但在注释中很重要
  • 这是新应用还是现有应用?
  • @RohitR.K.如果您为 Struts2 工作,为什么不使用它的功能?
  • 您还有问题吗?

标签: java jsp configuration struts2 struts2-convention-plugin


【解决方案1】:

执行以下操作。

将您的测试操作放在一个名为“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,我强烈建议您全面查看它,以便了解许多可能的功能。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      网址格式有所不同。如果您使用DMI,您可以在 URL 中使用感叹号映射方法名称,并将您发布的方法发送到操作。或者你可以使用下面的方法属性

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-11
        • 1970-01-01
        • 1970-01-01
        • 2015-10-21
        相关资源
        最近更新 更多