【问题标题】:Struts parameters not accessible in <s:if> tag<s:if> 标签中无法访问 Struts 参数
【发布时间】:2016-11-01 13:24:55
【问题描述】:

我有一个 .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 对象确实包含一个“错误”参数,我可以通过:

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

这将按预期返回值为1 的字符串。
但是,进一步调试代码似乎没有正确评估&lt;s:if&gt; 标记的测试属性。
ognl.ASTEq.getValueBody(OgnlContext, Object) 方法尝试获取已解析测试查询的“孩子”的值。
即使 HttpParameters 包含它正在寻找的值 ("error"),它也会在返回 NotFound 结果的 ognl.OgnlRuntime.getFieldValue(OgnlContext, Object, String, boolean) 方法中结束。

这似乎是 struts/ognl 中的一个错误,用于解析值堆栈上的参数,但我不确定。

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

【问题讨论】:

  • 如果错误保存在后端的请求中,那么在jsp上你可以用“#request.error”之类的东西来访问它。
  • @AlirezaFattahi 应该重新打开。
  • ...重新打开:)
  • @AndreaLigios,AleksandrM,感谢您重新打开!

标签: jsp struts2 ognl http-request-parameters struts-tags


【解决方案1】:

从一个简短的研究来看,这可能是由于 Issue WW-4572,也就是参数管理的重构,从 ObjectsMap 到包含 Parameter 对象的 HttpParameter 类,随版本 2.5.5.

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

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

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

【讨论】:

  • 使用 #parameters.value.error 不起作用,但我在操作上添加了一个错误变量,并且可以使用 ,正如你提到的那样,这可能会更好。我仍然认为 struts 如何解析 WW-4572 可能引入的参数存在错误。
  • 答案中有错字,请您尝试使用error.value 而不是value.error 吗?
  • 不,这也不起作用。从我在调试器中看到的内容似乎对其进行了错误的解析。它可以访问值堆栈上的 HttpParameters,但似乎它将参数和错误解析为单独的字段名称并尝试在堆栈上独立地找到它们,因此不是通过参数字段获取 HttpParameters 然后在 HttpParameters 中查找错误,它会在值堆栈本身上查找错误字段(至少这是我对它现在在做什么的最佳猜测)。
  • 我们开始 ;) +1 用于确定原因。
  • 请报告 JIRA 中的问题,它与 @AndreaLigios 提到的更改有关
【解决方案2】:

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 关于原因和使用请求参数是正确的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多