JSTL.自定义标签

自定义标签:

  1. 实现Tag接口,即传统标签。不建议使用!
  2. 实现SimpleTag接口,即简单标签。建议使用!
    JavaWeb中还提供了SimpleTagSupport类,继承它要比实现SimpleTag接口方便。


自定义标签

1. 步骤
*标签处理类(标签也是一个对象,那么就需要先有类!)
*tld文件,它是一个xml
*页面中使用<%@taglib%>来指定tld文件的位置


2. 标签处理类

SimpleTag接口:
*void doTag():每次执行标签时都会调用这个方法;
*JspTag getParent():返回父标签(非生命周期方法)
*void setParent(JspTag):设置父标签
*void setJspBody(JspFragment):设置标签体
*void seetJspContext(JspContext):设置jsp上下文对象,它儿子是PageContext

其中doTag()会在其他三个方法之后被tomcat调用。
标签处理类:继承SimpleTagSupport类
这里写图片描述

public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
// 获取JspContext对象,再获取out对象,再向页面输出
// 获取到的JspContext其实就是当前页面的pageContext对象
this.getJspContext().getOut().write(“

Hello SimpleTag!

”) ;
}
}


3. 配置tld文件,一个tld文件中可以部署多个标签

tld文件一般都放到WEB-INF之下,这样保证客户端访问不到!

myTag1 指定当前标签的名称
cn.itcast.tag.MyTag1 指定当前标签的标签处理类!
empty 指定标签体的类型,我们这里使用的是空标签!

标签描述符文件(tld)

/WEB-INF/tlds/itcast.tld

<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee";
    xmlns:xml="http://www.w3.org/XML/1998/namespace";
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ">
    <tlib-version>1.0tlib-version>
    <short-name>itcastshort-name>
    <uri>http://www.itcast.cn/tagsuri>;
    <tag>
        <name>helloname> 
        <tag-class>cn.itcast.tag.HelloTagtag-class> 
        <body-content>emptybody-content> 
    tag>
taglib>


4. jsp页面中使用自定义标签

<%@ taglib prefix=”it” uri=”/WEB-INF/tlds/itcast-tag.tld” %>
……

导标签库,就是为页面指定tld文件的位置!


有标签体的标签

1. 标签处理类
public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
PageContext pc = (PageContext) this.getJspContext();
HttpServletRequest req = (HttpServletRequest) pc.getRequest();
String s = req.getParameter(“exec”);
if(s != null && s.endsWith(“true”)) {
// 获取标签体对象
JspFragment body = this.getJspBody() ;
// 执行标签体
body.invoke (null);
}
}
}

2. tld

hello
cn.itcast.tags.HelloTag
scriptless


进阶

标签体内容
* empty:无标签体!
* JSP:jsp2.0已经不在支持这个类型了!表示标签体内容可以是:java脚本,可以是标签,可以是el表达式
* scriptless:只能是EL表达式,也可以是其他的标签!
* tagdependent:标签体内容不会被执行,而是直接赋值标签处理类!

不在执行标签下面内容的标签!
在标签处理类中的doTag()中使用SkipPageException来结束!
  Tomcat会调用标签处理类的doTag()方法,然后Tomcat会得到SkipPageException,它会跳过本页面其他内容!

public void doTag() throws JspException, IOException {
    this.getJspContext().getOut().print("

只能看到我!

"); throw new **SkipPageException**(); }

带有属性的标签
步骤:
1. 给你的标签处理类添加属性!
  为标签处理类添加属性,属性至少要且一个set方法!这个set方法会在doTag()方法之前被tomcat执行!所在doTag()中就可以使用属性了。
public class IfTag extends SimpleTagSupport {
private boolean test;//设置属性,提供getter/setter方法
public boolean isTest() {
return test;
}
public void setTest (boolean test) {
this.test = test;
}
@Override
public void doTag() throws JspException, IOException {
if(test) {//如果test为true,执行标签体内容
this.getJspBody().invoke(null);
这里写图片描述
}
}
}

2. 在tld文件中对属性进行配置

 <tag>
        <name>ifname>
        <tag-class>cn.itcast.tag.IfTagtag-class>
        <body-content>scriptlessbody-content>
        
        <attribute>
            <name>testname> 
            <required>truerequired> 
            <rtexprvalue>truertexprvalue> 
        attribute>
    tag>

你可能感兴趣的:(JavaWeb)