这两天在学struts2应付考试时遇到了一个令我怀疑人生的bug。那就是访问action的方法时提示There is no Action mapped for action name XX的错误信息。我检查了struts.xml的文件名、存放的位置(我是使用maven搭建所以位置在resources下,若不用maven应该放在src下),继承的package为struts-default。完全找不到是因为自己的配置出的错,莫名其妙。
首先我说一下我最开始对于错误的分析。因为是使用maven搭建的开发环境,于是本着什么东西都是高版本的爽歪歪的思想,jdk要配置1.8的,什么jar包都去中央仓库找最新版本的坐标,我严重怀疑是因为我使用了struts2.5.22的最新版本导致我报的错,查阅资料后发现不是这个问题。
但是我发现当我把
namespace="test"
的属性去掉后,我的网页竟然成功跳转了!
于是我认真的去看了有关struts2命名空间namespace和访问路径的关系,以下是我对于namespace的理解。
比如我的struts.xml配置文件中一个action配置如下:
/welcome.jsp
那么我直接可以通过 http://localhost:8080/struts2/login.action进行访问,这个的访问过程是这样的,在没有定义namespace的时候,由于在struts中,我们的package继承了struts-default,也就拥有了struts的根空间,在这里我们没有指明namespace属性,但其实此时我们的namespace属性相当于namespace="",或者namespace="/"。由于我们没有指定命名空间,struts直接在根空间中寻找name=testMap的action,根空间有这个action,所以我们能访问。
假设配置文件中action配置中加入了namespace属性值,如下:
/welcome.jsp
那么我们必须通过http://localhost:8080/struts2/test/login.action这个路径进行访问,如果再用http://localhost:8080/struts2/login.action或其他路径,就会出现异常。因为此时struts首先在命名空间为test中寻找,如果没有找到,会继续在根空间寻找,而现在根空间已经没有名为login的action了。
在理解了以上知识后,我发现原来是因为我将namespace的值写错了,namespace="test" 的test的前面应该加上/,也就是/test,这个问题非常的小,但是却牵扯出了我在学习中非常多的问题,因为篇幅的问题我就不细细分享了,总之,我愿称之为一条斜杠引发的血案。



