SCWCD之路——自定义标签库开发 博客分类: SCWCD Certification JSPJavaEEWebServletXML
介绍
在考试中对标签的考查占的比重十分重要,这其中又分自定义标签开发和标准标签库开发。自定义标签开发主要考查程序员是否对各个与标签相关的接口中的方法是否熟悉,倒并不会要程序员去开发一个比较复杂的标签;而标准标签库开发主要考查一些重要标签的使用形式,比较简单。这部分的内容将分成两篇文章来讲述。
标签扩展可以看成是一个Java类,它类似于JavaBean,但是具有比JavaBean更强大的运行时功能。因为它与JSP的逻辑联系更加紧密,同时它又能像JavaBean那样具有业务逻辑处理能力。所有的标签都必须直接或间接地继承javax.servlet.jsp.tagext.JspTag接口,一般都直接通过继承其子类Tag、BodyTag、IterationTag和SimpleTag来开发自定义标签。考试中对于这几个接口的考查较多,必须清楚它们的关系:
1)JspTag是所有标签的父接口,它没有声明任何属性和方法。
2)Tag接口继承了JspTag,它声明了四个属性,分别是SKIP_BODY、EVAL_BODY_INCLUDE、EVAL_PAGE和SKIP_PAGE,方法则有两个,分别是doStartTag()方法和doEndTag()方法。
3)IterationTag接口继承了Tag,它在Tag的基础上新加了属性EVAL_BODY_AGAIN和方法doAfterBody()。
4)BodyTag接口继承了IterationTag,它在IterationTag的基础长又增加了两个属性,分别是EVAL_BODY_BUFFERED和EVAL_BODY_TAG,方法则增加了doInitBody()和setBodyContent()两个方法。
5)DynamicAttributes接口用来开发接收动态参数的标签,它有一个setDynamicAttribute()的方法。
Tag标签开发
Tag的声明周期一般分为:
1)setPageContext():设置标签的页面上下文。
2)setParent():设置该标签的上一级标签,如果没有嵌套则设置为null。
3)设置该标签的属性,没有则略过。
4)doStartTag():返回SKIP_BODY或EVAL_BODY_INCLUDE,如果是前者则跳过,后者则计算标签主体。
5)doEndTag():返回EVAL_PAGE或SKIP_PAGE,如果是前者则继续处理JSP页面的其他部分,否则停止处理。
6)release():释放标签占用的资源。
下面通过一个例子来说明开发自定义标签的一般步骤:
1)开发标签的实现类,如:
package mytag; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspTagException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.Tag; /** * 这是一个显示“Hello world”的标签 * @author zhouych */ public class MyTag implements Tag { private PageContext pageContext; private Tag parent; public MyTag() { super(); } @Override public void setPageContext(PageContext pc) { this.pageContext = pc; } @Override public void setParent(Tag t) { this.parent = t; } @Override public Tag getParent() { return parent; } @Override public int doStartTag() throws JspException { return SKIP_BODY; } @Override public int doEndTag() throws JspException { try { pageContext.getOut().write("Hello world"); } catch (Exception e) { throw new JspTagException("IO Error: " + e.getMessage()); } return EVAL_PAGE; } @Override public void release() { // 暂时没有占用资源 } }
2)编写标签的描述性文件(后缀名是tld),一般做法是在WEB-INF文件夹下新建一个tlds的文件夹来存放这些标签描述文件,如:
<?xml version="1.0" encoding="UTF-8"?> <taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"> <tlib-version>1.0</tlib-version> <short-name>mytag</short-name> <uri>/WEB-INF/tlds/demotag</uri> <tag> <name>helloworld</name> <tag-class>mytag.HelloWorldTag</tag-class> <body-content>empty</body-content><!—表示标签体必须为空--> <description>一个打印Hello world的标签</description> </tag> </taglib>
需要注意 的是在<body-content>中只允许填入如下内容,这个是考试重点
a)empty:表示标签体为空。
b)jsp:表示标签体可以是任何有效的JSP代码。
c)tagdependent:表示标签体内容不是由Servlet容器处理而是由标签处理器来处理,即不同于平常的是将执行能够结果传递给标签处理器。
d)scriptless:表示标签体可以包含EL表达式和JSP动作元素等,但不能包含JSP的脚本元素。
3)在web.xml文件中指定对标签的引用(节选)
<web-app> <jsp-config> <taglib> <taglib-uri>/WEB-INF/tlds/demotag</taglib-uri> <taglib-location>/WEB-INF/tlds/mytag.tld</taglib-location> </taglib> </jsp-config> </web-app>
4)之后编写一个JSP页面来进行测试
<%@taglib uri="/WEB-INF/tlds/demotag" prefix="hello" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>JSP Page</title> </head> <body> <hello:helloworld /> </body> </html>
在浏览器中输入上述页面的地址即可看到输出Hello world,如下图: