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

无法将Scriptlet变量传入EL函数调用的问题排查

如何在EL函数调用中正确使用Scriptlet变量?

你遇到的问题其实是JSP里Scriptlet和EL作用域不互通的典型问题——Scriptlet中定义的局部变量,默认不在EL的可访问范围内。EL表达式只会从page、request、session、application这四大作用域,或者pageContext上下文里查找属性,而你在<% %>里定义的mb和f只是当前脚本块的局部变量,EL根本找不到它们,所以传入函数的自然是null。

下面给你两种可行的解决办法,结合你的代码修改:

方法1:将Scriptlet变量存入页面/请求作用域

把Scriptlet里的变量放到pageContext(仅当前页面有效)或者request作用域中,让EL能“看到”它们。修改后的JSP代码如下:

<!DOCTYPE html>
<html>
<head>
<%@ page import="java.util.LinkedList" %>
<%@ page import="com.glass.MyBean" %>
<%@ taglib prefix="fn_" uri="/WEB-INF/tags.tld" %>
</head>
<body>
<% 
// 从request获取数据
LinkedList<MyBean> mb = (LinkedList<MyBean>)request.getAttribute("mBean"); 
// 存入pageContext,供EL访问
pageContext.setAttribute("mb", mb);

String f = "first"; 
pageContext.setAttribute("f", f);
%>
<td>${fn_:getMyBean(mb, f)}</td>
</body>
</html>

注意:你之前把Java代码写在<script>标签里是错误的,<script>是用来写前端JS的,里面的Java代码会被当作文本输出,完全起不到作用,必须移到<% %>脚本块中。

方法2:直接用EL获取request属性,减少Scriptlet

既然mb本来就是从request里拿的,其实可以完全跳过Scriptlet,直接用EL的requestScope对象获取:

<!DOCTYPE html>
<html>
<head>
<%@ taglib prefix="fn_" uri="/WEB-INF/tags.tld" %>
</head>
<body>
<% 
String f = "first"; 
pageContext.setAttribute("f", f);
%>
<td>${fn_:getMyBean(requestScope.mBean, f)}</td>
</body>
</html>

这种写法更符合现代JSP的最佳实践——尽量用EL和JSTL替代Scriptlet,让代码更简洁易维护。

额外注意事项

  • 你的标签库定义里uri是http://some.thing/mine,但JSP中引用的是/WEB-INF/tags.tld,两者要保持一致。要么把JSP的taglib改成<%@ taglib prefix="fn_" uri="http://some.thing/mine" %>,同时在web.xml中配置该URI对应的tld文件路径;要么统一用文件路径引用。
  • 你的Java类方法是静态方法,这一点是正确的——EL函数要求必须是静态方法,这部分你没出错。

修改后再运行,EL就能正确获取到f的值,输出应该是Hit! first了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:17:34