Как работает ValueStack в Struts2? - PullRequest
0 голосов
/ 15 апреля 2011

Рассмотрим следующий код.

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 ]

7 голосов
/ 15 апреля 2011

Я думаю, что вы путаете это: то, что 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 в верхнюю часть стека значений, которое захватывается во второй строке и печатается.

1 голос
/ 02 октября 2017

Стек значений

Стек значений используется Struts-2 для хранения важных объектов.Переменные ActionInstance и члены хранятся в стеке значений, и JSP может обращаться к нему через стек значений.

Примечание: Стек значений ведет себя как виртуальный объект.

Если дваПеременные-члены имеют одно и то же имя. Как стек значений обрабатывает конфликты? Стек значений получает запрос на переменные-члены, затем выполняет поиск от первого к последнему, если имя переменной-члена совпадает, и отправляет значение в JSP.Чтобы получить доступ к определенной переменной-члену, мы должны получить доступ к графу объектов или пройти через него.

...