У меня есть страница .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
, как и ожидалось.
Однако при дальнейшей отладке кода кажется, что он неправильно оценивает тестовый атрибут тега <s:if>
.
Метод ognl.ASTEq.getValueBody(OgnlContext, Object)
пытается получить значение дочерних элементов проанализированного тестового запроса.
Она заканчивается методом ognl.OgnlRuntime.getFieldValue(OgnlContext, Object, String, boolean)
, который возвращает результат NotFound
, несмотря на то, что HttpParameters содержит искомое значение ("error"
).
Похоже, это ошибка в struts/ognl, связанная с анализом параметров в стеке значений, но я не уверен.
Я использую Struts 2.5.5. Недавно обновленный со Struts 2.3.x, и этот код отлично работал с этой версией, поэтому либо это ошибка, либо что-то изменилось в доступе к этим свойствам, о чем я не знаю.