Как работает 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. Чтобы получить доступ к конкретной переменной-члену, мы должны получить доступ к графу объектов или пройти его.

Другие вопросы по тегам