自定义标签----笔记

首先在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);

            }


        }


    }



}

有父子关系的标签

  1. 父标签
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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值