【问题标题】:How to map URL contains slash in action (Wildcard mapping) [duplicate]如何映射 URL 中包含斜杠(通配符映射)[重复]
【发布时间】: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

标签: java configuration struts2 url-parameters wildcard-mapping


【解决方案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 的路径和配置。只有在我放弃之后,我才提出问题。我真的看不出如何从这个页面找到需要激活的常量。
猜你喜欢
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
  • 2012-07-18
  • 2011-05-21
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多