我在查找正确的通配符模式时遇到问题,无法将部分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环境时遇到了麻烦,所以我现在想坚持使用该版本。
答案 0 :(得分:0)
这是比结构特定的更一般的建议,但这里有。
如果您在URL中追加一个/(可以在测试结构中的某个位置自动完成),那么贪婪的结果将是您所看到的。
我会仔细检查以确保您以某种方式请求您认为自己的URL,或者查看是否有指定+的方式(也称为非空结果)
编辑:要回答整个问题,很难判断匹配是否贪婪,因为解析器通常会返回第一个“有效”结果,这可能相当于贪婪的结果,具体取决于你拥有的位置它答案 1 :(得分:0)