版权声明:转载请注明出处: https://blog.csdn.net/qq_34774655/article/details/83624010
目录
制作高仿的JSTL标签库之核心标签库
通过自定义标签,制作高仿的JSTL标签库之核心标签库。包括:
if标签:单条件判断。
choose标签:多条件判断。
forEach标签:循环输出。
《1》xiaohua.tld文件:
<?xml version="1.0" encoding="UTF-8" ?>
<taglib 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-jsptaglibrary_2_1.xsd"
version="2.1">
<!-- 标签库的版本 -->
<tlib-version>1.1</tlib-version>
<!-- 标签库前缀 -->
<short-name>xiaohua</short-name>
<!-- tld文件的唯一标记 -->
<uri>https://blog.csdn.net/qq_34774655</uri>
<!-- 一个标签的声明 -->
<tag>
<!-- 标签名称 -->
<name>showIp</name>
<!-- 标签处理器类的全名 -->
<tag-class>tag.ShowIpTag</tag-class>
<!-- 输出标签体内容格式 -->
<body-content>scriptless</body-content>
</tag>
<tag>
<name>demoTag</name>
<tag-class>tag.DemoTag</tag-class>
<body-content>scriptless</body-content>
<!-- 属性声明 -->
<attribute>
<!-- 属性名称 -->
<name>num</name>
<!-- 是否必填 -->
<required>true</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
<tag>
<name>if</name>
<tag-class>tag.IfTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>choose</name>
<tag-class>tag.ChooseTag</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>when</name>
<tag-class>tag.WhenTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>otherwise</name>
<tag-class>tag.OtherwiseTag</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>forEach</name>
<tag-class>tag.ForEachTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
《2》依附的各个类:
IfTag.java
package tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
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) {
this.getJspBody().invoke(null);
}
}
}
ChooseTag.java
package tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class ChooseTag extends SimpleTagSupport{
//不是属性,而是临时变量
private boolean flag;
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
@Override
public void doTag() throws JspException, IOException {
this.getJspBody().invoke(null);
}
}
WhenTag.java
package tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class WhenTag extends SimpleTagSupport{
private boolean test;
public boolean isTest() {
return test;
}
public void setTest(boolean test) {
this.test = test;
}
@Override
public void doTag() throws JspException, IOException {
if(test) {
this.getJspBody().invoke(null);
}
//获取父标签,并将test的boolean值传递过去
ChooseTag ct=(ChooseTag)this.getParent();
ct.setFlag(test);
}
}
OtherWiseTag.java
package tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class OtherwiseTag extends SimpleTagSupport{
@Override
public void doTag() throws JspException, IOException {
//通过父标签传递when标签中的test值
ChooseTag ct=(ChooseTag)this.getParent();
boolean test=ct.isFlag();
if(!test) {
this.getJspBody().invoke(null);
}
}
}
ForEachTag.java
package tag;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class ForEachTag extends SimpleTagSupport{
private Object items;//需要遍历的数据 list和map
private String var;//每个元素的名称
public void setItems(Object items) {
this.items=items;
}
public void setVar(String var) {
this.var=var;
}
@Override
public void doTag() throws JspException, IOException {
PageContext pageContext=(PageContext)this.getJspContext();
Collection colls=null;
if(items instanceof List) {
colls=(List)items;
}
if(items instanceof Map) {
colls=((Map) items).entrySet();
}
for(Object object:colls) {
//把每个对象放入域对象中
pageContext.setAttribute(var, object);
this.getJspBody().invoke(null);
}
}
}
《3》imitate.core.jsp文件:
<%@ page language="java" import="java.util.*,entity.Student" pageEncoding="utf-8"%>
<%@taglib uri="https://blog.csdn.net/qq_34774655" prefix="xiaohua"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>高仿的jstl之核心标签库</title>
</head>
<body>
<%--if标签:单条件判断 --%>
<xiaohua:if test="${5>2}">
条件成立,执行。
</xiaohua:if> <br/><hr/>
<%--choose标签:多条件判断 --%>
<c:set var="score" value="80"></c:set>
<xiaohua:choose>
<xiaohua:when test="${score>=90 }">优秀</xiaohua:when>
<xiaohua:when test="${score>=60 && score<90 }">良好</xiaohua:when>
<xiaohua:otherwise>不及格</xiaohua:otherwise>
</xiaohua:choose> <br/><hr/>
<%--forEach标签 --%>
<%
//list
List<Student> list=new ArrayList<Student>();
list.add(new Student("xiaohua", 24));
list.add(new Student("xiaona",24));
pageContext.setAttribute("list", list);
//Map
Map<String,Student> map = new HashMap<String,Student>();
map.put("001",new Student("xiaohua", 24));
map.put("002",new Student("xiaona",24));
pageContext.setAttribute("map",map);
%>
<xiaohua:forEach items="${list}" var="stu" >
姓名: ${stu.name} - 年龄:${stu.age}<br/>
</xiaohua:forEach><hr/>
<xiaohua:forEach items="${map}" var="entry">
序号:${entry.key } - 姓名: ${entry.value.name } - 年龄:${entry.value.age }<br/>
</xiaohua:forEach><hr/>
xiaohua 2018-11-1
</body>
</html>