首页 > 代码库 > Taglib
Taglib
1. 创建客户化JSP标签的步骤:
1). 创建标签的处理类
2). 创建标签库描述文件
3). 在JSP文件中引入标签库,然后插入标签
2. Servlet容器编译JSP网页时,如果遇到自定义标签,就会调用这个标签的处理类。
3. 标签处理类必须扩展以下两个类之一:
javax.servlet.jsp.tagext.TagSupport
javax.servlet.jsp.tagext.BodyTagSupport
4. TagSupport类的主要方法:
doStartTag:Servlet容器遇到自定义标签的起始标志时调用该方法
doEndTag:Servlet容器遇到自定义标签的结束标志时调用该方法
5. TagSupport类的主要方法:
setValue(String k,Object o):在标签处理类中设置key/value
getValue(String k):在标签处理类中根据参数key返回匹配的value
removeValue(String k):在标签处理类中删除key/value
setPageContext(PageContext pc):设置PageContext对象,该方法由Servlet容器在调用doStartTag或doEndTag方法前调用
setParent(Tag t):设置嵌套了当前标签的上层标签的处理类,该方法由Servlet容器在调用doStartTag或doEndTag方法前调用
getParent():返回嵌套了当前标签的上层标签的处理类
6. TagSupport类的两个重要属性:
parent:代表嵌套了当前标签的上层标签的处理类
pageContext:代表Web应用中的javax.servlet.jsp.PageContext对象
7. JSP容器在调用doStartTag或doEndTag方法前,会先调用setPageContext和setParent方法,设置pageContext和 parent。
8. 在doStartTag或doEndTag方法中可以通过getParent方法获取上层标签的处理类;
9. 在TagSupport类中定义了protected类型的pageContext成员变量,因此在标签处理类中可以直接访问pageContext变量。
10. PageContext类提供了保存和访问Web应用的共享数据的方法:
public void setAttribute(String name, Object value, int scope)
public Object getAttribute(String name, int scope)
其中,scope参数用来指定属性存在的范围,它的可选值包括:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE
例如: pageContext.setAttribute(“username”,”zhangsan”,PageContext.SESSION_SCOPE);
11. TagSupport类的处理标签方法:
public int doStartTag() throws JspException
public int doEndTag() throws JspException
12. doStartTag()方法:当Servlet容器遇到自定义标签的起始标志,就会调用doStartTag()方法。doStartTag()方法返回一个整数值,用来决定程序的后续流程。
它有两个可选值:
Tag.SKIP_BODY // 表示标签之间的内容被忽略
Tag.EVAL_BODY_INCLUDE // 表示标签之间的内容被正常执行
例如对于以下代码:
<prefix: Mytag>
Hello
……
</prefix:Mytag>
假若<Mytag>的doStartTag()方法返回Tag.SKIP_BODY,”Hello” 字符串不会显示在网页上;若返回Tag.EVAL_BODY_INCLUDE,“Hello” 字符串
将显示在网页上。
13. doEndTag()方法:当Servlet容器遇到自定义标签的结束标志,就会调用doEndTag()方法。doEndTag()方法也返回一个整数值,用来决定程序后续流程。
它有两个可选值:
Tag.SKIP_PAGE //表示立刻停止执行JSP网页,网页上未处理的静态内容和JSP程序均被忽略,任何已有的输出//内容立刻返回到客户的浏览器上。
Tag.EVAL_PAGE // 表示按正常的流程继续执行JSP网页。
14. 用户自定义标签属性:
在标签中还能包含自定义的属性,例如:
<prefix:mytag username=“zhangsan">
……
</prefix:mytag>
在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法,假定以上username为String类型,可以定义如下方法:
private String username;
public void setUsername(String value){
this.username=value;
}
public String getUsername(){
return username;
}
15. 创建Tag Library的描述文件以“.tld”结尾,这个文件存放位置为/WEB-INF/下。
16. JSP文件中调用Taglib指令步骤:
1). 引入标签库。例如:<%@ taglib uri="/mytaglib" prefix="mm" %>
uri是taglib的路径,与.tld文件中的uri属性保持一致。prefix属性用来指定引用taglib标签库时的前缀。
2). 插入标签,例如:<mm:hello/> // mm与prefix保持一致,hello与.tld文件中的<tag><name>保持一致
17. taglib举例:
<tag>
<name>message</name>
<tagclass>com.jsp.tag.MessageTag</tagclass>
<bodycontent>empty</bodycontent>
<info>produce message by key</info>
<attribute>
<name>key</name>
<required>true</required>
</attribute>
</tag>
18. TagSupport与BodyTagSupport的区别主要是标签处理类是否需要与标签体交互,如果不需要交互的就用TagSupport,否则如果需要交互就用BodyTagSupport。
交互就是标签处理类是否要读取标签体的内容和改变标签体返回的内容。用TagSupport实现的标签,都可以用BodyTagSupport来实现,因为BodyTagSupport继承
了TagSupport。
Taglib