如何在JSP自定义.tag标签文件中访问对应JSP页面的变量
答案
默认情况下你无法直接在tagsDemo.tag中通过${id}获取demo.jsp里定义的page作用域id变量。
原因说明
JSP标签文件(.tag)拥有独立的PageContext页面上下文,你在demo.jsp中写的<c:set var="id" value="48848"></c:set>没有显式指定作用域,默认会把变量存入当前JSP页面的page作用域,该作用域的变量仅在demo.jsp自身的上下文内生效,标签文件默认无法直接读取。
可行的实现方案
你可以根据自己的场景选下面任意一种方式实现变量访问:
- 方案1(最规范推荐):调用标签时显式传参
这是自定义标签的标准用法,耦合度最低,可维护性最好:- 在demo.jsp调用标签的位置,把变量作为标签属性传入:
<t:tagsDemo id="${id}" />- 在tagsDemo.tag文件开头声明接收的属性:
<%@ attribute name="id" required="true" type="java.lang.Integer" %>- 声明完成后,直接在标签文件里用
${id}就能拿到传入的值。
- 方案2:扩大变量作用域
如果你不想传参,可以在demo.jsp定义变量时显式指定共享范围的作用域,修改<c:set>标签增加scope属性:
改完之后不需要额外配置,直接在tagsDemo.tag里写<!-- 存入request作用域,当前请求内所有资源都能访问 --> <c:set var="id" value="48848" scope="request"></c:set>${id}就能取到值,session、application作用域同理也可以直接访问,但注意这两个作用域的变量生命周期更长,非必要不要随意使用避免变量污染。 - 方案3(不推荐):跨上下文查找属性
如果你既不想传参也不想改变量作用域,可以直接在标签文件里用JSP上下文的查找方法获取变量:
这个方法会依次从page、request、session、application四个作用域遍历查找对应名称的属性,能拿到demo.jsp里定义的page作用域id值,但这种写法强依赖调用页的变量名,耦合度极高,正式项目不要用。${jspContext.findAttribute("id")}
内容的提问来源于stack exchange,提问作者Santushti Sharma
相关产品推荐
相关产品推荐

