<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.itcast.com" prefix="itcast" %><%-- 前缀最好跟描述文件的名称,这样可以通过前缀找到描述文件并很快找到标签 --%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>输出客户机ip</title>
</head>
<body>
您的ip是:
<%
String ip = request.getRemoteAddr();
out.print(ip);
%>
您的ip是:
<itcast:viewIP></itcast:viewIP>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.itcast.com" prefix="itcast" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>使用标签控制页面内容(标签体)是否输出</title>
</head>
<body>
<itcast:demo1>
aaaaaa
</itcast:demo1>
xxxxxxxx
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.itcast.com" prefix="itcast" %>
<itcast:demo2/>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用标签控制整个jsp是否输出</title>
</head>
<body>
This is my JSP page. <br>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.itcast.com" prefix="itcast" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>控制某一部分内容重复执行</title>
</head>
<body>
<itcast:demo3>
This is my JSP page. <br>
</itcast:demo3>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.itcast.com" prefix="itcast" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用标签修改jsp页面内容</title>
</head>
<body>
<itcast:demo4>
aaa
</itcast:demo4>
</body>
</html>
<?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>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>itcast</short-name><!-- 描述文件的名称 -->
<uri>http://www.itcast.com</uri><!-- 描述文件的uri -->
<tag>
<name>viewIP</name><!-- 为标签处理器类配一个标签名称,在jsp页面中使用的标签名称 -->
<tag-class>cn.itcast.web.tag.ViewIPTag</tag-class><!-- 标签处理器类的完整名称 -->
<body-content>empty</body-content><!-- 标签内是否有内容,empty表示没有 -->
</tag>
<tag>
<name>demo1</name>
<tag-class>cn.itcast.web.tag.TagDemo1</tag-class>
<body-content>JSP</body-content><!-- 有标签体,标签体是一段JSP内容,JSP要大写 -->
</tag>
<tag>
<name>demo2</name>
<tag-class>cn.itcast.web.tag.TagDemo2</tag-class>
<body-content>empty</body-content><!-- 有标签体,标签体是一段JSP内容,JSP要大写 -->
</tag>
<tag>
<name>demo3</name>
<tag-class>cn.itcast.web.tag.TagDemo3</tag-class>
<body-content>JSP</body-content><!-- 有标签体,标签体是一段JSP内容,JSP要大写 -->
</tag>
<tag>
<name>demo4</name>
<tag-class>cn.itcast.web.tag.TagDemo4</tag-class>
<body-content>JSP</body-content><!-- 有标签体,标签体是一段JSP内容,JSP要大写 -->
</tag>
</taglib>
package cn.itcast.web.tag;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
//显示客户机IP的标签处理器类
public class ViewIPTag extends TagSupport{
@Override
public int doStartTag() throws JspException {
//拿到要使用的对象
HttpServletRequest request = (HttpServletRequest) this.pageContext.getRequest();
JspWriter out = this.pageContext.getOut();
String ip = request.getRemoteAddr();
try {
out.print(ip);
} catch (IOException e) {
throw new RuntimeException(e);
}
return super.doStartTag();
}
}
package cn.itcast.web.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
//控制jsp页面某一部分内容是否执行
//想要jsp页面某一部分(标签体)是否执行,就要看开始标签执行后是否显示标签体
public class TagDemo1 extends TagSupport {
@Override
public int doStartTag() throws JspException {
//返回Tag.EVAL_BODY_INCLUDE执行标签体
//返回Tag.SKIP_BODY不执行标签体
//return Tag.EVAL_BODY_INCLUDE;
return Tag.SKIP_BODY;
}
}
package cn.itcast.web.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
//用标签控制整个jsp是否输出
//想要控制标签后的JSP是否输出,要看结束标签后面的JSP是否执行
public class TagDemo2 extends TagSupport{
@Override
public int doEndTag() throws JspException {
//返回Tag.EVAL_PAGE执行标签后面的JSP
//返回Tag.SKIP_PAGE不执行标签后面的JSP
return Tag.EVAL_PAGE;
}
}
package cn.itcast.web.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.IterationTag;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
//控制JSP页面重复执行次数
//Tag接口本身没有迭代的功能,IterationTag接口能
//TagSupport是IterationTag接口的实现类
/*
* 想要实现这个效果,首先得确定标签体被执行,要在开始标签结束后执行标签体,
* 然后控制循环执行标签体,定义一个标志位,控制执行次数
*/
public class TagDemo3 extends TagSupport{
//控制标签体执行
@Override
public int doStartTag() throws JspException {
return Tag.EVAL_BODY_INCLUDE;
}
int flag = 0;
//标签体执行之后,结束标签执行之前
@Override
public int doAfterBody() throws JspException {
//返回IterationTag.EVAL_BODY_AGAIN再执行一次标签体,然后会再执行doAfterBody方法
//返回IterationTag.SKIP_BODY就不会再执行标签体了,执行doEndTag方法
flag++;
if(flag<5) {
return IterationTag.EVAL_BODY_AGAIN;
} else {
return IterationTag.SKIP_BODY;
}
}
}
package cn.itcast.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.Tag;
//修改标签体内容
//IterationTag接口没有修改的功能,BodyTag接口能,BodyTag是IterationTag的子类
//BodyTagSupport是TagSupport的子类和BodyTag接口的继承类
/*
* 在修改页面内容的时,继承了BodyTag接口,在调用doStartTag方法的时候,
* 返回BodyTag.EVAL_BODY_BUFFERED 服务器会把标签体对象通过setBodyContext方法传递给标签处理器类,
* 可以在doEndTag方法中拿到标签体,对标签体修改后再输出
*/
public class TagDemo4 extends BodyTagSupport {
@Override
public int doStartTag() throws JspException {
return BodyTag.EVAL_BODY_BUFFERED;
}
@Override
public int doEndTag() throws JspException {
BodyContent bc = this.getBodyContent();
String content = bc.getString();
content = content.toUpperCase();
try {
this.pageContext.getOut().write(content);
} catch (IOException e) {
throw new RuntimeException(e);
}
return Tag.EVAL_PAGE;
}
}
具体文档查看上传资源中的自定义标签文档