我使用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.
文件夹结构:
答案 0 :(得分:3)
执行以下操作。
将您的Test操作放在一个名为“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而不仅仅是test。这是因为约定首先查看具有从附加到Action名称的操作返回的String的视图,在这种情况下是测试。
同样,虽然类是骆驼案例:MyMagicTest对这样一个动作类的看法是my-magic-test.jsp
现在注释适用于:
现在您知道在没有xml OR注释的情况下可以做很多事情...约定会在需要时使用注释来覆盖默认值。你这样做是为了采取捷径,因此注释表示一个例外情况。不要用它们来定义开箱即用的公约。
有关约定的更多信息,请参阅:https://cwiki.apache.org/WW/convention-plugin.html我强烈建议您完全查看,以便了解许多可能的功能。
答案 1 :(得分:0)
There is no Action mapped for namespace "xxx" and action name "yyy"
是初学者在配置操作流时开始使用Struts2的常见错误。要摆脱此错误,您需要将URL正确映射到操作方法。
在Struts2中,肯定每个动作都映射到某个方法。但是,您应该将显式映射到操作方法的操作与默认情况下隐式映射到方法execute()
的操作区分开来。
网址格式存在差异。如果使用DMI,则可以使用感叹号在URL中映射方法名称,并将发布的方法分派给操作。或者您可以使用下面的方法属性
<s:submit value="Submit" method="input"/>
如果您使用的是常规插件和注释,请确保您没有使用XML配置和注释双重配置您的操作。第一个优先级并覆盖配置。因此,摆脱struts.xml
中映射的任何操作,并对操作,方法和包应用注释。
不幸的是,并非所有IDE都通过插件支持Struts2注释配置,但是您仍然可以在单独的struts-xxx.xml
配置中使用双配置映射,您可以为IDE提供但不包括在主struts.xml
。
答案 2 :(得分:0)
我意识到这是一个老问题,但我最近遇到了这个问题并使用以下方法解决了它,所以我想我会在这里记录它。
我解决它的方法是将java类 - 在你的情况下放在Test.java中 - 放在名为&#34; actions&#34;的程序包中。而不是将其留在默认包中。
还记得将execute函数设为public并删除struts.xml。