我是Strut 2的新手虽然我已经开发过struts 1.2。在一个pexisting项目的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()
。
以下是问题: -
我把断点放在方法getCustomerRelations()
里面。我看到这个方法里面有四次流量。第3行两次,第4行另外两次。
根据我的理解,流程应该只有一次,即第3行。一旦它在第3行完成getCustomerRelations,就不应该将它的值放在值栈中,这样
它可以指nextime它被引用(就像它再次在第14行被引用)?
getCustomerRelations()
方法返回CustomerRelationData
对象的列表,其中CustomerRelationData
类也包含getRelationId()
方法。现在在行
5我们在第5行引用value =“relationId。在哪个对象(CustomerRelationAction.java或CustomerRelationData)上,将调用getRelationId()方法?
即使我不确定列表对象CustomerRelationData是否会出现在值堆栈上?如果是,那么它将被放入值堆栈中吗?
现在迭代器在第6行完成。之后,我再次引用代码<s:property value="relationId" />
,On Which object(CustomerRelationAction.java或CustomerRelationData),
将调用getRelationId()方法?
答案 0 :(得分:2)
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>
在getter中使用debug语句的日志输出是:
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)迭代器标记将每个对象放在堆栈的顶部,如tag docs中所述。堆栈顶部是第一个用于获取relationId
值的对象。如果在堆栈顶部找不到它,OGNL将遍历值堆栈,直到找到属性,或者没有堆栈。
3)请参阅上一个答案:一旦您离开迭代器,堆栈上就不再存在客户关系,您就会回到行动中。