首先在web-inf下建立标签描述tld文件
/*自定义标签步骤
* 首先建立标签处理类 要么实现SimpleTag接口
* 要么继承 SimpleTagSupport类
* 然后写标签的逻辑
*
* 紧接着建立tld标签描述文件
* tld里面有uri用于jsp页面找到这个描述文件
*
* 描述文件中的tag标签代表着一个具体标签
* 在tag标签里的有子标签name:代表标签名 tag-class:标签对应的处理类
* body-content:标签体里的内容是什么类型的
* attribute标签的属性定义
*
*
* 标签的属性 对应着 标签处理类的成员变量 运用到的技术类似于javabean 所以 setget方法是必须的
* */
<?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>
<uri>http://tag.demo.top/mytag</uri>
<tag>
<name>hi</name>
<tag-class>top.demo.tag.MyTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>count</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>fortag</name>
<tag-class>top.demo.tag.ForTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>setName</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>tempName</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>ifpack</name>
<tag-class>top.demo.tag.IfParent</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>if</name>
<tag-class>top.demo.tag.IfSon</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>judge</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<function>
<name>addStr</name>
<function-class>top.demo.tag.ElFunction</function-class>
<function-signature>java.lang.String addStr(java.lang.String,java.lang.String)</function-signature>
</function>
</taglib>
接着去写相关的标签处理类
这是一个没有标签体的简单标签
package top.demo.tag;
import java.io.IOException;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTag;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class MyTag implements SimpleTag {
public PageContext page;
public String value;
public String count;
@Override
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
System.out.println("doTag");
page.getOut().append("hi my tag");
page.getOut().append((page.getRequest().getRemoteHost()));
for(int i=1;i<=Integer.parseInt(count);i++) {
page.getOut().append("<br>");
page.getOut().append(i+"."+value);
}
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getCount() {
return count;
}
public void setCount(String count) {
this.count = count;
}
@Override
public JspTag getParent() {
// TODO Auto-generated method stub
System.out.println("JspTag");
return null;
}
@Override
public void setJspBody(JspFragment arg0) {
// TODO Auto-generated method stub
System.out.println("setJspBody");
}
@Override
public void setJspContext(JspContext arg0) {
// TODO Auto-generated method stub
this.page=(PageContext)arg0;
}
@Override
public void setParent(JspTag arg0) {
// TODO Auto-generated method stub
System.out.println("setParent");
}
}
这是带标签体的标签
package top.demo.tag;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class ForTag extends SimpleTagSupport{
public Object setName;
public String tempName;
public Object getSetName() {
return setName;
}
public void setSetName(Object setName) {
this.setName = setName;
}
public String getTempName() {
return tempName;
}
public void setTempName(String tempName) {
this.tempName = tempName;
}
@Override
public void doTag() throws JspException, IOException {
System.out.println("this fortag start");
if(setName instanceof java.util.Map) {
HashMap<Object,Object> map=(HashMap<Object,Object>)setName;
Set<Entry<Object, Object>> set=map.entrySet();
for(Entry<Object, Object> entry:set) {
getJspContext().setAttribute(tempName, entry);
getJspBody().invoke(null);
}
}else if(setName instanceof List) {
List<String> list=(List<String>)setName;
for(Object t:list) {
getJspContext().setAttribute(this.tempName, t);
getJspBody().invoke(null);
}
}
}
}
有父子关系的标签
- 父标签
package top.demo.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class IfParent extends SimpleTagSupport{
public boolean flag=true;
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
@Override
public void doTag() throws JspException, IOException {
getJspBody().invoke(null);
}
}
2.子标签
package top.demo.tag;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class IfSon extends SimpleTagSupport{
public boolean judge;
public boolean isJudge() {
return judge;
}
public void setJudge(boolean judge) {
this.judge = judge;
}
@Override
public void doTag() throws JspException, IOException {
IfParent parent=(IfParent) getParent();
if(parent.isFlag())
{
if(isJudge())
{
System.out.println("IfSon dotag"+parent);
getJspBody().invoke(null);
/*Writer ww=new StringWriter();
getJspBody().invoke(ww);
System.out.println(ww.toString());*/
parent.setFlag(false);
}
}
}
}
自定义EL函数
package top.demo.tag;
public class ElFunction {
/**
* 自定义el函数的步骤
* 1.创建类
* 2.创建类的静态方法 写好方法
* 3.在tld文件中注册(注意tld本身需要在web.xml文件中注册)
*
* 在web.xml文件中注册 tld
* <jsp-config>
<taglib>
<taglib-uri>http://tag.demo.top/mytag</taglib-uri>
<taglib-location>/WEB-INF/mytag.tld</taglib-location>
</taglib>
</jsp-config>
*
*在tld文件中注册EL函数
* <function>
<name>addStr</name>
<function-class>top.demo.tag.ElFunction</function-class>
<function-signature>java.lang.String addStr(java.lang.String,java.lang.String)</function-signature>
</function>
*
* */
public static String addStr(String s1,String s2) {
return s1+s2;
}
}
在jsp页面测试定义的这些标签 和 函数
<%@page import="java.util.HashMap"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="java.sql.Date"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib uri="http://tag.demo.top/mytag" prefix="MyTag" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<p>这是测试的界面</p>
<%
long time=System.currentTimeMillis() ;
session.setAttribute("check", String.valueOf(time));
%>
<form action="<%=request.getContextPath() %>/go.do" method="post">
<input type="hidden" name="hid" value="<%=time%>">
<input type="text" name="name"/>
<input type="submit" />
<br>
<% HttpSession s=request.getSession();
out.print(s.getId());
s.invalidate();
%>
<br>
${header["cookie"] }
<br>
${pageContext.session.id }
<br>
</form>
<MyTag:hi value="test" count="10"/>
<br>
<% List<String> list=new ArrayList<String>();
list.add("111");
list.add("222");
list.add("333");
request.setAttribute("list", list);
%>
<br>
<MyTag:fortag setName="${list}" tempName="tmp">
${tmp} <br>
</MyTag:fortag>
<br><br>
<%
HashMap<String,String> map=new HashMap<String,String>();
map.put("1", "111");
map.put("2", "222");
map.put("3", "333");
map.put("4", "444");
request.setAttribute("map", map);
%>
<MyTag:fortag setName="${map}" tempName="tmp">
${tmp.key}-----${tmp.value} <br>
</MyTag:fortag>
<br><br>
<MyTag:ifpack>
<MyTag:if judge="${1>2}">1>2</MyTag:if>
<MyTag:if judge="${2>1}">2>1</MyTag:if>
</MyTag:ifpack>
<br><br>
<!-- 使用jstl的EL函数 -->
${fn:length(param.name)}
<br><br>
${MyTag:addStr(param.name,param.name2) }
</body>
</html>
<%@ page language="java" contentType="text/html; charset=utf8"
pageEncoding="utf8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf8">
<title>Insert title here</title>
</head>
<body>
this is jstl test page
<br><br>
<c:out value="123"></c:out>
<c:choose>
<c:when test="${1<0}">1<0</c:when>
<c:otherwise>1</c:otherwise>
</c:choose>
</body>
</html>