0

我是 strut 2 的新手,虽然我在 struts 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()。我看到这个方法里面有四次流量。在第 3 行两次,在第 4 行再两次。根据我的理解,流程应该只出现 1 次,即在第 3 行。一旦在第 3 行完成 getCustomerRelations ,不应将其值放入值堆栈中,以便它可以参考下次它被引用(就像它在第 14 行再次被引用)?

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

  3. 现在迭代器在第 6 行完成。之后,现在我<s:property value="relationId" />再次参考代码,在哪个对象(CustomerRelationAction.java 或 CustomerRelationData)上,将调用 getRelationId() 方法?

4

1 回答 1

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 中带有调试语句的日志输出是这样的:

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)查看前面的答案:一旦你退出迭代器,堆栈上不再有客户关系,你又回到了行动。

于 2012-01-19T19:01:58.093 回答