Tomcat在URL中添加,Struts无法获取正确的动作名称?
我有这个项目在Jetty工作正常,最近根据要求,我在Tomcat上测试它,但我发现了一个问题。
我们正在使用Struts2,并且动作映射定义为没有扩展名,例如http://www.somehost.com/projectname/home
当我将所有内容部署到Tomcat并访问上面的url时,我收到此错误:
"There is no Action mapped for namespace [/] and action name [home/]"
很明显Tomcat在url上添加了一个额外的/
,所以struts认为动作名称是home/
而不是home
。
如果我将动作配置从home
更改为home/
,它可以正常工作。 但是我不想用额外的/
更改每个动作映射,应该有更好的解决方案,任何人都可以帮助我吗?
这是我的动作配置:
home.default home
它是在/
package下配置的,当没有任何变化时,我得到了404,如果我在上面更改为:
home.default home
然后它工作。
Tomcat正在添加一个尾部斜杠,因为您请求了一个目录。 要将目录与具有相同名称的文件区分开来,Tomcat会添加尾部斜杠。 包括Jetty在内的其他Web服务器也毫无疑问地符合此规则。 否则他们将如何提供目录浏览和欢迎文件列表。 另一方面,Struts的Default Action Mapper解析URL以确定它的Action Mapping。 ActionMapper
接口也有不同的实现,可以为您的操作创建映射。 默认操作映射器使用最后一个斜杠将命名空间与操作名称分开。 还有一些配置可以在操作名称中看到斜杠,如果配置设置允许,则在匹配操作名称后确定命名空间。 如果将操作重命名为目录名以外的其他内容,则可以轻松解决问题。 请注意, 约定插件在处理未知操作时添加了一个尾部斜杠。
URL末尾的斜杠是您可以遵循以标准化URL的样式。 Struts可以处理带有斜杠和动作名称""
映射。 您还可以通过查看URL中的尾随斜杠来决定哪种样式更适合您- 哪种样式更受欢迎 。