2016-11-01 14 views
3

У меня есть страница .jsp, что делает следующую проверку, чтобы увидеть, если он должен отображать сообщение об ошибке:Распорка параметров не доступны в <s:if> теге

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

Параметр ошибки происходит от параметра запроса (т.е./MYPAGE .action? ошибки = 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, и этот код отлично работал с этой версией, так что либо это ошибка, либо что-то изменилось в том, как эти свойства доступны, о которых я не знаю.

+1

Если ошибка сохраняется в запросе на задней панели, то на jsp вы можете получить к ней доступ с помощью «# request.error» примерно так. – Will

+1

Это также может помочь http://stackoverflow.com/questions/40327981/struts-upgrade-to-2-5-5-from-2-5-3 –

+1

@AlirezaFattahi И его следует открыть. –

ответ

3

От короткого исследования, это может быть связано с Issue WW-4572, AKA рефакторинга менеджмента параметров, от Map из Objects к HttpParameter класса, содержащего Parameter объекты, входящие в комплект поставки версии 2.5.5.

Глядя на Parameter class, кажется, что это должно быть достаточно, чтобы вызвать атрибут value на ней, как:

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

Я надеюсь, что, но тем временем: попробуйте использовать более рамочных механизмов и меньше параметры запроса (например, использовать переменную ошибки с геттером и установщиком при базовом действии или даже лучше использовать actionErrors и fieldErrors для переноса сообщений и проверить их присутствие, чтобы обнаружить, когда произошла ошибка).

+0

Использование # parameters.value.error не работает, но я добавил переменную ошибки в действие и могу получить к ней доступ, используя , что, вероятно, ты упомянул. Я все еще думаю, что есть ошибка в том, как struts анализирует параметры, которые, вероятно, были введены [WW-4572] (https://issues.apache.org/jira/browse/WW-4572). – Richard

+0

В ответе была опечатка, можете ли вы попробовать с 'error.value' вместо' value.error'? –

+0

Нет, это тоже не работает. Кажется, он неправильно разбирает его из того, что я вижу в своем отладчике. Он может обращаться к HttpParameters в стек значений, но, похоже, он анализирует параметры и ошибку как отдельные имена полей и пытается найти их самостоятельно в стеке, поэтому вместо того, чтобы получать HttpParameters через поле параметров, а затем ищет ошибку в HttpParameters , он ищет поле ошибки в самом стеке значений (по крайней мере, это мое лучшее предположение о том, что он делает прямо сейчас). – Richard

3

Только в 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> 

Андреа прямо о причинах и об использовании параметров запроса ,

+0

Это сработало. Он должен быть указан на странице миграции на странице https://struts.apache.org/docs/struts-23-to-25-migration.html. – rveach

+0

@ rveach No. Это только для 2.5.5. –

 Смежные вопросы

  • Нет связанных вопросов^_^