关于java:如何映射URL包含斜杠(通配符映射)

How to map URL contains slash in action (Wildcard mapping)

本问题已经有最佳答案,请猛点这里访问。

我有一个包裹名称

1
/cabinet/s

所有操作均返回JSP片段。

以及此包下面任何URL的其余路径

1
/cabinet/s/actionid/snippetgroup/filename.do
  • actionid-动作类的标识符
  • snippetgroup-某些功能的代码段组的标识符(这只是目录名称)
  • 文件名-JSP文件名
1
2
   <result>/WEB-INF/jsp/{1}/{2}.jps</result>
</action>

问题在于Struts从不调用正确的类。 filename操作不存在总是会出错。

Struts应用程序配置为使用.do扩展名而不是.action


您必须根据文档在struts.xml中设置此选项:

1
2
<constant name="struts.enable.SlashesInActionNames" value="true"/>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>

,并可能通过将.do扩展名设置为空(或者最好是逗号,以防止Struts将静态资源作为名称空间处理)来删除它:

1
<constant name="struts.action.extension" value=","/>

否则,您可以使用正则表达式模式匹配器切换到"高级通配符"。


要使其正常工作,您需要在配置中将struts.enable.SlashesInActionNames设置为true,将struts.mapper.alwaysSelectFullNamespace设置为false

1
2
<constant name="struts.enable.SlashesInActionNames" value="true"/>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>

您可能需要将结果更改为:

1
<result>/WEB-INF/jsp/{1}/{2}.jsp</result>

您是否已将Struts2配置为使用.do作为操作扩展?如果否,则需要将其从URL中删除。


问题是您使用了指向指定程序包的相对路径。但是您应该使用绝对路径名。

1
2
3
4
   <param name="snipetgroup">{1}</param>
   <param name="filename">{2}</param>
   <result>/WEB-INF/jsp/${snipetgroup}/${filename}.jsp</result>
</action>

此技术在动作名称后称为"参数"。注意,此功能自Struts 2.2.1起可用。一旦应用,就可以在结果中使用动态参数。