Некоторые базовые запросы относительно стека значений в стойках 2?

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

<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(). Я вижу, поток идет четыре раза внутри этого метода. Два раза в строке 3 и еще два раза в строке 4. Насколько я понимаю, поток должен приходить только 1 раз, то есть в строке 3. После завершения getCustomerRelations в строке 3 не следует помещать его значение в стек значений, чтобы он мог ссылаться на это не время, когда на него ссылаются (как будто на него снова ссылаются в строке 14)?

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

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

1 ответ

Решение

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) Смотрите предыдущий ответ: как только вы выйдете из итератора, в стеке больше не будет отношений с клиентами, и вы вернетесь к действию.

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