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,也就是参数管理的重构,从 Objects
的 Map
到 HttpParameter
class 包含 Parameter
个对象,附带版本 2.5.5.
看Parameter
class,好像调用value
属性应该就够了,比如:
<s:if test="%{#parameters.error.value == 1}">
我希望是这样,但与此同时:尝试使用更多的框架机制和更少的请求参数(例如,在基本操作上使用带有 getter 和 setter 的错误变量,或者更好的是,使用 actionErrors
和 fieldErrors
来携带消息,并检查它们的存在以检测何时发生错误。
仅 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 关于原因和使用请求参数的说法是正确的。
我有一个 .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,也就是参数管理的重构,从 Objects
的 Map
到 HttpParameter
class 包含 Parameter
个对象,附带版本 2.5.5.
看Parameter
class,好像调用value
属性应该就够了,比如:
<s:if test="%{#parameters.error.value == 1}">
我希望是这样,但与此同时:尝试使用更多的框架机制和更少的请求参数(例如,在基本操作上使用带有 getter 和 setter 的错误变量,或者更好的是,使用 actionErrors
和 fieldErrors
来携带消息,并检查它们的存在以检测何时发生错误。
仅 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 关于原因和使用请求参数的说法是正确的。