2012-06-27 4 views
1

В моем JSP у меня есть:struts2 OGNL выражение

<s:textarea name="${param.objId}"/> 

Это делает следующее:

<textarea name="categoryObject.linkAttrValue[#ddAttr.id].link.id" 
    cols="" rows="" 
    id="browseCategoryObject_categoryObject_linkAttrValue_#ddAttr_id__link_id">7</textarea> 

Кроме того, у меня есть свойство тег:

<s:property value="${param.objId}"/> 

, который визуализирует:

7 

Наконец, представить тег:

<s:submit action="addRepeatingCategoryObject" value="addNew" 
    onclick="$('input[name=ddRepeatingAttrId]').val(%{#${param.objId}}); alert(%{#${param.objId}}); $('input[name=ddRepeatingAttrId]').val(%{#${param.innerDdAttr}.id}); " /> 

, который визуализирует:

<input type="submit" id="browseCategoryObject_addRepeatingCategoryObject" 
     name="action:addRepeatingCategoryObject" value="addNew" 
     onclick="$('input[name=ddRepeatingAttrId]').val(); alert(); $('input[name=ddRepeatingAttrId]').val(4); "/> 

Expression %{#${param.innerDdAttr}.id} разрешен в s:submit, но %{#${param.objId}} не разрешенный в s:submit, но разрешенный в s:property и s:textarea.

У кого-нибудь есть идея, почему он работает таким образом?


Я попытался %{${param.objId}} вместо %{#${param.objId}}, и она работала.

Но я не могу объяснить, почему это работает ...

+0

Действительно ли это ваш обработчик onclick? Пожалуйста, подумайте о том, чтобы переместить его из тега - это невозможно прочитать. –

+0

Привет, вам не кажется, что это может быть конфликт jquery? если вам нужен какой-то удаленный контент в вашей jquery-функции, я могу попробовать вместо $ {} – Jaiwo99

+0

@ Jaiwo99 No; JSP EL оценивается на стороне сервера. –

ответ

0

Без проверив его, я думаю, что следующее объяснение должно помочь:

Учитывая, что в OGNL %{} ускользает выражение OGNL, применяется следующее :

В OGNL у вас есть выражение #beanName или ${beanName}, чтобы получить значение компонента beanName из корневого контекста. Если вы выполните следующие действия: #${beanName}, вы сначала просмотрите имя компонента и затем используйте эту строку для поиска значения в корневом контексте OGNL.

Так, #${param.innerDdAttr}.id, происходит следующее:

  • Посмотрите param в OGNL контексты
  • Получить значение innerDdAttr собственности (которая предположительно даст вам значение «ddRepeatingAttrId»)
  • Это означает, что #${param.innerDdAttr}.id будет решать #ddRepeatingAttrId.id, так тогда
  • Посмотрите ddRepeatingAttrId в контексте OGNL
  • Получите значение свойства id (которое дает вам значение «4»).

В отличие от этого, для #${param.objId} что случается:

  • Посмотрите param в OGNL контексты
  • Получить значение objId собственности (который предположительно будет вам значение "7")
  • Это означает, что #${param.innerDdAttr}.id будет решать #7, так тогда
  • Посмотрите 7 в контексте OGNL, что лань не найдешь ничего, поэтому ничего не печатает.

ИМХО, вместо %{#${param.objId}}, вы, вероятно, хотите %{#param.objId} или просто %{param.objId} (разница в том, что с # он будет рассматривать только корневой контекст, в противном случае поиск контекста OGNL).

Надеюсь, что это поможет.

+0

Спасибо за вашу заметку. Но $ {param.objId} разрешен как categoryObject.linkAttrValue [# ddAttr.id] .link.id не как 7 (он генерируется простым $ { param.objId} jsp text). Я передал objId как параметр в jsp: include. – sanek

+0

Справедливая точка зрения, но я все же думаю, что проблема, скорее всего, связана с использованием '# $ {...}'. – beny23

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