Некоторые базовые запросы относительно стека значений в стойках 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()
,
вот вопросы:-
Я ставлю точку останова внутри метода
getCustomerRelations()
. Я вижу, поток идет четыре раза внутри этого метода. Два раза в строке 3 и еще два раза в строке 4. Насколько я понимаю, поток должен приходить только 1 раз, то есть в строке 3. После завершения getCustomerRelations в строке 3 не следует помещать его значение в стек значений, чтобы он мог ссылаться на это не время, когда на него ссылаются (как будто на него снова ссылаются в строке 14)?getCustomerRelations()
метод возвращает списокCustomerRelationData
объекты, гдеCustomerRelationData
класс также содержитgetRelationId()
method.Now в строке 5 мы ссылаемся на value="ratioId в строке 5. На каком объекте (CustomerRelationAction.java или CustomerRelationData) будет вызываться метод getRelationId()? даже я не уверен, что объект списка CustomerRelationData будет присутствовать в стек значений или нет? Если да, то в какую строку он будет помещен в стек значений?Теперь итератор завершается в строке 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) Смотрите предыдущий ответ: как только вы выйдете из итератора, в стеке больше не будет отношений с клиентами, и вы вернетесь к действию.