Условное выражение в JSP с тегом Struts2

Я поддерживаю старое приложение, разработанное с помощью Struts2.

Я обновил библиотеку Struts2 с 2.3.19 до 2.3.24.

Я развертываю Tomcat 8 с jdk8.

В JSP у меня есть эти условия, которые отлично работают со старой библиотекой Struts2, jdk 7 и Tomcat 7)

<s:if test='%{current.getClass().name == "com.mycompany.myapp.MyCalss1"}'>
  <div>Class1</div>
</s:if>
<s:if test='%{current.getClass().name == "com.mycompany.myapp.MyCalss2"}'>
  <div>Class2</div>
</s:if>

Что-нибудь изменилось с struts 2.3.19 на 2.3.24? или jdk8, Tomcat 8?

Когда я добавляю <s:property value="%{ficheCourante}"></s:property> в JSP, он показывает com.mycompany.myapp.MyCalss2@46e9d4ac.


person GUISSOUMA Issam    schedule 22.03.2016    source источник
comment
Извлечение класса current.getClass() в jsp больше не разрешено из соображений безопасности. Создайте метод и сравните там.   -  person Aleksandr M    schedule 22.03.2016
comment
Он используется на нескольких страницах приложения, какие-нибудь советы по рефакторингу?   -  person GUISSOUMA Issam    schedule 22.03.2016
comment
Вы можете создать какое-то базовое действие с помощью этого метода и заменить все в jsp.   -  person Aleksandr M    schedule 22.03.2016
comment
@GUISSOUMAIssam Иногда вам нужно прочитать примечания к выпуску, особенно перед обновлением до новой версии.   -  person Roman C    schedule 22.03.2016


Ответы (1)


Извлечение класса (т.е. current.getClass()) в JSP больше не разрешено по соображениям безопасности . Создайте метод в своем классе действий и выполните сравнение там. В JSP вы можете назвать это как-то так.

<s:if test="compareCurrentClass('com.mycompany.myapp.MyCalss1')">

Или, если вам нужно передать экземпляр current для сравнения, тогда:

<s:if test="compareCurrentClass(current, 'com.mycompany.myapp.MyCalss1')">

В этом случае объявите compareCurrentClass в своем действии как:

public boolean compareCurrentClass(Object current, String name)

Кстати, на данный момент последняя версия S2 — 2.3.28.

person Aleksandr M    schedule 22.03.2016
comment
Он используется на нескольких страницах приложения, какие-нибудь советы по рефакторингу? Как это сделать на расширенном всеми действиями BaseAction? - person GUISSOUMA Issam; 22.03.2016
comment
@GUISSOUMAIssam Да, вы можете определить этот метод в своем базовом действии, тогда все, что вам нужно сделать, это изменить свои jsp-ы. - person Aleksandr M; 22.03.2016
comment
Как я могу получить объект в базовом действии из jsp? - person GUISSOUMA Issam; 22.03.2016
comment
current - это личное поле в действии - person GUISSOUMA Issam; 22.03.2016
comment
имя поля и тип объекта варьируются от действия к другому - person GUISSOUMA Issam; 22.03.2016
comment
@GUISSOUMAIssam Ну, вы можете передать его методу как объект, а также compareCurrentClass(current, 'com.mycompany.myapp.MyCalss1'). - person Aleksandr M; 22.03.2016