1、自定义标签
1)继承TagSupport
package com.xiaozhi.web.tag;
import java.io.IOException;
import java.io.Writer;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class ViewIPTag extends TagSupport
{
@Override
public int doStartTag() throws JspException
{
HttpServletRequest request=(HttpServletRequest) this.pageContext.getRequest();
String ip=request.getRemoteAddr();
Writer out=this.pageContext.getOut();
try
{
out.write(ip);
} catch (IOException e)
{
throw new RuntimeException(e);
}
return super.doStartTag();
}
}
2)在WEB-INF下新建xiaozhi.tld(可以抄apache-tomcat-7.0.37.2\webapps\examples\WEB-INF\jsp2\jsp2-example-taglib.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>xiaozhi</short-name>
<uri>http://www.xiaozhi.com</uri>
<tag>
<name>viewIp</name>
<tag-class>com.xiaozhi.web.tag.ViewIPTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
3)在使用自定义标签的jsp导入标签
<%@ taglib uri="http://www.xiaozhi.com" prefix="xiaozhi"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://www.xiaozhi.com" prefix="xiaozhi"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
ip地址为:<xiaozhi:viewIp/>
</body>
</html>
2、执行流程
查看翻译后的servlet
setPageContext(PageContext pc)
setParent(Tag t)
doStartTag()
doEndTag()
release()
3、传统标签库功能:
demo1:
package com.xiaozhi.web.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
public class TagDemo1 extends TagSupport {
//控制jsp页面某一部分内容是否输出。
@Override
public int doStartTag() throws JspException {
return Tag.EVAL_BODY_INCLUDE;
}
}
demo2:
package com.xiaozhi.web.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
public class TagDemo2 extends TagSupport {
//控制整个jsp页面是否执行。
@Override
public int doEndTag() throws JspException {
return Tag.EVAL_PAGE;
}
}
demo3:
package com.xiaozhi.web.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.IterationTag;
import javax.servlet.jsp.tagext.TagSupport;
public class TagDemo3 extends TagSupport
{
//控制jsp页面内容重复输出。
int x=5;
@Override
public int doStartTag() throws JspException
{
return this.EVAL_BODY_INCLUDE;
}
@Override
public int doAfterBody() throws JspException
{
if (x>0){
x--;
return IterationTag.EVAL_BODY_AGAIN;
}
else
return IterationTag.SKIP_BODY;
}
}
demo4:
package com.xiaozhi.web.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTag;
import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.tagext.IterationTag;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
public class TagDemo4 extends BodyTagSupport
{
//修改jsp页面内容输出。
@Override
public int doStartTag() throws JspException
{
return BodyTag.EVAL_BODY_BUFFERED;
}
@Override
public int doEndTag() throws JspException
{
BodyContent content = this.getBodyContent();
String str = content.getString();
str = str.toUpperCase();
try
{
this.pageContext.getOut().write(str);
} catch (IOException e)
{
e.printStackTrace();
}
return Tag.EVAL_PAGE;
}
}
xiaozhi.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>xiaozhi</short-name>
<uri>http://www.xiaozhi.com</uri>
<tag>
<name>tagdemo1</name>
<tag-class>com.xiaozhi.web.tag.TagDemo1</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<name>tagdemo2</name>
<tag-class>com.xiaozhi.web.tag.TagDemo2</tag-class>
<body-content>empty</body-content>
</tag>
<tag>
<name>tagdemo3</name>
<tag-class>com.xiaozhi.web.tag.TagDemo3</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<name>tagdemo4</name>
<tag-class>com.xiaozhi.web.tag.TagDemo4</tag-class>
<body-content>JSP</body-content>
</tag>
</taglib>
index,jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://www.xiaozhi.com" prefix="xiaozhi"%>
<xiaozhi:tagdemo2/>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<xiaozhi:tagdemo1>
aaa
</xiaozhi:tagdemo1>
<br/>
<xiaozhi:tagdemo3>
aaa
</xiaozhi:tagdemo3>
<br/>
<xiaozhi:tagdemo4>
aaa
</xiaozhi:tagdemo4>
</body>
</html>
3、简单标签库功能:
this.getJspBody().invoke(Writer writer);控制往内容输出
通过抛SkipException异常来控制页面是否输出
demo1
package com.xiaozhi.web.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class SimpleDemo1 extends SimpleTagSupport {
//控制jsp页面某一部分内容是否输出。
@Override
public void doTag() throws JspException, IOException {
JspFragment jspFragment=this.getJspBody();
jspFragment.invoke(this.getJspContext().getOut());//jspFragment.invoke(null);
}
}
demo2
package com.xiaozhi.web.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class SimpleDemo2 extends SimpleTagSupport
{
//控制jsp页面内容重复输出。
@Override
public void doTag() throws JspException, IOException
{
JspFragment jspFragment = this.getJspBody();
for (int i = 0; i < 5; i++)
jspFragment.invoke(null);for (int i = 0; i < 5; i++)
this.getJspBody().invoke(null);
}
}
demo3
package com.xiaozhi.web.tag;
import java.io.IOException;
import java.io.StringWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class SimpleDemo3 extends SimpleTagSupport {
//修改jsp页面内容输出。
@Override
public void doTag() throws JspException, IOException {
JspFragment jspFragment=this.getJspBody();
StringWriter stringWriter=new StringWriter();
jspFragment.invoke(stringWriter);
String str=stringWriter.toString();
str=str.toUpperCase();
this.getJspContext().getOut().write(str);
}
}
demo4
package com.xiaozhi.web.tag;
import java.io.IOException;
import java.io.StringWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class SimpleDemo4 extends SimpleTagSupport {
//控制整个jsp页面是否执行。
@Override
public void doTag() throws JspException, IOException {
// throw new SkipPageException();
}
}
demo5
package com.xiaozhi.web.tag;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
//开发带属性的标签
public class SimpleDemo5 extends SimpleTagSupport {
private int num;
private Date date;
public void setNum(int num)
{
this.num = num;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public void doTag() throws JspException, IOException {
this.getJspContext().getOut().write(date.toString());
for (int i=0;i<num;i++)
this.getJspBody().invoke(null);
}
}
xiaozhi.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>xiaozhi</short-name>
<uri>http://www.xiaozhi.com</uri>
<tag>
<name>simpledemo1</name>
<tag-class>com.xiaozhi.web.tag.SimpleDemo1</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>simpledemo2</name>
<tag-class>com.xiaozhi.web.tag.SimpleDemo2</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>simpledemo3</name>
<tag-class>com.xiaozhi.web.tag.SimpleDemo3</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>simpledemo4</name>
<tag-class>com.xiaozhi.web.tag.SimpleDemo4</tag-class>
<body-content>empty</body-content>
</tag>
<tag>
<name>simpledemo5</name>
<tag-class>com.xiaozhi.web.tag.SimpleDemo5</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>num</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>date</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://www.xiaozhi.com" prefix="xiaozhi"%>
<xiaozhi:simpledemo4/>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<xiaozhi:simpledemo1>
aaaa
</xiaozhi:simpledemo1>
<xiaozhi:simpledemo2>
aaaa
</xiaozhi:simpledemo2>
<xiaozhi:simpledemo3>
aaaa
</xiaozhi:simpledemo3>
<xiaozhi:simpledemo5 num="8" date="<%=new Date()%>">
aaaa
</xiaozhi:simpledemo5>
</body>
</html>