JSTL自定义标签二SimpleTagSupport(二)

 现在我们假定有这样的标签

<r:SimpleTagHasAttribute dogs="${dogs}">
   	 		dogName : ${dog.name }<br />
   	 		dogAge : ${dog.age } <br />
</r:SimpleTagHasAttribute>

这段标签就是遍历我们Dogs中的每一个Dog(这个是我们自定义的Model)  ,在这里我们只是为了学习自定义标签里面的内容,所以单纯的遍历你应该是使用foreach标签

这个标签有一个dogs的属性,然后我们要遍历这个dogs里面的类容。


第一步:创建 SimpleTagHasAttribute继承SimpleTagSupport

public class SimpleTagHasAttribute extends SimpleTagSupport{

	private List<Dog> dogs ;
	
	public void setDogs(List<Dog> dogs) {
		this.dogs = dogs;
	}
	
	@Override
	public void doTag() throws JspException, IOException {
		super.doTag();
 		if(dogs != null && dogs.size() > 0 ){
			for(Dog dog : dogs ){
				getJspContext().setAttribute("dog", dog);
				getJspBody().invoke(null);
			}
		}
	}
}
重写doTag()方法里面有List<Dog> dogs 成员变量 。在我们的JSP页面有遇到这个标签的时候,他会自动的调用我们的SetDogs方法。然后才会执行doTag() 方法


第一步:创建我们TLD (这里我是在原来的文件添加一个Tag的XMl标签)

     <tag>
		<name>SimpleTagHasAttribute</name>
		<tag-class>com.jstl.tlds.SimpleTagHasAttribute</tag-class>
		<body-content>scriptless</body-content>
		<attribute>
			<name>dogs</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
 		</attribute>
	</tag>



getJspBody().invoke(null)前面的文章说了,就是执行我们标记体里面的内容,并且向页面输出值

参数是一个Write对象,一般是null表示向页面输出,当然也可以是一个你自己定义的writer

dogName : ${dog.name }
dogAge :  ${dog.age } 
就是输出dog的Name 和Age 。在执行invoke方法之前,我们循环的调用了getJspContext().setAttribute("dog",dog); 方法目的就是在pageContext 中添加dog对象,那么在遇到上面的body的时候就会有dog对象了,那么就可以打印出dog的属性了

getJspContext 返回的jspContext 他是PageContext的一个子类,里面包含了获取各个作用域的属性的方法

1.getJspContext().getAttribute(name, scope)  两个参数的scope 可以取值page ,request ,session ,context

2.getJspContext().findAttribute(name) 这个方法会page -->request -->session -- >context 去查找如果查询到对应Name的值,立即放回

3.getJspContext().getAttribute(name) 默认只会在page 作用域去查找属性


getJspContext() 本身就是一个PageContext,如果你是获取request,session,serlvetContext .这些对象执行方法的时候那么你需要把这个对象强制转型为pageContext..比如使用PageContext context = (PageContext) getJspContext();


对于TLD中的Tag标签

1.一个属性对应一个attribute ,多个属性就是有多个attribute

2.name 表示我们的属性名 。这个和simpleTagSupport 中的属性名是一样的,同时在继承类中要有set方法

3.required 表示是否是必须的

4.rtexprvalue 表示是否接受EL表达式 jsp标签



doTag()方法是可以抛出JspException 异常

其中如果抛出JspException  表示是这个这个JSP生成出错。

如果是抛出SkipPageException 那么表示的是我前面生成的就可以显示出来,而这个标签后面的内容就不用处理。

  注意这里是“这个标签” ,如果是标签在页面包含的时候就会出现,被包含的的标签后面的内容没有处理,而包含的页面后面的内容还是照样输出



知识:1.JspException 

    2.JspContext





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值