**总结:
- 都要使用SimpleTagSupport接口
- 熟悉运用IO流
- 重写doTag方法
- 不支持jsp表达式,但支持EL
- rtexprvalue为运行时表达式的值,它支持EL和jsp表达式
**
实例:
1、获取客户端IP地址
2、小写转大写
主页代码:
<%--
Created by IntelliJ IDEA.
User: 梦 溪
Date: 2021/1/23
Time: 14:28
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://www.zidingyi.com/one" prefix="ly"%>
<html>
<head>
<title>副页</title>
</head>
<body>
<%
String name = "xia";
pageContext.setAttribute("name",name);
%>
<ly:Big>${name}</ly:Big><br>
<ly:Big>abc</ly:Big><br>
<ly:IP/><br>
<%--标签属性--%>
<%
boolean gender = true;
pageContext.setAttribute("gender",gender);
%>
<ly:if test="${gender}">男</ly:if>
<ly:if test="${not gender}">女</ly:if>
</body>
</html>
无标签体:
package ly.net.web.Cl;
import javax.servlet.ServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
/**
* 功能:获取客户端IP地址
* */
public class Custom_label extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
// 获取PageContext对象
PageContext pc =(PageContext) this.getJspContext();
// 获取请求对象
ServletRequest request = pc.getRequest();
// 获取对象IP
String clientIP = request.getRemoteAddr();
// 获取标准输出流
JspWriter out = pc.getOut();
// 将IP写入输出流
out.print(clientIP);
}
}
有标签体:
package ly.net.web.Cl;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.io.StringWriter;
public class lowerToUpperTag extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
// 创建输出流,该流可以通过toString方法获取文本
StringWriter sw = new StringWriter();
// 获取标签体对象
JspFragment txt = this.getJspBody();
// 将内容写入输出流
txt.invoke(sw);
// 以文本形式获取到输出流中的内容
String content = sw.toString();
// 小写变大写
content = content.toUpperCase();
// 将转化为的大写内容写入到标准输出流
this.getJspContext().getOut().print(content);
}
}
标签属性:
package ly.net.web.Cl;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
public class IfTag extends SimpleTagSupport {
private boolean test;
public void setTest(boolean test) {
this.test = test;
}
@Override
public void doTag() throws JspException, IOException {
if(test){
// 获取标签体
JspFragment fi = this.getJspBody();
fi.invoke(this.getJspContext().getOut());
}
}
}
配置文件的代码:
<?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>ly</short-name>
<uri>http://www.zidingyi.com/one</uri>
<tag>
<name>IP</name>
<tag-class>ly.net.web.Cl.Custom_label</tag-class>
<body-content>empty</body-content>
</tag>
<tag>
<name>Big</name>
<tag-class>ly.net.web.Cl.lowerToUpperTag</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>if</name>
<tag-class>ly.net.web.Cl.IfTag</tag-class>
<body-content>tagdependent</body-content>
<attribute>
<name>test</name>
<required>true</required>
<!-- 运行时表达式的值-->
<!-- 该属性支持EL与jsp表达式-->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>