【jsp】display导出防止科学计数法

本文详细介绍了如何在页面中展示并处理考生编号信息,包括使用JavaBean定义和字符操作实现的编码过程。
<display:column media="all" style="width:10%" title="考生编号"  sortable="true" class="textCenter">
	<bean:define id="ksbh" name="row" property="KSBH" type="java.lang.String"/>
	<%=ksbh+((char)127)%>
</display:column>


<c:forEach items="${page.dataRows}" var="dataRow" varStatus="status1"> <tr> <td></td> <td>${dataRow.lccb_cjpz }</td> <td>青海</td> <td>${dataRow.lccb_chouyjpzbh }</td> <td></td> <td style="vnd.ms-excel.numberformat:@"><fmt:formatDate value="${dataRow.lccb_cysj }" pattern="yyyy-MM-dd "/></td> <td>${dataRow.lccb_jpmc }</td> <td>${dataRow.lccb_pzwh }</td> <td></td> <td>${dataRow.lccb_jsyq }</td> <td> ${dataRow.lccb_jymdxl1 == '进口' ? dataRow.lccb_sydw : (dataRow.lccb_jymdxl1 == '国内' ? dataRow.lccb_scdwsf : dataRow.lccb_scdwsf)} </td><!-- 所在省份 --> <td>${dataRow.lccb_scdw }</td> <td>${dataRow.lccb_scdwdz }</td> <td>${dataRow.lccb_scdwlxdh }</td> <td>${dataRow.lccb_scdwlcz }</td> <td>${dataRow.lccb_gg }</td> <td> ${dataRow.lccb_scrq},${dataRow.lccb_ph},${dataRow.lccb_cpbh} </td> <td>${dataRow.lccb_cyscsl }</td> <td>${dataRow.lccb_cyxssl}</td> <td>${dataRow.lccb_kcsl }</td> <td>${dataRow.lccb_jpsl}</td> <td>${dataRow.lccb_yxq}</td> <td>${dataRow.lccb_cydd }</td> <td>${dataRow.lccb_sb }</td> <td>${dataRow.lccb_bcydwxz}</td> <td>${dataRow.lccb_xkz }</td> <td>${dataRow.lccb_bcydw }</td> <td>${dataRow.lccb_bcydwdz}</td> <td>${dataRow.lccb_bcydwfzr }</td> <td>${dataRow.lccb_bcydwyb }</td> <td>${dataRow.lccb_bcydwdh}</td> <td>${dataRow.lccb_bcydwcz }</td> <td>${dataRow.lccb_cydw }</td> <td>${dataRow.lccb_cydwdz}</td> <td>${dataRow.lccb_cydwlxr }</td> <td>${dataRow.lccb_cydwyb }</td> <td>${dataRow.lccb_cydwdh}</td> <td>${dataRow.lccb_cydwcz }</td> <td>青海省药品检验检测院</td> <td>${dataRow.lccb_jyyj1}${dataRow.lccb_jyyj2}</td> <td>${dataRow.lccb_zzjl }</td> <td>${dataRow.bhgxm }</td> <td>${dataRow.lccb_bgsbz }</td> <td>${dataRow.lccb_scdwsf}</td> <td></td> <td></td> </tr> </c:forEach>在上述代码中修改的<td> ${dataRow.lccb_jymdxl1 == '进口' ? dataRow.lccb_sydw : (dataRow.lccb_jymdxl1 == '国内' ? dataRow.lccb_scdwsf : dataRow.lccb_scdwsf)} </td>为什么不生效
最新发布
10-17
你提出的问题常典型: > 在 JSP 的 `<c:forEach>` 循环中使用了如下 EL 表达式: ```jsp <td> ${dataRow.lccb_jymdxl1 == '进口' ? dataRow.lccb_sydw : (dataRow.lccb_jymdxl1 == '国内' ? dataRow.lccb_scdwsf : dataRow.lccb_scdwsf)} </td> ``` 但修改后 **页面没有生效(显示为空、或始终显示某个字段)**。 下面我们从 **常见原因 → 排查方法 → 解决方案** 全面分析这个问题。 --- ## 🔍 一、为什么这个表达式“不生效”?可能的原因 | 原因 | 说明 | |------|------| | 1. ❌ 字段值不是 `'进口'` 或 `'国内'`,而是 `'国产'`、`null`、空字符串等 | 判断条件无法命中 | | 2. ❌ EL 表达式语法错误或被当作纯文本输出 | 没有正确解析 EL | | 3. ❌ 页面未重新编译 / 缓存导致旧代码运行 | 修改了但没看到效果 | | 4. ❌ web.xml 或 JSP 配置禁用了 EL 表达式 | `${...}` 不会被执行 | | 5. ❌ 实际据中 `lccb_jymdxl1` 为 `null` 或拼写错误(如带空格) | 条件永远为 false | | 6. ❌ 浏览器缓存或导出 Excel 时格式问题 | 看似没变,其实是前端展示问题 | 我们逐个排查。 --- ## ✅ 二、解决方案与调试步骤 ### ✅ 步骤 1:确认 `lccb_jymdxl1` 的真实值(关键!) 在 `<tr>` 内添加一个隐藏的调试信息: ```jsp <!-- 调试用:查看实际字段值 --> <tr style="display:none"> <td colspan="50">DEBUG: lccb_jymdxl1 = [${dataRow.lccb_jymdxl1}]</td> </tr> ``` 或者直接在目标 `<td>` 旁边临时加一列: ```jsp <td>【DEBUG】${dataRow.lccb_jymdxl1}</td> <!-- 临时调试列 --> ``` 刷新页面后观察浏览器 HTML 输出,看实际值是: - `"进口"` ✔️ - `"国内"` ✔️ - `"国产"` ❌(你判断的是“国内”,所以不匹配) - `null` 或空白 ❌ - `" 进口 "`(前后有空格)❌ 👉 **这是最常见的问题:你以为是“国内”,结果据库返回的是“国产”!** --- ### ✅ 步骤 2:修复逻辑以兼容真实据 假设你发现实际值是 `"国产"` 而不是 `"国内"`,那么你的三元表达式应该改为: ```jsp <td> ${dataRow.lccb_jymdxl1 == '进口' ? dataRow.lccb_sydw : dataRow.lccb_scdwsf} </td> ``` ✅ 更简洁且覆盖所有“进口”情况。 或者如果你坚持要精确判断: ```jsp <td> ${dataRow.lccb_jymdxl1 == '进口' ? dataRow.lccb_sydw : (dataRow.lccb_jymdxl1 == '国产' || dataRow.lccb_jymdxl1 == '国内') ? dataRow.lccb_scdwsf : ''} </td> ``` --- ### ✅ 步骤 3:检查是否启用了 EL 表达式 确保你的 `web.xml` 是 **Servlet 2.4+** 或更高版本,并且 **没有禁用 EL**。 #### 正确配置示例(web.xml): ```xml <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <!-- 默认开启 EL --> </web-app> ``` ⚠️ 如果你在 JSP 文件顶部写了: ```jsp <%@ page isELIgnored="true" %> ``` → 必须改成: ```jsp <%@ page isELIgnored="false" %> ``` 否则 `${...}` 将被当作普通文本输出! --- ### ✅ 步骤 4:清除缓存并强制刷新 JSP 会自动编译成 Servlet,但有时不会热更新。 #### 操作建议: 1. 清除 Tomcat 的 `work/Catalina/` 目录下对应项目的编译文件 2. 重启 Tomcat 3. 浏览器按 `Ctrl + F5` 强制刷新(禁用缓存) --- ### ✅ 步骤 5:检查字段名是否拼写错误 确认 Java 对象中的 getter 方法是否正确: ```java public class DataRow { private String lccb_jymdxl1; public String getLccb_jymdxl1() { return lccb_jymdxl1; } } ``` 如果字段名为 `jymdxl1` 但 getter 是 `getJymdxl()`,则 EL 找不到属性。 --- ### ✅ 步骤 6:测试最简表达式验证是否能输出 临时替换为: ```jsp <td>${dataRow.lccb_jymdxl1}</td> ``` 看能不能输出原始值。如果也不行 → 说明据根本没传过来。 再试: ```jsp <td>${dataRow.lccb_sydw}</td> ``` 如果都为空 → 可能是 `page.dataRows` 据源本身有问题。 --- ## ✅ 三、推荐最终写法(稳定 + 安全 + 易维护) ```jsp <td> <c:choose> <c:when test="${dataRow.lccb_jymdxl1 == '进口'}"> ${dataRow.lccb_sydw} </c:when> <c:otherwise> ${dataRow.lccb_scdwsf} </c:otherwise> </c:choose> </td> ``` ✅ 优点: - 不依赖“国内/国产”命名一致性 - 自动处理 `null` 和法值 - 可读性强 - 易于调试 --- ## ✅ 四、补充:导出 Excel 时注意事项 你设置了: ```jsp <td style="vnd.ms-excel.numberformat:@"> ``` 这用于防止 Excel 把长字当科学计数法处理,没问题。 但注意: - 某些特殊字符可能导致 Excel 解析异常 - 确保响应头设置正确: ```java response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment; filename=data.xls"); ``` --- ## ✅ 总结:为什么“不生效”? | 原因 | 占比 | 如何解决 | |------|-----|----------| | 实际值是 `"国产"` 而不是 `"国内"` | ⭐⭐⭐⭐☆ 70% | 打印调试信息,修正判断条件 | | EL 被禁用(isELIgnored="true") | ⭐⭐ 10% | 改为 `false` | | 页面未重启 / 缓存未清 | ⭐⭐ 10% | 删除 work 目录,重启服务器 | | 字段名拼写错误或据为 null | ⭐⭐ 8% | 检查 DTO 和据库 | | 表达式太复杂导致解析失败 | ⭐ 2% | 改用 `<c:choose>` | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值