Есть ли способ связать OGNL с тегами пользовательского интерфейса Struts2?

Я разрабатываю веб-приложение, используя Struts2. Раньше я работал со Struts1

есть ли способ сослаться на объект сеанса непосредственно в JSP, чтобы, если я изменю значение в формуле, значение в указанном объекте сеанса также было обновлено.

<s:textfield name="%{#session.order.amount}"/>

например У меня есть порядок объекта сеанса, который имеет количество атрибутов с геттером и сеттером.

похоже, что после того, как я поместил некоторые значения в textfield, а затем отправил страницу, значение в сеансе не обновилось.

в настоящее время я использую другой подход, который включает session.put() внутри установщика атрибутов действия. Лично мне не нравится мое текущее решение.


person raito    schedule 14.08.2013    source источник


Ответы (2)


Вы можете попробовать использовать в качестве имени string session.order.amount и сделать так, чтобы ваше действие реализовало SessionAware и открыло сеанс. В настоящее время вы устанавливаете имя на значение session.order.amount.

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

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

person Dave Newton    schedule 14.08.2013
comment
спасибо за ваш ответ, я мог получить значения из сеанса, используя синтаксис OGNL, который я написал в своем первоначальном сообщении. но почему-то он не будет устанавливать значение из в сеанс. Я предполагаю, что struts2 делает клонированную копию значения вместо того, чтобы ссылаться на объект из сеанса. - person raito; 15.08.2013
comment
@raito Я серьезно сомневаюсь, что из этого получится клон, но я без проблем верю, что это не сработало, и это хорошо - это ужасная практика. Жуткое действие на расстоянии следует оставить квантовой физике. - person Dave Newton; 12.09.2013

Из Struts1, где компонент формы помещен в область сеанса по умолчанию или просто путем установки значения атрибута scope="session", и все было хорошо.

В Struts2 у вас нет ни компонентов формы, ни компонентов сеанса. И чтобы использовать bean-компоненты на уровне сеанса, вам нужно либо реализовать его самостоятельно, либо использовать другие фреймворки, такие как Spring, Guice или CDI, где на уровне сеанса реализован и доступен пользователю.

С другой стороны, Struts2 интенсивно использует перехватчики, которые предоставляют вам дополнительные функции, такие как scope перехватчик или scopedModelDriven перехватчик, который позволяет поместить некоторые свойства действия в область действия сеанса. Он будет инициализировать свойства каждый раз, когда действие выполняется, ссылаясь на объекты, помещаемые в область сеанса.

Без этих вспомогательных перехватчиков вы всегда могли бы перехватить объект сеанса, реализовав SessionAware (см. Как получить доступ к сеансу) и где-то инициализировать свойства при выполнении действия, т.е. prepare(), потому что он появляется после внедрения карты сеанса. Помещать инициализатор в аксессоры - плохая идея.

person Roman C    schedule 14.08.2013
comment
спасибо за ваш ответ, однако мы не планируем использовать другой фреймворк. Использование перехватчика для извлечения значений из действия и помещения его в сессию уже рассматривалось, но оно по-прежнему связано с двойной работой. - person raito; 15.08.2013
comment
@raito Другие фреймворки, упомянутые выше, интегрированы в Struts2 через плагины, это просто разумное расширение. Но если вы строго придерживаетесь Struts2, вы можете найти это решение как вариант. - person Roman C; 15.08.2013
comment
Как упомянул Дейв, все, что вам нужно, — это SessionAware, вы наверняка сможете добавлять и изменять атрибуты сеанса таким образом. - person Quaternion; 16.08.2013
comment
@Quaternion, вы также можете получить доступ к переменной сеанса через ServletActionContext. Кстати, наше решение atm помещает объект в сеанс в установщике - person raito; 12.09.2013
comment
@ratio Вы можете, но это снижает возможность тестирования, и рекомендуется использовать SessionAware. - person Dave Newton; 12.09.2013