<s:if></s:if>标签判断空字符串问题

本文介绍了一个在Struts2框架中使用&lt;s:if&gt;标签判断字符串是否为空时遇到的问题。当对象本身为空时,直接使用&lt;s:if&gt;标签会导致误判为非空。文章给出了正确的解决方案,即先判断对象是否为空,再进行后续的条件判断。
今天遇到这样一个问题,使用<s:if>判断一个字符串是否为空,<s:if test="xk.aa==''">返回值恒真,百思不得其解,最后发现一个问题,就是xk这个对象本身就是空。所以要这样判断<s:if test="xk==null"> 之后再进行其他的判断。你中枪了没有?
<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]中关于指针异常的解决方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值