“ 世界就像一面镜子,你笑它便笑 ”
一、继承TagSupport
1、创建普通Java类
这里的类需要继承TagSupport,然后使用继承过来的方法doStartTag(eclipse快捷键:Alt+Shift+s,选择Override/Implement Methosd…)
下面为返回值所表达的意思:
案列1-
——无属性的标签(此标签功能:直接输出字符)
package com.java.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
//引用自定义标签输出“haoren”
public class Mytag extends TagSupport{
@Override
public int doStartTag() throws JspException {
JspWriter out = this.pageContext.getOut();
try {
out.write("haoren");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// TODO Auto-generated method stub
return TagSupport.SKIP_BODY;
}
}
案列2-
——有属性的标签(此标签功能:使用属性更改当前日期输出格式)
package com.java.tag;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
//引用自定义标签输出更改当前日期输出格式
public class FormatDateTag extends TagSupport{
private String formats;
public String getFormats() {
return formats;
}
public void setFormats(String formats) {
this.formats = formats;
}
@Override
public int doStartTag() throws JspException {
//判断是否为空
if(formats!=null){
String date =new SimpleDateFormat(formats).format(new Date());
try {
this.pageContext.getOut().print(date);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// TODO Auto-generated method stub
return TagSupport.SKIP_BODY;
}
}
2、创建tld文件
body-content为标签体的限制,它有4个值:
—— a、empty:不允许有标签体(jsp和html中<>标签体</>)。
—— b、jsp:允许有jsp代码。
—— c、scriptless:不允许有脚本代码(也就是<%%>)。
—— d、tagdepentend:标签体内的JSP代码不会被解析,直接输出文本。
<?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">
<!-- 版本号 -->
<tlib-version>1.0</tlib-version>
<!-- 最好与文件名同名,可任意写 -->
<short-name>mytag</short-name>
<!-- taglib中的uri引入标签时需要,可任意写 -->
<uri>http://www.xinhua.com/mytag</uri>
<tag>
<!-- 标签名 -->
<name>mytag</name>
<!-- 实现类 -->
<tag-class>com.java.tag.Mytag</tag-class>
<!-- empty不允许有标签体 -->
<body-content>empty</body-content>
</tag>
<tag>
<!-- 标签名 -->
<name>dateformat</name>
<!-- 实现类 -->
<tag-class>com.java.tag.FormatDateTag</tag-class>
<!-- empty不允许有标签体 -->
<body-content>empty</body-content>
<attribute>
<!-- 标签属性名-->
<name>formats</name>
<!-- 是否为可选属性 -->
<required>false</required>
<!-- 是否能使用EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
3、Jsp实现自己创建好的标签
别忘了使用taglib引入自己写好的标签
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="m" uri="http://www.xinhua.com/mytag" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<m:mytag/><br>
<!-- 给当前时间给格式 -->
<m:dateformat/>在类里面判断了属性是否为空,所以没有给东西就没有显示<br>
<m:dateformat formats="yyyy/MM/dd"/><br>
<m:dateformat formats="yyyy年MM月dd日 HH时mm分ss秒"/><br>
</body>
</html>
二、继承BodyTagSupport
1、BodyTagSupport类说明
-
BodyTagSupport类的方法:
编写标签对应的实现类时,需要重载BodyTagSupport类几个方法:
doStartTag(), setBodyContent(), doInitBody(), doAfterBody(), doEndTag(); -
他们执行顺序如下:
doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag() -
doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY,
如果返回EVAL_BODY_INCLUDE则继续执行;
如果返回SKIP_BODY则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行,而直接执行doEndTag()方法。 -
setBodyContent()方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。
-
标签体内容执行完后,会调用doAfterBody()方法
此方法可返回 EVAL_BODY_TAG, SKIP_BODY, EVAL_PAGE或SKIP_PAGE。
如果返回EVAL_BODY_TAG则会再次设置标签体内容,直到返回SKIP_BODY;
如果返回EVAL_PAGE则标签体执行完后会继续执行JSP页面中接下来的部分;
如果返回SKIP_PAGE,则JSP页面的后续内容将不再执行。 -
标签中静态常量:
EVAL_BODY_INCLUDE:告诉服务器正文的内容,并把这些内容送入输出流
SKIP_BODY:告诉服务器不要处理正文内容
EVAL_PAGE:让服务器继续执行页面
SKIP_PAGE:让服务器不要处理剩余的页面
EVAL_BODY_AGAIN:让服务器继续处理正文内容,只有doAfterBody方法可以返回
EVAL_BODY_BUFFERED:BodyTag接口的字段,在doStartTag()返回EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回,而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。
a、案列(修改标签体的内容)
(1)、创建普通Java类
需要继承BodyTagSupport
package com.java.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class IIrevise_content extends BodyTagSupport{
private String ss;
public String getSs() {
return ss;
}
public void setSs(String ss) {
this.ss = ss;
}
@Override
public int doStartTag() throws JspException {
return BodyTagSupport.EVAL_BODY_BUFFERED;
}
@Override
public int doEndTag() throws JspException {
BodyContent bc = this.getBodyContent();
String s = bc.getString();
String st = s + ss;
try {
this.pageContext.getOut().print(st);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return BodyTagSupport.EVAL_PAGE;
}
}
(2)、创建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">
<!-- 版本号 -->
<tlib-version>1.0</tlib-version>
<!-- 最好与文件名同名,可任意写 -->
<short-name>mytag</short-name>
<!-- taglib中的uri引入标签时需要,可任意写 -->
<uri>http://www.xinhua.com/mytag</uri>
<tag>
<name>IIrevise_content</name>
<tag-class>com.java.tag.IIrevise_content</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>ss</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
(31)、Jsp实现自己创建好的标签
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="m" uri="http://www.xinhua.com/mytag" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 修改标签体的内容 -->
<m:IIrevise_content ss="好勒">滚 </m:IIrevise_content>
</body>
</html>