Как работает ValueStack в Struts2?
Рассмотрим следующий код.
public class SampleAction {
private String[] sampleArray1 = new String[]{"item1","item2","item3"};
private String[] sampleArray2 = new String[]{"a","b","c"};
private List lst = new ArrayList();
lst.add(1)
lst.add(2)
//Getters and setters
}
Теперь, какой из приведенных выше атрибутов будет в стеке значений, когда мы попытаемся получить к нему доступ в JSP? Работает ли он как обычный стек, т. Е. Продолжает выдвигать любой атрибут, который читает?
2 ответа
Я думаю, что вы путаете это: Struts2 помещает в стек не свойства, а объекты, которые содержат эти свойства.
Пусть говорят в вашем JSP вы пишете
<s:property value="xxx" />
Затем Struts2 выполнит итерацию в вашем стеке, чтобы найти объект со свойством xxx
класс, который имеет публичный метод getXxx()
, И Struts2 помещает ваше текущее действие (экземпляр SampleAction
) в верхней части стека. Итак, он сначала будет искать SampleAction.getXxx()
Метод - если не найден, он будет смотреть дальше вниз по стеку. (на самом деле вы можете поместить другие объекты в стек выше Action - возможно, в том же jps - но пусть это будет просто).
Тогда в вашем примере все sampleArray1 sampleArray2 lst
(если у них есть публичные геттеры) будут доступны в jsp. Но это не так sampleArray1
находится "в стеке" (даже меньше его элементов!), действие находится в стеке.
Так, например, вы можете написать:
<s:iterator value="sampleArray1">
<p>item is: <s:property/></p>
</s:iterator>
Здесь, в первой строке sampleArray1
свойство найдено в действии, которое находится в стеке. Затем тег итератора помещает каждое значение в sampleArray1 в верхнюю часть стека значений, которое захватывается во второй строке и печатается.
Стек значений
Стек значений используется Struts-2 для хранения важных объектов. Переменные ActionInstance и члены хранятся в стеке значений, и JSP может получить к нему доступ через стек значений.
Примечание. Стек значений ведет себя как виртуальный объект.
Если две переменные-члены имеют одинаковые имена, как стек значений обрабатывает конфликты? Стек значений получает запрос на переменные-члены, затем выполняет поиск от первого до последнего, если имя переменной-члена совпадает, и отправляет значение в JSP. Чтобы получить доступ к конкретной переменной-члену, мы должны получить доступ к графу объектов или пройти его.