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