有关struts中的logic:iterator标签的奇怪问题

weick 2008-08-21 10:51:31
我在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不同,到底是什么原因呢?被搞的很糊涂,热却期待您的回复,先谢谢了!!
...全文
273 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
weick 2008-08-26
  • 打赏
  • 举报
回复
多谢楼上的推荐哈..
chensugang 2008-08-24
  • 打赏
  • 举报
回复
楼主为什么那么麻烦还用迭代来生成这个下拉列表啊
直接用用<html:optionsCollection></html:optionsCollection>不就可以了

使用方法如下:
<html:select>
<html:optionsCollection property="department"
lable="departmentName"
value="depId">
</html:optionsCollection>
</html:select>

这多简单
weick 2008-08-23
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 popyy0101 的回复:]
<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>

[/Quote]

嗯,试了,还是不可以迭代出来。
popyy0101 2008-08-23
  • 打赏
  • 举报
回复
疯了……关注吧
weick 2008-08-23
  • 打赏
  • 举报
回复
这问题太奇怪了,慢慢提高再回头看看吧..
whatisjava_open 2008-08-22
  • 打赏
  • 举报
回复
JAVA阵营 QQ群 68575630
weick 2008-08-22
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 popyy0101 的回复:]
你这样应该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>
下面写成 <htm…
[/Quote]

可能像你所说的那样,虽然我在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"> ,一样的不行。

谢谢楼上所有朋友对本帖的关注,谢谢!!
To~fu 2008-08-22
  • 打赏
  • 举报
回复
我发表一下不成熟的意见,因为没看过struts的源代码,所以只能猜测原因如下:

可能struts将你传入request中的集合类以迭代器的方式迭代,迭代器的特点就是只能向前,不能倒退。第一次迭代后迭代器已经到达底部,所以第二次没能迭代出来。
atealxt 2008-08-22
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 weick 的回复:]
如果是getter有问题的话第一段代码就不会正常迭代了,但是第一段代码是可以正常迭代出来的,你是试了我发的这两段代码的吗?
[/Quote]
如果没有多次iterate需求的话,你那么写是没任何问题的。

你的getter方法中的getAllDepartment,我猜每次都返回的是同一个对象。
所以虽然有数据第一次迭代正常,第二次就不对了。

其实把标签代码优化优化,也可以只iterate一次的。
popyy0101 2008-08-22
  • 打赏
  • 举报
回复
<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的几项都去掉 然后确定红色的部分都替换了
再试试吧
weick 2008-08-22
  • 打赏
  • 举报
回复
顶顶
weick 2008-08-22
  • 打赏
  • 举报
回复
沉的好快
weick 2008-08-22
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 atealxt 的回复:]
之前我也以为是logic:iterate的问题,可自己试了一下没出楼主的错,证明和iterate标签的id无关。

看了19楼,应该是楼主的getter有问题。把getAllDepartment方法改改:>
[/Quote]

如果是getter有问题的话第一段代码就不会正常迭代了,但是第一段代码是可以正常迭代出来的,你是试了我发的这两段代码的吗?
atealxt 2008-08-22
  • 打赏
  • 举报
回复
之前我也以为是logic:iterate的问题,可自己试了一下没出楼主的错,证明和iterate标签的id无关。

看了19楼,应该是楼主的getter有问题。把getAllDepartment方法改改:>
weick 2008-08-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 popyy0101 的回复:]
看不出 不过可以在这几个方面试试:
1.你的inDepartmentId是不是本身就没有东西
2.记得好像struts的标签嵌套有问题 你可以不用 <html:option>而用普通的 <option>试试
[/Quote]

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

谢谢关注!呵呵...被这个问题困扰很长时间了,一直找不到解决方法。
weick 2008-08-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hanyu51766 的回复:]
不明白
[/Quote]
你好,是我表述的不明白,还是其他的什么原因?谢谢!!
意思就是在action中返回一个Iterator对象,然后在<html:select></html:select>中用<logic:iterate>迭代取值,两段相同的代码,在同一个jsp文件中,第一段可以正常迭代,而第二段却不能迭代取值,可确定那个Iterator对象已经发送回页面了。
popyy0101 2008-08-21
  • 打赏
  • 举报
回复
看不出 不过可以在这几个方面试试:
1.你的inDepartmentId是不是本身就没有东西
2.记得好像struts的标签嵌套有问题 你可以不用<html:option>而用普通的<option>试试
hanyu51766 2008-08-21
  • 打赏
  • 举报
回复
不明白
popyy0101 2008-08-21
  • 打赏
  • 举报
回复
你这样应该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的定义发出来我看一下
weick 2008-08-21
  • 打赏
  • 举报
回复
不能,不能,不能沉呀..
加载更多回复(11)

81,115

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧