некоторые основные вопросы, касающиеся стека значений в стойках 2? - PullRequest
0 голосов
/ 19 января 2012

Я новичок в стойке 2, хотя я работал над стойками 1.2. В одном из существующих файлов jsp проекта у меня есть следующий код:

<script type="text/javascript">
  var relationshipData = { // line1
    page : '<s:property value="displayPage" />', // line2
    records : '<s:property value="customerRelations.size" />', // line3
    rows : [ <s:iterator value="customerRelations" status="iterStatus"> // line4
      { id : '<s:property value="relationId" />', 
        cell : [ '<s:property value="relationDesc" escapeJavaScript="true" />' ] } <s:if test="!#iterStatus.last">,</s:if> //line5
        </s:iterator>] // line6
  };
</script>

Идет запрос CustomerRelationAction.java, который имеет метод getCustomerRelations() и getRelationId().

вот вопросы: -

  1. Я поставил точку останова в методе getCustomerRelations() .i вижу, что поток внутри этого метода четыре раза. Два раза в строке 3 и еще два раза в строке 4. Согласно моему пониманию, поток должен прийти только 1 раз, то есть в строке 3. Как только он завершает getCustomerRelations в строке 3, не следует помещать его значение в стек значений, чтобы он может ссылаться на него в следующий раз (на него снова ссылаются в строке 14)?

  2. getCustomerRelations() метод возвращает список CustomerRelationData объектов, где класс CustomerRelationData также содержит метод getRelationId(). Теперь в строке 5 мы ссылаемся на value = "ratioId в строке 5. В каком объекте (CustomerRelationAction.java или CustomerRelationData) будет вызван метод getRelationId ()? даже я не уверен, будет ли объект списка CustomerRelationData присутствовать в стеке значений или нет? Если да, то в какую строку он будет помещен в стек значений?

  3. Теперь итератор завершается в строке 6. После этого теперь я снова ссылаюсь на код <s:property value="relationId" />, На какой объект (CustomerRelationAction.java или CustomerRelationData), Будет вызываться метод getRelationId ()?

1 Ответ

2 голосов
/ 19 января 2012

1) Я не знаю, почему вы думаете, что вызов свойства customerRelations и затем использование customerRelations в теге итератора вызовет getCustomerRelations() только один раз; вы используете его дважды, поэтому, как минимум, он будет вызван дважды.

Если вы хотите сохранить ссылку на нее, используйте <s:set>, чтобы создать новую ссылку на коллекцию. Однако я не вижу смысла в этом, если только ваш добытчик не занимает много времени.

Я не вижу того же поведения. Учитывая фрагмент <script> вопроса, он рендерится таким образом (предполагая фиктивный трехэлементный список с образцами данных):

<script type="text/javascript">
  var relationshipData = { // line1
    records : '3', // line3
    rows : [  // line4
      { id : '1',
        cell : [ 'desc 1' ] } , //line5
       // line4
      { id : '2',
        cell : [ 'desc 2' ] } , //line5
       // line4
      { id : '3',
        cell : [ 'desc 3' ] }  //line5
      ] // line6
  };
</script>

И вывод журнала с оператором отладки в получателе:

2012-01-19 13:58:10,552 DEBUG [TextExampleAction.java:18] : Enter.
2012-01-19 13:58:10,571 DEBUG [TextExampleAction.java:18] : Enter.

Скорее всего, я поверю в JSP / JS / и т. Д. на данный момент.

2) Тег итератора помещает каждый объект на вершину стека, как описано в документе тег . Вершина стека - это первый объект, который будет использоваться для получения значения relationId. Если он не найден в верхней части стека, OGNL будет проходить по стеку значений, пока либо не будет найдено свойство, либо стека больше не будет.

3) См. Предыдущий ответ: как только вы вышли из итератора, в стеке больше нет отношения с клиентом, и вы вернулись к действию.

...