J2EE自定义标签:实现“标签作用域”

好吧我们总是喜欢自定义一些名词,这里“标签作用域”是指变量的作用域只在与标签内部,在标签外就获取不到值

标签要求实现的效果大致如下:

jsp页面:

...

<cms:category var="cate" ...>
栏目名称:${cate.name}
栏目文章列表:
<c:forEach var="item" items="${cate.articleList}">
${item.name}<br/>
</c:forEach>
</cms:category>

...

编译后打印出来的html页面:

...

栏目名称:新闻栏目
栏目文章列表:
新闻一
新闻二
新闻三

...
<cms:category>为自定义tag,其内容为获取数据库数据然后传到jsp页面
这里可以通过多种方法从自定义tag传至jsp页面
注意:jsp的4个作用域,最小的为page
而这里我想要的效果是有点类似于返回一个“局域变量”
这个变量只在标签内可用(有值),在标签外不可用,效果如下:
<cms:category var="cate">
${cate} ==>> 有值
</cms:category>
${cate} ==>> 没有值

起初我想到这个效果类似jstl标准库的<c:forEach>标签迭代出来的值只在标签内有效,从jsp角度上看类似于“局域变量”
就这样我新建一个java-web测试项目,但是并没有找到相应的可以设置“局域变量”的方法(这里还傻傻的花了很多时间查资料、调试、战斗)

于是我决定查看<c:forEach>标签源码,发现LoopTagSupport类会去实现一个TryCatchFinally的接口
其实原理很简单,从这个接口名大致就可以看出来一点点玄机吧(到这里,心里独白就是“CNMMD,原来是这样”)
其实并没有设置“局域变量”的方法
在标签中可以使用pageContext.setAttribute()方法返回值,但返回值为page作用域
实现TryCatchFinally接口后会有一个doFinally方法,这个方法会在doEndTag()后调用
然后<c:forEach>标签就是这个doFinally方法中使用pageContext.removeAttribute()销毁返回值的

好了,到这里聪明的小伙伴应该知道怎么实现了吧
额,如有说的不对的地方欢迎指正,谢谢查看。











转载于:https://www.cnblogs.com/liuzm/p/4886807.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值