我在action中往jsp中发送了一个Iterator对象,像这样:request.setAttribute("department",departmentIt); 
在jsp页面中用了两对 <html:select> </html:select>来迭代这个Iterator对象,第一个 <html:select> </html:select>如下: <html:select property="outDepartmentId" styleId="outDepartmentId"> 
<html:option value="">--请选择-- </html:option> 
<logic:present name="department"> 
<logic:iterate id="dep" name="department"> 
<bean:define id="depId" name="dep" property="id"> </bean:define> 
<html:option value=" <%=""+depId%>"> 
<bean:write name="dep" property="departmentName"/> 
</html:option> 
</logic:iterate> 
</logic:present> 
</html:select>
 第二个 <html:select> </html:select>中的代码和上面一模一样,只是 <html:select>中的property属性不同,为inDepartmentId,完整代码如下: <html:select property="inDepartmentId" styleId="inDepartmentId"> 
<html:option value="">--请选择-- </html:option> 
<logic:present name="department"> 
<logic:iterate id="dep" name="department"> 
<bean:define id="depId" name="dep" property="id"> </bean:define> 
<html:option value=" <%=""+depId%>"> 
<bean:write name="dep" property="departmentName"/> 
</html:option> 
</logic:iterate> 
</logic:present> 
</html:select> 
问题:在上面的第一个 <html:select> </html:select>中能够正确地迭代出Iteraotr对象中的内容,而第二个,也就是下面的那一个除了 <html:option value="">--请选择-- </html:option>这个option中有值之外,其他的option都为空。我已经几次遇到了这种问题,很奇怪,在同一个jsp页面中,一模一样的两段代码,为什么第一个可以正确的迭代,而第二个却不能,会不会是 <logic:iterator>标签在 <html:select>中使用的问题,两者不同的只是定义的property不同,到底是什么原因呢?被搞的很糊涂,热却期待您的回复,先谢谢了!! 

解决方案 »

  1.   

    看不出 不过可以在这几个方面试试:
    1.你的inDepartmentId是不是本身就没有东西
    2.记得好像struts的标签嵌套有问题 你可以不用<html:option>而用普通的<option>试试
      

  2.   

    你好,是我表述的不明白,还是其他的什么原因?谢谢!!
    意思就是在action中返回一个Iterator对象,然后在<html:select></html:select>中用<logic:iterate>迭代取值,两段相同的代码,在同一个jsp文件中,第一段可以正常迭代,而第二段却不能迭代取值,可确定那个Iterator对象已经发送回页面了。
      

  3.   


    谢谢popyy0101 :
    1.inDepartmentId是我在<html:select>标签中定义的一个javaBean的property,所以这个property原本是不存在的,定义了之后方便在formBean中获取它的值。
    2.第一段代码的嵌套迭代是可以的,不知道是struts不稳定还是其他什么原因,嵌套迭代我之前都可以正常使用,只是最近用到了<html:select>标签中出现了上述问题,可是奇怪的是如果迭代有问题,和第二段代码一模一样的第一段为什么就可以正常迭代呢,搞不明白这点,两段代码是写个同一个jsp页面中的,而且可以确定Iterator对象已经成功发送回这样jsp页面,要不然第一段代码也不会取到值了。谢谢关注!呵呵...被这个问题困扰很长时间了,一直找不到解决方法。
      

  4.   

    <html:option value=" <%=""+depId%>"> 是不是双引号的问题,
      

  5.   

    使用<html:options/>标签可以解决此问题
      

  6.   

    把<logic:present>标签去掉,试验以下 
      

  7.   

    你那里面的<logic:present name="department"> 
    是自己定义的??
    你要它做什么
      

  8.   

      貌似你的迭代器是取自同一个的  也就是 你第一次定义了一个新的迭代器<logic:iterate id="dep" name="department"> 用来迭代department
      第二次仍然使用了<logic:iterate id="dep" name="department">这个代码 这时候系统发现刚才已经定义了这个ID的迭代器 所以没有重新分配一个 而是使用了刚才的那个
      而这个ID的迭代器 刚才已经迭代到department的末尾了 所以第二次使用实际是从末尾开始迭代 所以没有东西
      也正因为这样  你把第一段删了 第二段就正常 因为它直接用第二段的开始迭代
      如果你把一二段换个位置 那肯定第二段能使用 第一段又不正常了
      

  9.   


    department 是action中定义的attribute的名称,request.setAttribute("department",departmentIt),其中departmentIt是一个Iterator对象。我这样是为了判断这个对象是否存在并成功发送回页面,去掉之后第二段代码还是不能正确迭代,问题应该跟这个无关。把成功的那段去掉,第二段代码是可以正常迭代取值的,很奇怪
      

  10.   


     popyy0101:  我在action中重复发送了刚才那个Iterator对象,第一个是request.setAttribute("department",deparmentIt)
    第二个是request.setAttribute("department2",departmentIt),发送同一个对象,只不过attribute的标识不同,这样在刚才的那个jsp页面中第二段代码使用第二个,<logic:iterate id="dep2" name="department2"> ,ID也改了,可是这样也不能迭代,如果如你所说,现在迭代器改变了,虽然也是迭代同一个对象,但是为什么也不行呢?
      

  11.   

      你这样应该request里面的两个标识指向的是内存的同一个地址吧 也就是还是一个迭代器
      而且<logic:iterate id="dep2" name="department2"> 我记得iterate标签里的name属性是指的要迭代的bean的名字 你似乎没有department2这个bean
      我建议第二个写成 <logic:iterate id="dep2" name="department"> 试试
      而且bean:define写成<bean:define id="depId2" name="dep2" property="id"> </bean:define>
      下面写成<html:option value=" <%=""+depId2%>"> 
      我这些都是想着说的 也没实验 再不行你把你的department这个bean的定义发出来我看一下
      

  12.   

    我发表一下不成熟的意见,因为没看过struts的源代码,所以只能猜测原因如下:可能struts将你传入request中的集合类以迭代器的方式迭代,迭代器的特点就是只能向前,不能倒退。第一次迭代后迭代器已经到达底部,所以第二次没能迭代出来。
      

  13.   


    可能像你所说的那样,虽然我在action中也定义了标识是department2的attribute,但是使用的bean还是departmentIt,也就是一个Iterator对象,两个不同标识的attribute使用了同一个bean,应该是指向相同的内存地址。改成<logic:iterate id="dep2" name="department"> 这样我已经试过了,也是不行的,下面是我在action中定义的bean:List<Department> departmentList=null;
    try 
    {
        departmentList=departmentDAO.getAllDepartment();

    catch (Exception e) 
    {
        e.printStackTrace();
    }Iterator<Department> departmentIt=departmentList.iterator();request.setAttribute("department", departmentIt);就这样了,发现上述问题之后,我增加了这个request.setAttribute("department2", departmentIt);
    使用<logic:iterate id="dep2" name="department2"> ,一样的不行。谢谢楼上所有朋友对本帖的关注,谢谢!!
      

  14.   

    JAVA阵营     QQ群   68575630
      

  15.   

    之前我也以为是logic:iterate的问题,可自己试了一下没出楼主的错,证明和iterate标签的id无关。看了19楼,应该是楼主的getter有问题。把getAllDepartment方法改改:>
      

  16.   


    如果是getter有问题的话第一段代码就不会正常迭代了,但是第一段代码是可以正常迭代出来的,你是试了我发的这两段代码的吗?
      

  17.   

    <html:select property="inDepartmentId" styleId="inDepartmentId">
    <html:option value="">--请选择-- </html:option>
    <logic:present name="department">
    <logic:iterate id="dep2" name="department">
    <bean:define id="depId2" name="dep2" property="id"> </bean:define>
    <html:option value=" <%=""+depId2%>">
    <bean:write name="dep2" property="departmentName"/>
    </html:option>
    </logic:iterate>
    </logic:present>
    </html:select> 把你的action中的request.setAttribute的几项都去掉 然后确定红色的部分都替换了
    再试试吧
      

  18.   

    如果没有多次iterate需求的话,你那么写是没任何问题的。你的getter方法中的getAllDepartment,我猜每次都返回的是同一个对象。
    所以虽然有数据第一次迭代正常,第二次就不对了。其实把标签代码优化优化,也可以只iterate一次的。
      

  19.   

    楼主为什么那么麻烦还用迭代来生成这个下拉列表啊
    直接用用<html:optionsCollection></html:optionsCollection>不就可以了使用方法如下:
    <html:select>
      <html:optionsCollection property="department"
                              lable="departmentName"
                              value="depId">
      </html:optionsCollection>
    </html:select>这多简单