现在我们假定有这样的标签
<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