有关struts 2中值堆栈的一些基本查询?

时间:2012-01-19 17:53:02

标签: struts2 struts valuestack

我是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()

以下是问题: -

  1. 我把断点放在方法getCustomerRelations()里面。我看到这个方法里面有四次流量。第3行两次,第4行另外两次。 根据我的理解,流程应该只有一次,即第3行。一旦它在第3行完成getCustomerRelations,就不应该将它的值放在值栈中,这样 它可以指nextime它被引用(就像它再次在第14行被引用)?

  2. getCustomerRelations()方法返回CustomerRelationData对象的列表,其中CustomerRelationData类也包含getRelationId()方法。现在在行 5我们在第5行引用value =“relationId。在哪个对象(CustomerRelationAction.java或CustomerRelationData)上,将调用getRelationId()方法? 即使我不确定列表对象CustomerRelationData是否会出现在值堆栈上?如果是,那么它将被放入值堆栈中吗?

  3. 现在迭代器在第6行完成。之后,我再次引用代码<s:property value="relationId" />,On Which object(CustomerRelationAction.java或CustomerRelationData), 将调用getRelationId()方法?

1 个答案:

答案 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)请参阅上一个答案:一旦您离开迭代器,堆栈上就不再存在客户关系,您就会回到行动中。