无法将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
相关产品推荐
相关产品推荐

