java web的标签_JavaWeb:标签(二)

接上一节

setJspContext:

一定会被 JSP 引擎所调用,先于 doTag, 把代表JSP 引擎的 pageContext 传给标签处理器类。

带属性的自定义标签:

1)、先在标签处理器类中定义 setter 方法,建议把所有的属性类型都设置为 String 类型。

例如:

privateString value;privateString count;public voidsetValue(String value) {this.value =value;

}public voidsetCount(String count) {this.count =count;

}

2)、在 .tld 描述文件中来描述属性:

例如:

value

true

true

3)、在页面中使用属性,属性名同 .tld 文件中定义的名字。

例如: 

4)、通常情况下,开发简单标签直接继承 SimpleTagSupport 就可以了,可以直接调用其对应的 getter 方法得到对应的 API 。

1 public class SimpleTagSupport implementsSimpleTag{2

3 public voiddoTag()4 throwsJspException, IOException{}5

6 privateJspTag parentTag;7

8 public voidsetParent( JspTag parent ) {9 this.parentTag =parent;10 }11

12 publicJspTag getParent() {13 return this.parentTag;14 }15

16 privateJspContext jspContext;17

18 public voidsetJspContext( JspContext pc ) {19 this.jspContext =pc;20 }21

22 protectedJspContext getJspContext() {23 return this.jspContext;24 }25

26 privateJspFragment jspBody;27

28 public voidsetJspBody( JspFragment jspBody ) {29 this.jspBody =jspBody;30 }31

32 protectedJspFragment getJspBody() {33 return this.jspBody;34 }35 }

带标签体的自定义标签:

1)、若一个标签有标签体: abcdefg

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

2)、若配置了标签含有标签体,则 JSP 引擎会调用 setJspBody() 方法把 JspFragment 传递给标签处理器类。

在SimpleTagSupport 中还定义了一个 getJspBody() 方法,用于返回 JspFragment 对象。

3)、JspFragment 的 invoke(Wirter) 方法:把标签体内容从 Writer 中输出,若为 null,则等同于 invoke(getJspContext.getOut()),即直接把标签体内容输出到页面上。

有时,可以借助 StringWriter,可以在标签处理器类中先得到标签体的内容:

①、利用 StringWriter 得到标签体的内容。

StringWriter sw = newStringWriter();bodyContent.invoke(sw);

②、把标签体的内容都变为大写

String content = sw.toString().toUpperCase();

4)、在 .tld 文件中,使用 body-content 节点来描述标签体的类型:

: 指定标签体的类型, 大部分情况下, 取值为 scriptless 。可能取值有 3 种:empty: 没有标签体;scriptless: 标签体可以包含 el 表达式和 JSP 动作元素,但不能包含 JSP 的脚本元素;tagdependent: 表示标签体交由标签本身去解析处理。若指定 tagdependent,在标签体中的所有代码都会原封不动的交给标签处理器,而不是将执行结果传递给标签处理器。

例如:tagdependent

5)、定义一个自定义标签: abcdefg  把标签体的内容转为大写,并输出 time  次到浏览器上。

1 public class TestJspFragment extendsSimpleTagSupport {2

3 @Override4 public void doTag() throwsJspException, IOException {5 JspFragment bodyContent =getJspBody();6 //JspFragment.invoke(Witer): Writer 即为标签体内容输出的字符流, 若为 null, 则7 //输出到 getJspContext().getOut(), 即输出到页面上.8

9 //1. 利用 StringWriter 得到标签体的内容.

10 StringWriter sw = newStringWriter();11 bodyContent.invoke(sw);12

13 //2. 把标签体的内容都变为大写

14 String content =sw.toString().toUpperCase();15

16 //3. 获取 JSP 页面的 out 隐含对象, 输出到页面上

17 getJspContext().getOut().print(content);18 }19

20 }

有父标签的标签:

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

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

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

4)、在 .tld 配置文件中,无需为父标签有额外的配置,但,子标签是以标签体的形式存在的,所以父标签的 需设置为 scriptless。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值