如何映射 URL 中包含斜杠(通配符映射)[重复]
Posted
技术标签:
【中文标题】如何映射 URL 中包含斜杠(通配符映射)[重复]【英文标题】:How to map URL contains slash in action (Wildcard mapping) [duplicate] 【发布时间】:2014-04-16 15:18:40 【问题描述】:我有一个包名
/cabinet/s
所有动作都返回 JSP sn-ps。
以及下面此包的任何 URL 的其余路径
/cabinet/s/actionid/snippetgroup/filename.do
actionid - 动作类的标识符
sn-pgroup - 特定功能的 sn-ps 组标识符(这只是一个目录名称)
文件名 - JSP 文件名
<action name="actionid/*/*" class="someclass">
<result>/WEB-INF/jsp/1/2.jps</result>
</action>
问题是 Struts 从不调用正确的类。 filename
动作不存在总是报错。
Struts 应用程序配置为使用.do
扩展而不是.action
。
【问题讨论】:
.do
怎么样?您是否将 S2 配置为将其用作操作扩展?如果不是,则需要将其从 url 中删除。
@AleksandrM:将其添加到您的答案中...这种交叉评论很模糊;)
@AndreaLigios:是的。 :) 回答您之前的问题:扩展处理发生在解析命名空间等之前。所以我怀疑它是否适用于 .do
没有适当的配置。
是的。我确实将默认的 .action 扩展名覆盖为 .do
【参考方案1】:
你必须在struts.xml中设置这个选项according to the documentation:
<constant name="struts.enable.SlashesInActionNames" value="true"/>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
并且可能删除.do
扩展,将其设置为空(或更好的逗号,以防止Struts handling static resources as namespaces):
<constant name="struts.action.extension" value=","/>
否则,您可以使用正则表达式模式匹配器切换到Advanced Wildcards。
【讨论】:
貌似struts有很多常量。 这是仅有的两个Struts文档告诉你改变实现动作名称后的参数结果:) 请在保留 .do 扩展名之前尝试一下,然后来这里发布结果,我很想知道它是否有效 @AndreaLigios:如果没有这样配置,可能不会。【参考方案2】:为了使其工作,您需要在配置中将 struts.enable.SlashesInActionNames
设置为 true
和 struts.mapper.alwaysSelectFullNamespace
设置为 false
。
<constant name="struts.enable.SlashesInActionNames" value="true"/>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
您可能需要将结果更改为:
<result>/WEB-INF/jsp/1/2.jsp</result>
您是否也将 Struts2 配置为使用 .do
作为操作扩展?如果不是,则需要将其从 url 中删除。
【讨论】:
最初是绝对路径而不是相对路径。我修复了它。 @simar 你也应该支持这个答案,因为它在我的回答中说的基本相同,并且它是同时发布的......那么它是否与 .do 一起使用?【参考方案3】:问题是您使用了指定包的相对路径。但您应该使用绝对路径名。
<action name="actionid/*/*" class="someclass">
<param name="snipetgroup">1</param>
<param name="filename">2</param>
<result>/WEB-INF/jsp/$snipetgroup/$filename.jsp</result>
</action>
这种技术称为Parameters after the action name。注意,这个特性从 Struts 2.2.1 开始可用。申请后可以使用dynamic parameters in result。
【讨论】:
原来是绝对路径。我把它修好了。我在 struts 文档中看到了命名参数技术,但启用 SlashesInActionNames 常量对我来说并不重要 @simar 如果您编辑问题以从问题的答案中修复您的错误,这将无济于事,下次您最终将自己解决问题。 @simar 如果该行对您不重要,我可能会忽略,但您是否关注了该链接,您是否阅读过文档。你知道 SO 上禁止重复答案,那你为什么跟我说这行很重要? 我从第一个答案中解决了问题。编辑的目的是为下一个将在此页面上查看的人。由于没有一个人提出相同的指定问题,因此我决定自行清除问题,而不是在每个答案中添加 cmets。 我一开始确实读过文档。我在这里花了 2 个小时阅读 struts.apache.org/release/2.2.x/docs/wildcard-mappings.html 并尝试使用 struts.xml 的路径和配置。只有在我放弃之后,我才提出问题。我真的看不出如何从这个页面找到需要激活的常量。以上是关于如何映射 URL 中包含斜杠(通配符映射)[重复]的主要内容,如果未能解决你的问题,请参考以下文章
servlet 映射 url 模式上的双通配符 (*) 是啥意思?