代码之家  ›  专栏  ›  技术社区  ›  James McMahon

对于struts中的ambigous通配符模式(在2.1.9版本之前),我可以使用什么解决方法?

  •  2
  • James McMahon  · 技术社区  · 15 年前

    在Struts中,我找不到合适的通配符模式来将我的URL部分提取到动作参数中。

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

    <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会给我提供regex匹配,但是当我超过2.0.8时,Struts的依赖关系和我的OSGi环境出现了问题,所以现在我想继续使用这个版本。

    2 回复  |  直到 13 年前
        1
  •  0
  •   doctrey    13 年前

    我认为Struts2通配符在这一点上还不够成熟。
    Here here 不要对更复杂的模式提供任何指导。但自从 ** 匹配所有内容 包括 斜杠,我猜是struts2将最后一个斜杠之前的所有内容都视为一个单元,因此将其设置为第一个占位符,并将最后一个通配符设置为第二个。这就是第三个占位符保持为空的原因。
    我建议您升级,因为Struts2.1+提供了模式匹配,这在您的案例中可能更有用。

        2
  •  0
  •   Guvante    15 年前

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

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

    我会反复检查以确保您在某种程度上请求您认为是的URL,或者查看是否有指定+(即非空结果)的方法。

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