一、自定义标签的作用
1、消除JSP中的java脚本。自定义标签也属于JSP中的一部分技术。
2、javax.servlet.jsp.tagext.Tag接口:标签处理类需要实现的接口
常量:
int EVAL_BODY_INCLUDE:为doStartTag服务,指示还要处理标签的主体内容。
int EVAL_PAGE:为doEndTag服务,指示还要处理结束标签后的其他JSP内容。
int SKIP_BODY:为doStartTag服务,指示忽略标签的主体内容。
int SKIP_PAGE:为doEndTag服务,指示忽略结束标签后的其他JSP内容。
方法:方法都是由容器调用,包括标签处理类也是由容器实例化的。
int doEndTag():遇到结束标签时,容器调用。
int doStartTag():遇到开始标签时,容器调用。
Tag getParent():获取父标签
void release():释放标签占用的资源
void setPageContext(PageContext pc):容器调用。标签处理类实例化后,容器会把PageContext对象传给你。
void setParent(Tag t):设置父标签。容器调用。
二、自定义标签的开发步骤,快速入门,执行原理和过程
1、定义一个类实现javax.servlet.jsp.tagext.Tag接口或者继承TagSupport,该类称为标签处理类
package com.itheima.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class ShowRemoteIpTag extends TagSupport {
public int doStartTag() throws JspException {
String ip = pageContext.getRequest().getRemoteAddr();
try {
pageContext.getOut().write(ip);
} catch (IOException e) {
e.printStackTrace();
}
return super.doStartTag();
}
}
2、在WEB-INF目录下建立一个扩展名为tld的xml文件。用于对标签处理类进行描述。(参考Tomcat中的tld文件)
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" 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"
version="2.0">
<description>dsfds</description>
<tlib-version>1.0</tlib-version>
<short-name>itheima</short-name>
<uri>http://www.itheima.com/jsp/tag</uri>
<tag>
<description>show remote ip</description>
<name>showRemoteIp</name>
<tag-class>com.itheima.tag.ShowRemoteIpTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
3、在web。xml中对tld的实际存放位置和tld中的uri进行匹配。(可选步骤,前提是tld放到了WEB-INF目录或者类路径下)
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
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-app_2_5.xsd">
<jsp-config>
<taglib>
<taglib-uri>http://www.itheima.com/jsp/tag</taglib-uri>
<taglib-location>/WEB-INF/itheima.tld</taglib-location>
</taglib>
</jsp-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
4、在JSP中使用
<%@ taglib uri="http://www.itheima.com/jsp/tag" prefix="itheima"%>
三、自定义标签可以完成的功能
1、IterationTag接口。扩展了Tag接口。增加了重复执行主体内容的方法
int doAfterBody():
Tag.SKIP_BODY:忽略主体内容
IterationTag.EVAL_BODY_AGAIN:执行自己again
2、BodyTag接口.扩展了Iteration接口。获取主体内容的方法。
int EVAL_BODY_BUFFERED:
void doInitBody() :容器来调用
void setBodyContent(BodyContent b):b封装了主体内容。容器来调用
四、传统标签详解
五、JSP中自定义标签核心类图
六、简单标签,执行原理和过程
1、javax.servlet.jsp.tagext.SimpleTag
方法:
void doTag():遇到标签容器调用。
JspTag getParent():获取父标签,如果有的话。
void setJspBody(JspFragment jspBody):容器调用,传入标签的主体内容。JspFragment代表主体内容
void setJspContext(JspContext pc):容器调用。标签处理类实例化后,容器会把PageContext对象传给你。
void setParent(JspTag t):设置父标签。容器调用。
七、tld文件主要标签详解
taglib:根元素
short-name:引用时的短名称
uri:绑定的名称空间
tag:用于描述一个标签
name:标签的名称
tag-class:标签对应的处理类。全名
body-content:指示标签的主体内容的类型。
可选值:
empty:没有主体内容。
JSP:有主体内容。服务于传统标签。JSP文件中能出现啥,主体内容就能出现啥。
scriptless:服务于简单标签。主体内容不能出现java脚本或表达式。
tagdependent:把主体内容原封不动的传递给标签处理类。
attribute:用于描述属性
name:属性名称
required:true|false|yes|no。指示该属性是否是必须的。
rtexprvalue:true|false|yes|no。指示属性的取值是否支持表达式(EL或者Java表达式)
1、消除JSP中的java脚本。自定义标签也属于JSP中的一部分技术。
2、javax.servlet.jsp.tagext.Tag接口:标签处理类需要实现的接口
常量:
int EVAL_BODY_INCLUDE:为doStartTag服务,指示还要处理标签的主体内容。
int EVAL_PAGE:为doEndTag服务,指示还要处理结束标签后的其他JSP内容。
int SKIP_BODY:为doStartTag服务,指示忽略标签的主体内容。
int SKIP_PAGE:为doEndTag服务,指示忽略结束标签后的其他JSP内容。
方法:方法都是由容器调用,包括标签处理类也是由容器实例化的。
int doEndTag():遇到结束标签时,容器调用。
int doStartTag():遇到开始标签时,容器调用。
Tag getParent():获取父标签
void release():释放标签占用的资源
void setPageContext(PageContext pc):容器调用。标签处理类实例化后,容器会把PageContext对象传给你。
void setParent(Tag t):设置父标签。容器调用。
二、自定义标签的开发步骤,快速入门,执行原理和过程
1、定义一个类实现javax.servlet.jsp.tagext.Tag接口或者继承TagSupport,该类称为标签处理类
package com.itheima.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class ShowRemoteIpTag extends TagSupport {
public int doStartTag() throws JspException {
String ip = pageContext.getRequest().getRemoteAddr();
try {
pageContext.getOut().write(ip);
} catch (IOException e) {
e.printStackTrace();
}
return super.doStartTag();
}
}
2、在WEB-INF目录下建立一个扩展名为tld的xml文件。用于对标签处理类进行描述。(参考Tomcat中的tld文件)
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" 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"
version="2.0">
<description>dsfds</description>
<tlib-version>1.0</tlib-version>
<short-name>itheima</short-name>
<uri>http://www.itheima.com/jsp/tag</uri>
<tag>
<description>show remote ip</description>
<name>showRemoteIp</name>
<tag-class>com.itheima.tag.ShowRemoteIpTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
3、在web。xml中对tld的实际存放位置和tld中的uri进行匹配。(可选步骤,前提是tld放到了WEB-INF目录或者类路径下)
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
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-app_2_5.xsd">
<jsp-config>
<taglib>
<taglib-uri>http://www.itheima.com/jsp/tag</taglib-uri>
<taglib-location>/WEB-INF/itheima.tld</taglib-location>
</taglib>
</jsp-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
4、在JSP中使用
<%@ taglib uri="http://www.itheima.com/jsp/tag" prefix="itheima"%>
三、自定义标签可以完成的功能
1、IterationTag接口。扩展了Tag接口。增加了重复执行主体内容的方法
int doAfterBody():
Tag.SKIP_BODY:忽略主体内容
IterationTag.EVAL_BODY_AGAIN:执行自己again
2、BodyTag接口.扩展了Iteration接口。获取主体内容的方法。
int EVAL_BODY_BUFFERED:
void doInitBody() :容器来调用
void setBodyContent(BodyContent b):b封装了主体内容。容器来调用
四、传统标签详解
五、JSP中自定义标签核心类图
六、简单标签,执行原理和过程
1、javax.servlet.jsp.tagext.SimpleTag
方法:
void doTag():遇到标签容器调用。
JspTag getParent():获取父标签,如果有的话。
void setJspBody(JspFragment jspBody):容器调用,传入标签的主体内容。JspFragment代表主体内容
void setJspContext(JspContext pc):容器调用。标签处理类实例化后,容器会把PageContext对象传给你。
void setParent(JspTag t):设置父标签。容器调用。
七、tld文件主要标签详解
taglib:根元素
short-name:引用时的短名称
uri:绑定的名称空间
tag:用于描述一个标签
name:标签的名称
tag-class:标签对应的处理类。全名
body-content:指示标签的主体内容的类型。
可选值:
empty:没有主体内容。
JSP:有主体内容。服务于传统标签。JSP文件中能出现啥,主体内容就能出现啥。
scriptless:服务于简单标签。主体内容不能出现java脚本或表达式。
tagdependent:把主体内容原封不动的传递给标签处理类。
attribute:用于描述属性
name:属性名称
required:true|false|yes|no。指示该属性是否是必须的。
rtexprvalue:true|false|yes|no。指示属性的取值是否支持表达式(EL或者Java表达式)