今天初步学了一下Struct2的Action对象,在接近完成的时候,总是出现There is no Action mapped for namespace [/] and action name [userAction!add]的这个错误,排除了网上所说的(1)文件名拼写是否正确(2)URL地址是否正确(3)struts.xml放在了src文件夹下(4)struts.xml文件编写没有错误等等因素之后,如果你也是这样的情况的话,恭喜你,看到我的博客并按照我下面的极其简单的操作有百分之八十五以上的可能性即可解决此问题。(温馨提示:不想知道造成原因只想解决的问题朋友之间看最后面即可)
先来解释一下原因:
我使用的是struts2的2.3和2.5版本,这些问题也可能会在更高的版本中出现,造成这个问题的主要原因是DMI所致。
解释一下何为DMI?
所谓DMI:是Struts 2提供了这种包含多个处理逻辑的Action 处理方式,英文全称Dynamic Method Invocation,也叫作动态方法调用。通过动态请求Action 对象中的方法,可以实现对某一业务逻辑的处理。
那么DMI的处理方式有是如何呢?
DMI 处理方式是通过请求Action 对象中的一个具体的方法来实现动态的操作。具体说就是,在请求Action 的URL 地址后加上请求方法字符串,与Action 对象中的方法进行匹配。其中,Action 对象名称和方法之间用“!”隔开。即如果在struts.xml 文件中配置了名为userAction的Action ,为了请求add() 方法,请求方式应表示为“userAction!add ”。
那么DMI是如何造成此问题的呢?
是因为官方在发布版本的时候把DMI默认是关闭的!(这种东西不调查要上哪里知道去啊)
接下来言归正传!解决方法就是需要在struts.xml中加一句!(注意一下,得是在<struts></struts>里面加不然会报错哦~)
<constant name="struts.enable.DynamicMethodInvocation" value="true" /> 来打开动态方法调用。
接下来在即可进行动态调用,一切问题也都可以解决了!