${items.id} 解析成字符串,不解析成变量

本文探讨了JSP中EL表达式未正确解析的问题,特别是在火狐浏览器中遇到的情况。通过在JSP页面头部加入%@page isELIgnored=false%指令,成功解决了foreach循环无法解析后台变量的难题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题

1、前端jsp片段

 <table width="100%" border="1">
        <tr>
            <td>商品ID</td>
            <td>商品介绍</td>
            <td>商品名称</td>
            <td>操作</td>
        </tr>
        <c:forEach items="${itemlistKey}" var="items">
            <tr>
                <td>${items.id}</td>
                <td>${items.js}</td>
                <td>${items.mc}</td>
                <td><a href="${pageContext.request.contextPath}/item/editItem.action?id=${items.id}">修改</a> </td>
            </tr>
        </c:forEach>
    </table>

显示页面(火狐浏览器):
这里写图片描述
也就是foreach 根本没解析后台传过来的变量;

二;解决办法
jsp中加入

<%@ page isELIgnored="false"%>

三、讨论isELIgnored 作用

<%@ page isELIgnored=”true|false”%>

如果设定为真,那么JSP中的表达式被当成字符串处理。比如下面这个表达式<p>{2000 % 20}</p>在isELIgnored="true"时输出为{2000 % 20}</p>在isELIgnored="true"时输出为{2000 % 20},而isELIgnored=”false”时输出为100。
注意:有的web浏览器默认为true(firefox),有的默认为false

### 解决 JSONArray.parseArray 处理多层嵌套 JSON 数组时的报错 当处理复杂的、带有多个层次结构的 JSON 数据时,`JSONArray.parseArray()` 方法可能无法直接解析这些数据。这通常是因为目标对象中的字段名称与 JSON 中的关键字完全对应或者存在类型转换问题。 为了确保 `JSONArray.parseArray()` 正确工作,在定义 Java 类(如 `RequestDTO`)时应特别注意: - **注解的选择**:如果项目中同时引入了 Jackson 和 Fastjson 库,则需要注意区分 `@JsonProperty` 和 `@JSONField` 的使用场景[^3]。前者适用于 Jackson 序列化/反序列化操作;后者则用于 Fastjson。 - **类变量命名一致性**:保证 DTO 或 POJO 类里的属性名字要跟 JSON 对象里的一致,如果一致可以借助上述提到过的两个注解来映射同的键名。 对于具体的异常情况分析和解决方案如下: #### 1. 捕获并理解错误信息 首先查看抛出的具体 Exception 是什么类型的,并仔细阅读其 message 部分的内容。常见的有: - `JSONException`: 表明输入是有效的 JSON 格式的字符串; - `ClassCastException`: 当尝试将一种类型强制转换为目标类型失败时发生此异常; - `InstantiationException`, `IllegalAccessException`: 这些通常是由于反射机制调用过程中出现问题引起的,比如私有的无参构造函数等。 #### 2. 调整实体类设计 针对复杂的数据模型,建议创建相应的内部静态类或单独文件表示每一级的对象关系。例如,如果有三层嵌套的关系 A -> B -> C ,那么就需要分别建立三个对应的 Bean 来接收相应级别的数据[^2]。 ```java public class Outer { private String outerProperty; @JSONField(name="inner_list") // 如果 key 名同需指定 private List<Inner> innerList; public static class Inner{ private Long id; @JSONField(name="nested_items") private List<NestedItem> nestedItems; // getter setter... } // getter setter... } ``` #### 3. 设置合适的泛型参数 在调用 `parseArray` 函数时传入正确的 Class<?> 参数非常重要。如果是简单的单一层级列表可以直接传递基本类型或自定义 bean 的 `.class` 文件作为第二个参数给它。但对于更深层次的情况来说,应该先通过 `TypeReference<T>` 明确指出整个集合所包含元素的确切形式。 ```java // 假设有一个这样的 json [{"id":1,"items":[{"name":"item"}]}] String jsonString = "[{\"id\":1,\"items\":[{\"name\":\"item\"}]}]"; Type typeOfT = new TypeToken<List<Outer>>(){}.getType(); List<Outer> result = (List<Outer>) JSONObject.parseArray(jsonString, typeOfT); ``` 以上措施能够有效提高 `JSONArray.parseArray()` 在面对多层次嵌套 JSON 结构时的功率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值