struts 2 采用OGNL对象导航语言,action本身的对象放在值栈(OGNL根对象)中,访问的时候可直接访问,不需要加"#",而用<s:iterator>标签,访问列表的某一元素的属性是需要加"#"的,如下代码。以上是来自struts2文档,应该无误。    那么如果在<s:iterator>里面,访问值栈中的对象,而这个对象名字刚好和列表元素的属性名字一样呢?经过验证,这样是无法访问到值栈中的对象的,而只能访问到同名的列表元素的属性。如代码中的<s:if test="id==#bean.id">selected</s:if>里面的id和#bean.id会是同一个对象,故逻辑判断永远为真。如果struts2 就是设计成这样子的,那么在<s:iterator>内部如何访问值栈中的这个和列表元素的属性同名的对象呢?
  
  达人一起来探讨一下。
<s:iterator value="list" id="bean" status="sta">
  <option <s:if test="id==#bean.id">selected</s:if> value="<s:property value="#bean.id" />" >
<s:property value="#bean.title" />
  </option>
</s:iterator>

解决方案 »

  1.   

    你看一下能否先通过把#bean.id的值取出来到某个对象里,然后再通过 <s:if test="id==<%=变量%>">来做
      

  2.   


    谢谢,
    这个的替代解决方案很简单的,很容易解决。我只是想探讨一下这里是否有bug。还是自己对这些标签还有不了解的地方。
      

  3.   

    而用<s:iterator>标签,访问列表的某一元素的属性是需要加"#"的我怎么感觉可以不用加"#"
      

  4.   

    “ <s:if test="id==#bean.id">selected</s:if>里面的id和#bean.id会是同一个对象”
    这是什么意思
      

  5.   


    这里本来是想用action的一个属性“id” 和 列表元素的属性#bean.id作比较,但结果却是id 和 #bean.id都是列表元素的属性。按理说 id 应该会引用到action的属性“id”,结果却不是。
      

  6.   

    我靠 第一次看到有人 struts2的select标签不用 使用这么麻烦的玩意,你不就是想让下拉框选择默认的值嘛
    <s:select list="dictlist" value="%{dictitem.dcaid}" name="dcaid" listKey="id" listValue="name" />这里的value等于你的那个选中的值就可以默认选中那个项了
      

  7.   


       确实,用<s:select>方便很多,主要是以前在table里用了<s:file><s:textarea>会自动生成一些html代码,破坏了表格,再加上html标签已经很熟,用struts标签要查资料,以致讨厌struts标签。用html标签虽然麻烦点,但因为熟悉反而更快,却可以自己完全控制html源码。  另:我提的问题可有答案?