2013-11-28 5 views
0

Я получил следующий код страницы JSP, которая использует рамку Struts2Struts2 передачи данных по-разном

<s:form id="crud" action="crudmerge" namespace="templates"> 
    <s:hidden name="crudMode" /> 
    <s:hidden name="item.id" />  
    ...  
    <s:if test="crudMode == 1">    
      ...    
    </s:if> 
    <s:else> 
     <s:if test="%{version != null}">     
      ...    
     </s:if> 
     <s:else>     
      ...    
     </s:else> 
    </s:else> 
</s:form> 

в классе действий, что приводит к этой странице JSP, есть следующие способы (в том числе другие): getCrudMode(), getItem(), а изделие имеет способ под названием getId().

Я понимаю, как struts2 будет использовать эти методы для заполнения тегов <s:hidden>. У меня возникли проблемы, однако с помощью следующей строки:

<s:if test="%{version != null}"> 

Во-первых, я думал, что это работает так же, как два других, и Struts2 бы запустить getVersion() метод класса действия. Однако нет поля, называемого version, и нет метода getVersion(). В JSP также нет знака переменной <s:set name="version">. Что может быть точкой этого кода? Нужны ли %{}?

Возможно, это устаревший код, который необходимо удалить, но я не уверен, какая разница между двумя первыми crudmode и item.id, а последняя %{version}.

ответ

1

В атрибуте test тега s:if не нужно ставить %{}. Эта аббревиатура используется для обозначения области выражения OGNL и удаления перед оценкой. Оценивая его поиск переменной version в valueStack. Объект действия находится на topvalueStack, поэтому, если он находит свойство с именем version, он выполнит getVersion(), чтобы вернуть результат. Если он не найдет version при действии, он будет продолжать поиск по всему valueStack, пока не найдет недвижимость с именем version. Более или как то же самое описано в documentation.

XWork имеет специальный OGNL PropertyAccessor, который будет автоматически искать на все записи в стеке (сверху вниз) до тех пор, пока не будет найден объекта недвижимости, которую вы ищете.

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