2

我在寻找正确的通配符模式以将我的部分 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 恰好选择了一种id留空的方式。是否在某处定义了多个可能匹配的行为?我可以使模式不那么模棱两可吗?有没有其他方法可以做到这一点?

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

4

2 回答 2

0

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

如果你在 URL 上附加一个 / (这可以在你的测试结构中的某个时候自动完成),那么贪婪的结果就是你所看到的。

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

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

于 2009-11-16T19:01:12.837 回答
0

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

于 2011-07-21T11:25:24.237 回答