динамическое выражение struts ognl

Я потратил последние несколько часов, чтобы заставить выражение Struts работать так, как я хочу, но мне это не удалось.

Я хочу выполнить выражение OGNL из строки.

Например, у меня есть следующий код:

<s:push value="#row">

    alert('<s:property value="id + ' ' + id" />');

</s:push>

Это отлично работает, дважды давая мне идентификатор объекта.

Этот пример

<s:push value="#row">

    <s:set name="expr" value="id + ' ' + id"/>
    alert('<s:property value="%{#expr}" />');

</s:push>

тоже отлично работает.

Но теперь, если я создам метод в своем действии:

public String getTest() {

    return "id + ' ' + id";
}

и в JSP:

<s:set name="expr" value="getTest()"/>

<s:push value="#row">

    alert('<s:property value="%{#expr}" />');

</s:push>

Результат:

alert('id + ' ' + id'); 

который не работает из-за кавычек.

Но почему в моем последнем примере у меня значение String, а не оцениваемое выражение?

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


person user2810476    schedule 24.09.2013    source источник
comment
Но почему в моем последнем примере у меня значение String, а не оцениваемое выражение? Потому что это String.   -  person Aleksandr M    schedule 24.09.2013
comment
См. этот вопрос: stackoverflow.com/q/16712395/1700321.   -  person Aleksandr M    schedule 24.09.2013
comment
@AleksandrM: ты заставил меня плакать :D   -  person Andrea Ligios    schedule 24.09.2013
comment
Спасибо, Александр М! ‹s:property value=#attr[#expr] /› полностью решил проблему.   -  person user2810476    schedule 24.09.2013


Ответы (1)


Struts 2 по умолчанию экранирует ActionMessages.

Попробуйте <s:property value="%{#expr}" escape="false"/>

ОБНОВИТЬ

Пытаться

alert(<s:property value="%{#expr}" />);

Нет

alert('<s:property value="%{#expr}" />');
person PbxMan    schedule 24.09.2013
comment
У меня нет разницы при добавлении escape=false. - person user2810476; 24.09.2013
comment
это проблема Javascript, а не Java - person PbxMan; 24.09.2013
comment
Это, очевидно, не проблема, потому что s:property выполняется и заменяется значением. Меня не волнует, что Javascript не работает, я спрашиваю, почему s:property не заменяется тем же значением, что и во втором примере. - person user2810476; 24.09.2013
comment
Удаление кавычек JS в любом случае не имеет значения и будет работать только в том случае, если предупреждаемое значение гарантированно будет чем-то законным в JS без них. С кавычками выражение должно быть экранировано JS. - person Dave Newton; 24.09.2013