在使用 <s:iterator value="#request.students"></s:iterator> 无法显示数据,而 ${request.students[0].id} 却可以显示时问题

本文深入探讨了Struts2框架中s:iterator标签的使用方法及注意事项,特别是当涉及到Hibernate懒加载机制时如何避免空指针异常。通过对比不同代码片段的效果,解释了何时以及如何正确使用该标签。
在本人第一次做项目的时候,因为这个问题纠结了很久,使用 如下代码.
<s:iterator value="#request.students">
    ${name}
</s:iterator>
一直无法显示数据,而使用 如下代码却可以显示出来.
${request.students[0].id} 
    作为新手,一直不知道怎么回事,经过长时间检查和实验.终于发现原来<s:iterator></s:iterator> 标签好像会自动调用存在的 javaBean 的 toString() 方法.意思就是如果你的 javaBean 是从 Hibernate 方法从数据库中找出来的. javaBean 中有一些其他的类.但是没有被加载出来. 所以出现的懒加载异常.但是页面和控制台都不会报错. 使用 **${request.students[0].id}** 是直接调用 get 方法.如果该属性被加载就不会报错.
    所以简单的来说,就是使用 <s:iterator></s:iterator> 标签时,要保证类中的属性都被加载,要不然就为空,不能让他处在未加载完全的样子. 简单的方法就是在获取javaBean 的时候手动调用 toString().一定要在一个事物里噢. 要不然还会报错.
<think> 根据用户问题,我们需要处理当 `rmsClinicalDrugsRfidMapping` 为 null ,如何调整原有的 JSP 代码(使用了 Struts2 标签)。 原代码逻辑: ```jsp <s:if test="rmsClinicalDrugsRfidMapping.rcdiId == null"> <option value="">请选择</option> </s:if> <s:else> <!-- 迭代生成选项,并选中与rmsClinicalDrugsRfidMapping.rslId匹配的项 --> </s:else> ``` 问题:当 `rmsClinicalDrugsRfidMapping` 为 null ,在 `<s:if>` 中访问 `rmsClinicalDrugsRfidMapping.rcdiId` 会抛出空指针异常。 解决方案: 1. 首先判断 `rmsClinicalDrugsRfidMapping` 是否为 null,然后再访问其属性。 2. 我们可以使用嵌套的 `<s:if>` 或者使用 `<s:if test="rmsClinicalDrugsRfidMapping != null">` 来避免空指针。 修改后的代码逻辑: - 情况1:当 `rmsClinicalDrugsRfidMapping` 为 null ,我们执行原代码中 `<s:if>` 内的内容(即显示“请选择”选项)。 - 情况2:当 `rmsClinicalDrugsRfidMapping` 不为 null ,再判断其 `rcdiId` 是否为 null,然后执行相应的分支。 但是,根据原代码,我们注意到: - 原代码在 `rmsClinicalDrugsRfidMapping.rcdiId == null` 显示“请选择”选项。 - 在 `rmsClinicalDrugsRfidMapping` 不为 null 且 `rcdiId` 不为 null ,执行 `<s:else>` 分支。 因此,我们可以重构为: ```jsp <s:if test="rmsClinicalDrugsRfidMapping == null || rmsClinicalDrugsRfidMapping.rcdiId == null"> <option value="">请选择</option> </s:if> <s:else> <s:iterator value="drugsInfoMap.locations"> <option value="<s:property value="id" />" <s:if test="id == rmsClinicalDrugsRfidMapping.rslId">selected</s:if>> <s:property value="rlName"/> <s:property value="rslName"/> </option> </s:iterator> </s:else> ``` 这样修改后: - 当 `rmsClinicalDrugsRfidMapping` 为 null ,进入第一个分支,显示“请选择”选项。 - 当 `rmsClinicalDrugsRfidMapping` 不为 null 且其 `rcdiId` 为 null ,同样显示“请选择”选项。 - 只有当 `rmsClinicalDrugsRfidMapping` 不为 null 且 `rcdiId` 不为 null ,才进入 `<s:else>` 分支,生成选项列表并选中对应的项。 注意:在 `<s:else>` 分支中,我们仍然使用了 `rmsClinicalDrugsRfidMapping.rslId`,但此我们已经确保 `rmsClinicalDrugsRfidMapping` 不为 null(因为进入了else分支),所以不会出现空指针异常。 另外,在迭代生成选项,比较 `id == rmsClinicalDrugsRfidMapping.rslId` 可能会涉及类型问题,确保它们是可比较的类型(如同为整数或字符串)。不过,这属于另一个问题,当前问题主要是解决空指针。 总结:通过将条件改为 `rmsClinicalDrugsRfidMapping == null || rmsClinicalDrugsRfidMapping.rcdiId == null`,我们避免了当 `rmsClinicalDrugsRfidMapping` 为 null 访问其属性导致的空指针异常。 如果还有疑问,请参考引用[3]中关于 `<c:if>` 的使用思路,但注意这里是 Struts2 标签,语法类似,都是使用 OGNL 表达式。 [^1]: 参考了引用[3]中关于条件判断的示例。 </think> 在 JSP 代码中处理 `rmsClinicalDrugsRfidMapping` 可能为 null 的情况,需要使用分层判断结构确保不会出现空指针异常。以下是优化后的代码实现: ```jsp <%-- 首先判断 rmsClinicalDrugsRfidMapping 是否为 null --%> <s:if test="rmsClinicalDrugsRfidMapping == null"> <%-- 当为 null 显示默认选项 --%> <option value="">请选择</option> </s:if> <s:else> <%-- 当不为 null ,再判断 rcdiId 是否为 null --%> <s:if test="rmsClinicalDrugsRfidMapping.rcdiId == null"> <%-- rcdiId 为 null 显示默认选项 --%> <option value="">请选择</option> </s:if> <s:else> <%-- 两者都不为 null 显示完整列表 --%> <s:iterator value="drugsInfoMap.locations"> <option value="<s:property value='id' />" <s:if test="id == rmsClinicalDrugsRfidMapping.rslId">selected</s:if>> <s:property value="rlName"/> <s:property value="rslName"/> </option> </s:iterator> </s:else> </s:else> ``` ### 关键改进说明: 1. **分层判断逻辑**: - 外层首先检查 `rmsClinicalDrugsRfidMapping` 是否为 null[^3][^5] - 内层再检查 `rcdiId` 属性是否为 null - 有效避免空指针异常(NPE) 2. **安全访问属性**: - 只有当确认 `rmsClinicalDrugsRfidMapping` 不为 null 后,才访问其 `rcdiId` 属性 -iterator 中访问 `rslId` ,同样确保对象非空[^2] 3. **默认选项处理**: - 两种异常情况都返回相同的默认选项 - 保持用户界面一致性 ### 相关问题: 1. 如何在 JSP 中安全访问嵌套对象的属性?[^3] 2. 有哪些常见策略可以防止 JSP 中的空指针异常?[^5] 3.使用 Struts2 标签,如何优化复杂条件判断结构?[^1] 4. 在迭代器中处理动态数据需要注意哪些边界情况?[^4] [^1]: 参考了引用[1]中关于嵌套迭代和条件判断的实现 [^2]: 参考了引用[2]中关于属性访问的安全处理方式 [^3]: 参考了引用[3]中关于条件判断标签的使用规范 [^4]: 参考了引用[4]中关于函数处理值的技巧 [^5]: 参考了引用[5]中关于空指针异常的解决方案
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值