我可以在Struts中使用模糊的通配符模式(在​​v 2.1.9之前)使用什么解决方法?

时间:2009-11-16 13:03:34

标签: struts2 design-patterns wildcard

我在查找正确的通配符模式时遇到问题,无法将部分URL提取到Struts中的操作参数中。

这是我设置动作的方式。模式的目的是捕获最后两个路径元素,然后捕获可能在它们之前的所有内容。

<action name="**/*/*" class="com.example.ObjectAction">
  <param name="filter">{1}</param>
  <param name="type">{2}</param>
  <param name="id">{3}</param>
</action>

使用URL channels/123/transmissions/456调用它我得到以下结果(该操作只是在POJO上设置输入参数并将其作为XML返回):

<result>
    <filter>channels/123/transmissions</filter>
    <id/>
    <type>456</type>
</result>

应该是:

<result>
    <filter>channels/123</filter>
    <id>456</id>
    <type>transmissions</type>
</result>

现在,因为**匹配所有字符包括斜杠,我想我的模式允许多种方式匹配URL,Struts碰巧选择一个离开{{ 1}}空是否在某处定义了多个可能匹配的行为?我可以使模式不那么暧昧吗?有没有其他方法可以做到这一点?

我正在运行Struts 2.0.8。升级到2.1.9会给我正则表达式匹配,但是当我超过2.0.8时,我在使用Struts的依赖项和我的OSGi环境时遇到了麻烦,所以我现在想坚持使用该版本。

2 个答案:

答案 0 :(得分:0)

这是比结构特定的更一般的建议,但这里有。

如果您在URL中追加一个/(可以在测试结构中的某个位置自动完成),那么贪婪的结果将是您所看到的。

我会仔细检查以确保您以某种方式请求您认为自己的URL,或者查看是否有指定+的方式(也称为非空结果)

编辑:要回答整个问题,很难判断匹配是否贪婪,因为解析器通常会返回第一个“有效”结果,这可能相当于贪婪的结果,具体取决于你拥有的位置它

答案 1 :(得分:0)

我认为struts2通配符在那时还不够成熟 Herehere没有就更复杂的模式提供任何指导。但由于**匹配所有包括斜杠,我的猜测是struts2将所有内容都作为一个单元处理,因此将其设置为第一个占位符并将最后一个通配符设置为第二个。这就是第三个占位符保持为空的原因 我建议你升级,因为(你完全知道)struts 2.1+提供模式匹配,这对你的情况更有帮助。