带标签体的标签和父标签的标签

  1. 带有标签体的自定义标签

 1)若有一个标签体:

  <c1:date >sssss</c1:date>

 

 在自定义标签的标签处理器中使用JspFragment对象封装了标签体的信息

 

  1. 若配置了标签含有标签体,则jsp会调用setJspBody()方法把JspFragment传递给标签处理类。在SimpleTagSupport中还定义了一个getJspBody()方法用于返回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);

}

 

  1. 在tld文件中,使用<body-content>指定标签体的类型:

 大部分情况下取值为tagdependent:

  >empty:没有标签体

  >scriptless:不能有jsp脚本元素,但是可以有el表达式和JSp动作元素

  >tagdependent:表示标签体交由标签体本身去解析处理,若指定为tagdependent,在标签体中的所有代码都会原封不懂的交给标签处理器。而不是将执行结果传给标签处理器

 

 

 

  1. 开发父标签的标签

  1)父标签无法获取子标签的引用。父标签仅把子标签作为标签体来使用

  2)子标签可以通过getParent()方法来获取父标签的引用(需继承SimpleTagSupport或自实现SimpleTag接口中的该方法)若子标签的确有父标签,JSP引擎会把父标签的引用通过setParent(jspTag parent)付给标签处理器

 3)注意父标签的类型时JspTag类型,该接口是一个空接口,但是来统一SimpleTag和Tag的,实际使用需要进行强制转换为父标签的处理器类

  1. 在tld文件中,无需为父标签有额外的配置,但,子标签是是以标签体的形式存在的。所有父标签的  <body-content>scriptless</body-content> 需要设置为 scriptless

 

下列是具体的代码

*****************父标签的处理器类**************

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);

}

 

}

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章