Как изменить свойства области сеанса с помощью ognl?

Можно ли изменить свойства области сеанса с помощью ognl?

Например, если в моем сеансе есть атрибут с именем PROCESS_CONFIG, который является объектом с атрибутом name, как можно изменить этот атрибут name в JSP?

Я пробовал следующее, но это не работает:

<s:textfield value="%{#session.PROCESS_CONFIG.name}" id="PROCESSNAME" name="#session.PROCESS_CONFIG.name"/> 

Когда я отправляю форму и получаю доступ к объекту сеанса в своем действии через ServletActionContext.getRequest().getSession().getAttribute("PROCESS_CONFIG"), атрибут name не изменился.

ИЗМЕНИТЬ:

Объект, сохраненный в сеансе как PROCESS_CONFIG, представляет собой очень сложный сложный объект (состоящий из многочисленных ссылок на другие объекты со списками списков объектов), и, на мой взгляд, я просто хочу представить очень маленькое подмножество. его атрибутов (включая атрибуты из его составных объектов). Таким образом, загрязнять мой JSP всеми другими полями как скрытыми нецелесообразно! Рассматриваемое представление представляет собой форму, в которой можно изменить значение этих полей, и я хотел бы напрямую и автоматически обновить объект, сохраненный в моем сеансе struts 2, PROCESS_CONFIG, как если бы объект PROCESS_CONFIG был свойством моего действия. Например, учитывая предыдущий фрагмент кода, PROCESSNAME является атрибутом объекта PROCESS_CONFIG, и я хотел бы автоматически обновлять его в объекте PROCESS_CONFIG вместо того, чтобы иметь свойство PROCESSNAME в моем действии, а затем явно выполнять настройку PROCESSNAME в моем объекте PROCESS_CONFIG .


person Community    schedule 01.02.2013    source источник
comment
Независимо от того, можете ли вы это сделать, я не уверен, что вам следует это делать: уровень просмотра предназначен для просмотра, а уровень Java — для логики. Каков вариант использования?   -  person Dave Newton    schedule 01.02.2013
comment
Соглашаясь с Дэйвом, мне было бы любопытно узнать ваше требование, которое заставляет вас делать это из jsp?   -  person chad    schedule 01.02.2013
comment
Независимо от того, что это хорошая идея, очевидно, что стоит попробовать присваивание со знаком равенства, что, кстати, работает. Если вам нужен до боли очевидный пример, см.: commons.apache.org/ognl/language-guide .html и найдите на странице рабочее задание, если вам нужно новое значение на карте, это тоже следует указать там. Хорошим советом будет прочитать всю страницу сверху вниз, а затем следовать рекомендациям и использовать ТОЛЬКО поиск свойств и оценку логических выражений с использованием OGNL.   -  person Quaternion    schedule 01.02.2013
comment
Спасибо за ваши ответы. Я отредактировал свой пост, и я надеюсь, что он проясняет мою проблему. По сути, моя идея состоит в том, чтобы избежать необходимости выполнять сантехнику в моем действии по получению атрибутов из свойств, а затем устанавливать их для моего объекта с областью действия сеанса struts 2.   -  person    schedule 02.02.2013
comment
@theeDude Это на самом деле не объясняет, почему вы хотите сделать это на уровне представления: представление объектов из сеанса не имеет ничего общего с настройкой значений сеанса.   -  person Dave Newton    schedule 02.02.2013
comment
@DaveNewton Хорошо, вы заставили меня задуматься немного дальше, и я думаю, что понял вашу точку зрения.. Я совершенно забыл о методе подготовки.. Я не могу попробовать это прямо сейчас, поэтому я спрашиваю: если в моем действии у меня есть свойство скажем, процесс, и если в методе подготовки я назначу эту переменную объекту в PROCESS_CONFIG, и если, на мой взгляд, у меня будет ‹s:textfield value= name=process.name/›, это сработает, верно? Я имею в виду, что в моем действии свойство процесса будет иметь измененное имя атрибута, а другие атрибуты будут заполнены так, как они есть в моем объекте PROCESS_CONFIG, верно?   -  person    schedule 02.02.2013
comment
@theeDude Я вообще не понимаю ваш последний комментарий, есть большая разница между изменением имени свойства (я не думаю, что вы когда-либо должны пытаться изменить имена свойств в своем действии) и установкой значения свойства (что-то очень разумное). Объясните, что вы пытаетесь сделать и какой результат вы хотите, мы можем помочь оттуда.   -  person Quaternion    schedule 03.02.2013
comment
@Quaternion Я не знаю, откуда вы взяли, что я хочу изменить имена свойств. Конечно, это абсурд. Все, что я когда-либо говорил, это то, что я хотел представить значения некоторых атрибутов объекта PROCESS_CONFIG в форме (представлении) и, в результате отправки этой формы, изменить значения соответствующих атрибутов в моем объекте PROCESS_CONFIG, как если бы это объект был свойством действия, то есть мне не нужно было явно выполнять сантехнику, вызывая соответствующие установщики атрибутов объекта PROCESS_CONFIG в моем методе действия. Это теперь ясно?   -  person    schedule 03.02.2013
comment
Ну, я думал, что здесь только одна проблема с использованием сеанса, но это также проблема привязки, в форме S2 поля привязаны к атрибутам действия по имени, а не по значению.   -  person Roman C    schedule 04.02.2013


Ответы (1)


Сеанс в S2 — это карта, на которую вы можете поместить атрибуты, прежде чем использовать их с OGNL в JSP. Чтобы это обойти, позвольте вашему действию реализовать SessionAware и посмотрите официальный сайт для получения описания и использования, а также прочитайте Как получить доступ к сеансу из часто задаваемых вопросов.

На ваш вопрос: почему вы не получили атрибут в JSP. Потому что вы используете S2 и OGNL для его получения (через ссылку #session) и не поместили атрибут в сеанс S2. Реализация сеанса S2 отличается от стандартного сеанса http. Однако, если вы установите атрибут для стандартного сеанса http, вы все равно сможете получить к нему доступ в формате JSP 2.0. Обратное тоже верно.

person Roman C    schedule 01.02.2013