Struts2的Convention插件导致”No result defined for action”

Convention插件自动注册Action的功能让我们从struts.xml配置的繁杂工作中解放出来,但有时候也能带来一些麻烦。出现”No result defined for action”错误就是其中之一。

比如我们在struts.xml中定义了一个名为logout的action,…action.LogoutAction是其实现类,这时Convention就会试图帮我们注册一个名叫logout的action,并搜索对应的jsp文件注册为result;如果xml文件和convention搜索出来的action重名,其缺省的原则是覆盖xml文件中的配置,这样我们原来在xml中定义的名为logout的action的result就没有了,于是出现了”No result defined for action”的错误。

在我们不了解这个原则的时候一定很诧异:我明明定义了result,为什么报错说没有呢?其实就是被convention自动覆盖了。当我们知道了这个原则之后,就可以想办法避免了,首先xml定义action名字的时候避免和convention映射生成的action名字重复(需先了解convention的映射原则),convention是机械化的映射,而我们在xml文件中配置的aciton名字是可以根据需要进行修改的;其次如果可以的话,按convention的命名要求定义好jsp文件放到convention的result搜索路径中,这样convention就会自动注册result,不会再出现本文标题所示的错误了。

多说一句,如何查看convention注册的action呢?答案是:struts2-config-browser-plugin,安装很简单,只需要复制到WEB-INF/lib中即可,使用也很简单,访问项目路径的/config-browser/子目录即可,当然了,这个插件并不是为convention设计的,它能显示所有在struts中注册的action,无论是否由convention注册。

该插件的界面下图所示: