s:if在<s:iterator>中的使用

本文介绍了一个使用Struts2进行复杂条件渲染的例子,展示了如何根据不同条件展示不同的UI元素,如图片提示和链接操作等。

<s:iterator value="pagination" var="applyDatum" status="status">
            <tr>
              <td width="5%"><input type="checkbox" name="id" value="${id}" class="checkbox"><input type="hidden" name="datumname_${id }" value="${name}" /></td>
              <td style="text-align: left;"><s:property value="name" />
              <s:if test="#request.jcflag ==1">
	              <s:if test="#applyDatum.type ==1">
		              <s:if test="#applyDatum.samplepath ==null">
		                 	<img src="/images/yang.png" onMouseOut="layer.close(layer.index)" onMouseOver="layer.tips('样例为空', this);" />
		                </s:if>
	               </s:if>
	                <s:if test="#applyDatum.type ==2">
		              <s:if test="#applyDatum.samplepath ==null">
			              <s:if test="#applyDatum.ystablepath !=null">
			                 	<img src="/images/yang.png" onMouseOut="layer.close(layer.index)" onMouseOver="layer.tips('样例为空', this);" />
			               </s:if>
		                </s:if>
		                 <s:if test="#applyDatum.ystablepath ==null">
		                 	<s:if test="#applyDatum.samplepath !=null">
		                 		<img src="/images/yuan.png" onMouseOut="layer.close(layer.index)" onMouseOver="layer.tips('原始表格为空', this);" />
		               		 </s:if>
		                </s:if>
		                <s:if test="#applyDatum.samplepath ==null">
		                 	<s:if test="#applyDatum.ystablepath==null">
		                 		<img src="/images/yuan.png" onMouseOut="layer.close(layer.index)" onMouseOver="layer.tips('样例和原始表格都为空', this);" />
		                 		<img src="/images/yang.png" onMouseOut="layer.close(layer.index)" onMouseOver="layer.tips('样例和原始表格都为空', this);" />
		                	</s:if>
		                </s:if>
	               </s:if>
               </s:if>
              </td>
              <s:if test="crmCertdir==null">
              <td  width="12%">未关联</td>
              </s:if>
              <s:if test="crmCertdir!=null">
              <td  width="12%">已关联</td>
              </s:if>
             
              <s:if test="door!=3&&#parameters.type[0]==1"><!-- 非单位入口并类型、并查看所有申请材料 -->
             	 <td  width="12%">${tablepath==null?'否':'是'}</td>
              </s:if>
              <s:if test="#parameters.type[0]==2">
          	  <td width="12%" > 
          		<caporg:showorg value="${deptid}" propertyname="fullname"/> 
          	  </td>
          	</s:if>
              <td  width="15%">
	              <a href="javascript:;" class="operate" onClick="_mod(${id})">修改</a> 
	              <a href="javascript:;"	class="operate del" onclick="_del(${id})">删除</a>
	             <s:if test="#applyDatum.tablepath!=null">
		             <a href="javascript:;" class="operate" onClick="mydatumpdf('${tablepath}');">表格预览</a> </td>
	             </s:if> 
            </tr>
          </s:iterator>



1、如果action中是request.setAttribute("ss","xiao"),那么s:if就要写成<s:if request="#request.ss=='xiaochao'"></s:if>

2、如果是在<s:iterator value="pagination" var="applyDatum" status="status">中遍历list,那么s:if就要<s:if request="#applyDatum.attrValue=='xiaochao'"></s:if>

<s:if test="%{#applyDatum.attrValue!=0}"></s:if>

作者:scgyus

转载请注明出处:http://blog.youkuaiyun.com/scgyus/

<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]中关于空指针异常的解决方案
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值