1)若有一个标签体:
<c1:date >sssssc1:date>
在自定义标签的标签处理器中使用JspFragment对象封装了标签体的信息
2.JspFragment的invoke(Writer)方法:把标签体内容从Writer中输出,若为null,则等同于invole(getJspContext.getOut()),即直接把标签体内容直接输出到页面上
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
super.doTag();
JspFragment bFragment = getJspBody();
// JspFragment.invoke(Writer): Writer即为标签体内容的输出的字符流,若为null则为
// 输出到getJspContext.getOut(),即输出到页面上去
bFragment.invoke(null);
}
大部分情况下取值为tagdependent:
>empty:没有标签体
>scriptless:不能有jsp脚本元素,但是可以有el表达式和JSp动作元素
>tagdependent:表示标签体交由标签体本身去解析处理,若指定为tagdependent,在标签体中的所有代码都会原封不懂的交给标签处理器。而不是将执行结果传给标签处理器
1)父标签无法获取子标签的引用。父标签仅把子标签作为标签体来使用
2)子标签可以通过getParent()方法来获取父标签的引用(需继承SimpleTagSupport或自实现SimpleTag接口中的该方法)若子标签的确有父标签,JSP引擎会把父标签的引用通过setParent(jspTag parent)付给标签处理器
3)注意父标签的类型时JspTag类型,该接口是一个空接口,但是来统一SimpleTag和Tag的,实际使用需要进行强制转换为父标签的处理器类
下列是具体的代码
*****************父标签的处理器类**************
public class FatherTag extends SimpleTagSupport {
private String name;
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
super.doTag();
System.out.println("父类标签正在加载" + name);
//可以通过这个方法来使父标签中的子标签当作一个标签来输出
getJspBody().invoke(null);
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
************************子标签的实现*********************
public class SonTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
super.doTag();
// 1.获取父类标签的对象
JspTag f_Tag = getParent();
// 2.获取这个父类标签中的属性
FatherTag fatherTag = (FatherTag) f_Tag;
String name = fatherTag.getName();
// 3.把name值打印到JSP页面上
getJspContext().getOut().print("子标签正在加载" + name);
}
}