Struts 参数无法在 <s:if> 标记中访问

Struts parameters not accessible in <s:if> tag

我有一个 .jsp 页面执行以下检查以查看是否应显示错误消息:

<s:if test="#parameters.error == 1">
    <ul><li>
        <s:text name="login.error"/>
    </li></ul>
</s:if>

错误参数来自请求参数(即/myPage.action?error=1)。

我已将 jsp 页面调试到 org.apache.struts2.views.jspComponentTagSupport.doStartTag() 方法中,从那里我可以访问 ValueStack 并看到 HttpParameters 对象确实包含一个 "error" 参数,我可以通过以下方式访问:

stack.getContext().get("parameters")).get("error")).getValue();

这将 return 一个值为 1 的字符串,如预期的那样。
但是,进一步调试代码似乎没有正确评估的测试属性<s:if> 标记。
ognl.ASTEq.getValueBody(OgnlContext, Object) 方法尝试获取已解析测试查询的 'children' 的值。
它以 ognl.OgnlRuntime.getFieldValue(OgnlContext, Object, String, boolean) 方法结束,该方法 return 是一个 NotFound 结果,即使 HttpParameters 包含它正在寻找的值 ("error")。

这似乎是 struts/ognl 中关于它如何解析值堆栈上的参数的错误,但我不确定。

我正在使用 Struts 2.5.5。最近从 Struts 2.3.x 升级,这段代码在那个版本 上运行良好,所以要么是错误,要么是我不知道这些属性的访问方式发生了变化。

根据简短的研究,这可能是由于 Issue WW-4572,也就是参数管理的重构,从 ObjectsMapHttpParameter class 包含 Parameter 个对象,附带版本 2.5.5.

Parameter class,好像调用value属性应该就够了,比如:

<s:if test="%{#parameters.error.value == 1}">

我希望是这样,但与此同时:尝试使用更多的框架机制和更少的请求参数(例如,在基本操作上使用带有 getter 和 setter 的错误变量,或者更好的是,使用 actionErrorsfieldErrors 来携带消息,并检查它们的存在以检测何时发生错误。

Struts 2.5.5.

如果要检查 error 参数的值,则:

<s:if test="#parameters.get('error').value == 1">
    <ul><li>
        <s:text name="login.error"/>
    </li></ul>
</s:if>

如果要检查参数是否存在:

<s:if test="#parameters.contains('error')">
</s:if>

Andrea 关于原因和使用请求参数的说法是正确的。