You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring MVC JSP:Java代码片段变量无法外部访问怎么办?

解决方案:JSP脚本变量无法被EL表达式访问的问题

这个问题的核心是JSP脚本变量和EL表达式的作用域不互通,我给你两种解决方案,优先推荐第一种更规范的写法:

1. 直接利用<c:forEach>的varStatus属性(推荐)

你已经在<c:forEach>里声明了varStatus="loop",这个对象本身就内置了循环相关的索引/计数变量,完全不需要自己定义i:

  • ${loop.index}:从0开始的循环索引(正好对应你想定义的i初始值)
  • ${loop.count}:从1开始的循环计数

修改后的代码示例:

<c:forEach items="${dbEntries}" var="c" varStatus="loop">
    <tr>
        <!-- 直接用loop.index替代你原来的i -->
        <td>${loop.index}</td>
        <td rowspan="1">${c.rh_name}</td> <!-- EL会自动调用getRh_name(),写法更简洁 -->
        <td rowspan="1">${c.ipm_name}</td>
    </tr>
</c:forEach>

小提示:EL表达式里直接写${c.rh_name}即可,不需要手动调用getRh_name(),EL会自动匹配对应的getter方法,这是更符合JSP规范的写法。

2. 把脚本变量存入EL可访问的作用域(不推荐,仅作兼容参考)

如果你一定要保留脚本变量的写法,需要把i存入EL能识别的作用域(比如page作用域),这样${i}才能访问到:

<c:forEach items="${dbEntries}" var="c" varStatus="loop">
    <tr>
        <% 
            int i = 0; 
            System.out.println(i);
            // 将局部变量i存入page作用域,让EL可以查找
            pageContext.setAttribute("i", i);
        %>
        <td>${i}</td>
        <td rowspan="1">${c.rh_name}</td>
        <td rowspan="1">${c.ipm_name}</td>
    </tr>
</c:forEach>

为什么原来的${i}访问不到?因为<% %>里定义的是JSP生成的Servlet中的局部变量,而EL表达式是从page/request/session/application这些作用域中查找属性,两者不在同一个上下文空间,所以直接访问不到。

内容的提问来源于stack exchange,提问作者Bidipta Dauka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:16:48