JSP中允许我们自定义自己的标签,目前已经发展出来的JSTL的基本内容便是从这里来的,不过别人都是搞研究的,我们能用就行了,不过我们还是要了解一下其中的最基本的地方,那就是如何自定义自己的标签.
下面开始.要自定义标签,首先得知道两个类:TagSupport和BodyTagSupport.BodyTagSupport继承了前面的类,这里仅对TagSupport为例.
我们的标签类必须继承TagSupport类,其中她的重要方法有
int
doStartTag();
int
doEndTag();
void
setParent(Tag t);
void setPageContext(PageContext p); void release();
void setPageContext(PageContext p); void release();
然后来看setParent方法,若该标签有父标签,在JSP容器中会设置这个父标签
接下来是release()方法,它会释放该标签所占用资源,容器调用
现在来看我们要用的两个方法int doStartTag(); int doEndTag()
doStartTag()会在JSP读取到标签开始的时候调用,好比有一个标签
<sss>
</sss>,那么在红色部分就会调用该方法;相应的,在黑色的结束部分就会调用doEndTag().所以,我们要写的东西就可以在这两个方法里面写.同时,这两个方法分别返回int值,在doStartTag()中,若返回TagSupport.EVAL_BODY_INCLUDE则表示标签对中的文字会输出比如<sss>abcd</sss>若要输出abcd,则返回该子段;若TagSupport.SKIP_BODY,则不会处理标签对中的文字;那么doEndTag()中,若返回TagSupport.EVAL_PAGE,则表示该标签结束之后,继续处理剩下的页面内容;若返回TagSupport.SKIP_PAGE,则该标签之后的页面内容全部不会处理;
标签可以拥有属性Attribute,一个属性对应一个标签类中实例变量,需提供获取设置方法.
当完成一个类之后,需要配置该标签类,分别有xx.tld说明文件和在web.xml中配置
说那么多,下面来做一个简单的例子,我们来做一个标签,该标签的作用是在JSP页面上输出一段话,该标签有一个属性name,输出内容中会显示"这是我的标签(换行)你好:name(值)"
首先建立类
package
mypack;
public class HelloTag extends TagSupport ... {
private String name; //name属性
public String getName()...{
return name;
}
public void setName(String name)...{
this.name = name;
}
public int doEndTag() throws JspException...{
JspWriter out = pageContext.getOut(); --pageContext对象以被容器初始化
try...{
out.print(getName()); //获取name属性的值
} catch (IOException e)...{
e.printStackTrace();
}
return TagSupport.EVAL_PAGE; //继续处理其他页面内容
}
public void release() ...{
super.release();
}
public int doStartTag() throws JspException ...{
pageContext.getOut().print("这是我的标签+<br/>");
return TagSupport.EVAL_BODY_INCLUDE; //标签开始要处理标签对中内容
}
}
public class HelloTag extends TagSupport ... {
private String name; //name属性
public String getName()...{
return name;
}
public void setName(String name)...{
this.name = name;
}
public int doEndTag() throws JspException...{
JspWriter out = pageContext.getOut(); --pageContext对象以被容器初始化
try...{
out.print(getName()); //获取name属性的值
} catch (IOException e)...{
e.printStackTrace();
}
return TagSupport.EVAL_PAGE; //继续处理其他页面内容
}
public void release() ...{
super.release();
}
public int doStartTag() throws JspException ...{
pageContext.getOut().print("这是我的标签+<br/>");
return TagSupport.EVAL_BODY_INCLUDE; //标签开始要处理标签对中内容
}
}
下面在WEB-INF下面创建一个hellotag.tld文件,这是一个XML文件,文件的内容如下
下面在web.xml中配置如下信息
<
jsp-config
>
< taglib >
< taglib-uri > /HelloTag </ taglib-uri > --唯一能找到该标签的路径
< taglib-location > /WEB-INF/hellotag.tld </ taglib-location >
--刚才的hellotag.tld的位置
</ taglib >
</ jsp-config >
< taglib >
< taglib-uri > /HelloTag </ taglib-uri > --唯一能找到该标签的路径
< taglib-location > /WEB-INF/hellotag.tld </ taglib-location >
--刚才的hellotag.tld的位置
</ taglib >
</ jsp-config >
接下来在一个JSP页中,我们用
<%@ taglib uri="/HelloTag" prefix="test"%> --uri就是web中配置的,text表示命名空间
引入该标签之后,就可以如下使用了
<body>
<text:hello name="wangxi">你好:</text:hello>
<body/>
其实还有更加直接的就是在Page里直接<%@ taglib uri="[这里和tld中定义的uri要一致]" prefix="前缀" %>