Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Struts2 关于struts 2中的值堆栈的一些基本查询?_Struts2_Struts_Valuestack - Fatal编程技术网

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

Struts2 关于struts 2中的值堆栈的一些基本查询?,struts2,struts,valuestack,Struts2,Struts,Valuestack,虽然我在struts 1.2上工作过,但我对struts 2还是新手。在一个现有的项目jsp文件中,我有以下代码: <script type="text/javascript"> var relationshipData = { // line1 page : '<s:property value="displayPage" />', // line2 records : '<s:property value="customerRelations

虽然我在struts 1.2上工作过,但我对struts 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>

var relationshipData={//line1
页面:“”,//第2行
记录:“”,//第3行
行:[//第4行
{id:'',
单元格:[''']},//第5行
]//第6行
};
请求来自
CustomerRelationAction.java
,它有方法
getCustomerRelations()
getRelationId()

问题如下:

  • 我将断点放在方法
    getCustomerRelations()
    中。我看到流在这个方法中出现了四次。三号线两次,四号线两次。 根据我的理解,流量应该只出现1次,即在第3行。在第3行完成getCustomerRelations后,不应将其值放入值堆栈中,以便 它下次被引用时可以引用它(就像它在第14行再次被引用一样)

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

  • 现在迭代器在第6行完成。之后,我再次引用代码
    ,在哪个对象上(CustomerRelationAction.java或CustomerRelationData), 是否将调用getRelationId()方法

  • 1)我不知道为什么您认为调用
    customerRelations
    的属性,然后在迭代器标记中使用
    customerRelations
    只能调用
    getCustomerRelations()
    一次;您使用它两次,所以至少会调用两次

    如果您想保留对它的引用,请使用
    创建对集合的新引用。但是,我认为这样做没有意义,除非您的getter正在做一些耗时的事情

    我看不到相同的行为。给定问题的
    片段,它呈现为(假设一个包含示例数据的虚拟三元素列表):

    在这一点上,我更可能相信JSP/JS/etc

    2)迭代器标记将每个对象放在堆栈顶部,如中所述。堆栈顶部是用于获取
    relationId
    值的第一个对象。如果在堆栈顶部找不到它,OGNL将遍历值堆栈,直到找到属性或不再有堆栈为止


    3)查看前面的答案:一旦退出迭代器,堆栈上就不再有客户关系,您又回到了操作中。

    感谢Dave的回答和耐心。正如您所说,迭代器标记将每个对象放在堆栈顶部。s:property标记是否也将检索到的对象放在值堆栈中(类似于“”标记是否将displayPage的值放入值堆栈)?根据我在调试器模式下的观察,它没有。@MSach:property标记将从valuestack获取值。如果是迭代器,它将把对象推到值堆栈的顶部,以便在页面中检索相同的值
    <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.