4

我有一个包名

/cabinet/s

其中所有操作都返回 JSP 片段。

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

/cabinet/s/actionid/snippetgroup/filename.do
  • actionid - 动作类的标识符
  • snippetgroup - 特定功能的片段组标识符(这只是一个目录名称)
  • 文件名 - JSP 文件名
<action name="actionid/*/*" class="someclass">
   <result>/WEB-INF/jsp/{1}/{2}.jps</result>
</action>

问题是 Struts 从不调用正确的类。它总是错误地认为filename动作不存在。

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

4

3 回答 3

2

为了使它起作用,您需要在配置中设置struts.enable.SlashesInActionNamestotruestruts.mapper.alwaysSelectFullNamespaceto 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 中删除。

于 2014-03-12T13:15:15.230 回答
2

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

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

可能删除.do扩展,将其设置为空(或更好的逗号,以防止 Struts 将静态资源作为命名空间处理):

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

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

于 2014-03-12T13:15:50.727 回答
0

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

<action name="actionid/*/*" class="someclass"> 
   <param name="snipetgroup">{1}</param>
   <param name="filename">{2}</param>
   <result>/WEB-INF/jsp/${snipetgroup}/${filename}.jsp</result> 
</action>

这种技术在动作名称之后称为参数。注意,这个特性从 Struts 2.2.1 开始可用。应用后,您可以在 result 中使用动态参数

于 2014-03-12T14:22:50.657 回答