如何映射 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 设置为 truestruts.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 中包含斜杠(通配符映射)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Url通配符映射

servlet 映射 url 模式上的双通配符 (*) 是啥意思?

这个 URL 在 Apache 中是如何映射的?

如何在过滤器映射中排除 url [重复]

在 AlamofireObjectMapper 响应中映射 allHeaderFields

如何将 URL 与 PHP 项目的目录结构映射 [重复]