先上配置:
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.ognl.allowStaticMethodAccess" value="true" />
<constant name="struts.devMode" value="true" />
<constant name="struts.serve.static.browserCache" value="false" />
<constant name="struts.i18n.encoding" value="UTF-8" />
<constant name="struts.locale" value="zh_CN" />
<constant name="struts.custom.i18n.resources" value="lang" />
<package name="404" extends="struts-default">
<default-action-ref name="notfound"></default-action-ref>
<action name="notfound">
<result>/not_found.html</result>
</action>
</package>
<package name="root" namespace="/" extends="struts-default">
<action name="" class="index">
<result>/index.jsp</result>
</action>
<action name="index" class="index">
<result>/index.jsp</result>
</action>
</package>
</struts>
项目目录名是home,所以正常首页访问地址是 http://localhost:8080/home/index ,打开显示正常
而且输入一个不存在的地址 http://localhost:8080/home/xxoo 时,也如我所愿正常打开了 not_found.html 页面
但是问题来了,我发现输入一个不存在的地址 http://localhost:8080/home/xyz/index ,还是会打开我的 index.jsp 页面,只不过所有的图片、css文件资源位置都指向了 xyz 这个根本不存在的目录,按我想的应该会引导向 /not_found.html 才对吧
而且打开 http://localhost:8080/home/xyz/xxoo 的话,确实是导向了 not_found.html 页面,但是这页面上的资源也都跟上面一样指向了 xyz 这个目录,我的资源写法都是这样写的:<img src="image/not_found.jpg" /> ,应该这样写法没什么问题吧,实际上的资源地址变成了 http://localhost:8080/home/xyz/image/not_found.jpg ,求解啊!!怎么让用户输入不存在的package namespace的时候也返回根目录的 not_found.html 页面啊??
------解决思路----------------------
出现这个问题,说明你还没有理解struts2中action的搜索顺序啊,多看看基础吧!!!
你的URL是:http://localhost:8080/home/xyz/index
根据action的搜索顺序,首先查找是否存在命名空间为"/xyz"的package,如果不存在,则向上一级查找,即查找是否存在命名空间为"/"的package,同理如果没有找到这个包,那么再向上一级也就是查找命名空间为""或者不带命名空间参数的包,如果还不存在的话就提示action不存在。
这里虽然不存在命名空间为"/xyz"的包,但是往上一级查找的时候找到了命名空间为"/"的包,并且该包下存在名称为"index"的action,所以根据配置文件服务器内部转发到了你的index.jsp文件!
真挚回答,希望给分,有问题再探讨!