2015-02-26 2 views
0

Основываясь на том, что я исследовал, я видел, что теги, такие как <s:set>, <s:push> или создавая <s:bean>, могут вставлять ссылки непосредственно на ActionContext или ValueStack. Это меня очень смущает, потому что у вас не может быть только одного выделенного места для хранения всего? Вероятно, просто поместите все в ActionContext, поскольку он в основном действует как ServletContext.Какова цель хранения объектов непосредственно в ValueStack/ActionContext?

Чтобы сделать его еще более запутанной, если вы хотите получить доступ к значениям в ValueStack, вы должны будете использовать Struts теги, такие как <s:property>, но если значение просто хранится в ActionContext, вы просто использовать #value префикс предоставленный OGNL.

Может кто-то прояснит это для меня? Когда я использовал Spring, я считаю, что все, что мне нужно (запрос, сеанс, applicationContext), находилось внутри ServletContext и для доступа к этим значениям на моей веб-странице, я мог бы просто использовать префикс $ для доступа к чему-либо в контексте.

+0

1. * одно специализированное место для хранения всего * - Одна из вещей, о которых стоит подумать, - это «область». Зачем объявлять локальные переменные в методе? 2. * используйте префикс #value * - Неясно, что вы имеете в виду. 3. Вы все равно можете использовать '$' с S2. 4. Просто используйте то, что вам нужно, и если что-то не работает, задайте конкретный вопрос. –

+0

Struts1, Spring MVC и т. Д. - все каркасы Push-MVC. Struts2 - Pull-MVC @Miguel. Вы не вставляете значения в запрос, вы помещаете их в ValueStack, а затем вытаскиваете из JSP с помощью OGNL, JSTL или что-то еще. На самом деле ValueStack - это умная вещь по сравнению с другими фреймворками. –

+0

Вы можете использовать '$' для доступа (большинство) всего в S2. Причина «почему» заключается в том, что именно так решили разработчики WebWork. И нет, вам не нужно * использовать теги S2 для доступа к значениям стека. В стеке значений есть две области: сам стек и именованные элементы в контексте.Так оно и есть. Стек хороша для слоев. –

ответ

0

Каждое место имеет свое выделенное хранилище, в котором вы можете поместить свои объекты для последующего использования/получения, перейдя через некоторый контекст вызова. Независимо от того, какой контекст работает, фреймворк связан. Контекст - это способ связи между облачными объектами внутри него, к которым вы можете получить доступ, используя Java или другой язык выражений (EL), например OGNL.

В OGNL контекст действия представляет собой контекст OGNL, а стек значений - это корень.

Структура задает контекст OGNL быть нашим ActionContext, и стек значения будет OGNL корневого объекта. (Столбец значений представляет собой набор из нескольких объектов, но для OGNL он представляет собой единственный объект.) Вдоль со стеком значений структура размещает другие объекты в объекте ActionContext , включая Карты, представляющие приложение, сеанс, и контексты запроса. Эти объекты сосуществуют в ActionContext, наряду со стеком значений (наш корень OGNL).

ActionContextThreadLocal, поэтому вы можете использовать его в одном потоке. Лучший способ получить контекст/значение действия из этого потока - использовать статический метод.

ActionContxt ctx = ActionContext.getContext(); 
ValueStack vs = ctx.getValueStack(); 

Перехватчики также имеют переданный параметр, известный как контекст вызова, который является контекстом действия.

В стеке значений также есть свой собственный контекст, валидация имеет свой собственный контекст. Таким образом, эти определения никогда не заканчиваются.

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