自定义标签库

1、带属性标签
tld文件内容,复制c标签过来改

<?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">

  <description>JSTL 1.2 core library</description>
  <display-name>dao core</display-name>
  <tlib-version>1.0</tlib-version>
  //类似c标签的名字
  <short-name>uc</short-name>
  //标签的访问地址
  <uri>http://www.eduask.com/user</uri>



  <tag>
    <description>
        This tag is used to manipulate the database
    </description>
        <!-- 定义标签名 -->
    <name>dao</name>
    //标签调用SimpleTagSupport的地址
    <tag-class>com.eduask.date.tag.daotag</tag-class>
    <!-- 定义标签体为空 -->
    <body-content>empty</body-content>
        <!-- 配置标签属性:driver -->
    <attribute>
        <description>
        This tag is used to manipulate the database
        </description>
        //参数
        <name>sql</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute> 
  </tag>

java代码,查询emp表格,重写dotag方法

public class daotag extends SimpleTagSupport{
    private String sql;//参数要get和set方法
    private static DaoImpl dao;
    static{
        dao=DaoImpl.getInstance();
    }
    @Override
    public void doTag() throws JspException, IOException {
        JspWriter out=getJspContext().getOut();
        List<Emp> list=dao.selectTable(new Emp(), sql, null);

        out.write("<table border='1'>");
        for(Emp emp:list){
            out.write("<tr>");  

            out.write("<td>");
            out.write(String.valueOf(emp.getEmpno()));
            out.write("</td>");

            out.write("<td>");
            out.write(emp.getDeptno());
            out.write("</td>");
            out.write("</tr>");
        }
        out.write("</table>");


    }
    public String getSql() {
        return sql;
    }
    public void setSql(String sql) {
        this.sql = sql;
    }
}

2、带标签体的标签
带标签体的标签,可以在内嵌入其他内容(包括静态HTML内容和动态的Jsp内容),通常用于完成一些逻辑运算,例如判断和循环等。

    <tag>
        <!-- 定义标签名 -->
        <name>iterator</name>
        <!-- 定义标签处理类 -->
        <tag-class>com.eduask.mytag.IteratorTag</tag-class>
        <!-- 定义标签体可以是静态的HTML内容,也可以是表达式语言
但不允许出现JSP脚本 -->
        <body-content>scriptless</body-content>
        <!-- 配置标签属性:collection -->
        <attribute>
            <name>collection</name> 
            <required>true</required>
            <fragment>true</fragment>
        </attribute>
        <!-- 配置标签属性:item -->
        <attribute>
            <name>item</name> 
            <required>true</required>
            <fragment>true</fragment>
        </attribute>
    </tag>

java代码

public class IteratorTag extends SimpleTagSupport
{
    // 标签属性,用于指定需要被迭代的集合
    private String collection;
    // 标签属性,指定迭代集合元素,为集合元素指定的名称
    private String item;

    // collection的setter和getter方法
    public void setCollection(String collection)
    {
        this.collection = collection;
    }
    public String getCollection()
    {
        return this.collection;
    }
    // item的setter和getter方法
    public void setItem(String item)
    {
        this.item = item;
    }
    public String getItem()
    {
        return this.item;
    }
    // 标签的处理方法,标签处理类只需要重写doTag()方法
    public void doTag() throws JspException, IOException
    {
        // 从page scope中获取名为collection的集合
        Collection itemList = (Collection)getJspContext().
            getAttribute(collection);
        // 遍历集合
        for (Object s : itemList)
        {
            // 将集合的元素设置到page范围内
            getJspContext().setAttribute(item, s );
            // 输出标签体
            getJspBody().invoke(null);
        }
    }
}

网页代码

<body>
    <h2>带标签体的标签-迭代器标签</h2><hr/>
    <%
    //创建一个List对象
    List<String> a = new ArrayList<String>();
    a.add("床前明月光");
    a.add("十步杀一人");
    a.add("事了拂衣去");
    //将List对象放入page范围内
    pageContext.setAttribute("a" , a);
    %>
    <table border="1" bgcolor="#aaaadd" width="300">
        <!-- 使用迭代器标签,对a集合进行迭代 -->
        <mytag:iterator collection="a" item="item">
        <tr>
            <td>${pageScope.item}</td>
        <tr>
        </mytag:iterator>
    </table>
</body>

3、以页面片段做为属性的标签
只有两个简单的改变。
标签处理类中定义类型为:JspFragment属性,该属性代表了“页面片段”。
使用标签库时,通过

tag>
        <!-- 定义标签名 -->
        <name>fragment</name>
        <!-- 定义标签处理类 -->
        <tag-class>com.eduask.mytag.FragmentTag</tag-class>
        <!-- 指定该标签不支持标签体 -->
        <body-content>empty</body-content>
        <!-- 定义标签属性:fragment -->
        <attribute>
            <name>fragment</name>
            <required>true</required>
            <fragment>true</fragment>
        </attribute>
    </tag>

java代码

public class FragmentTag extends SimpleTagSupport
{
    private JspFragment fragment;

    // fragment的setter和getter方法
    public void setFragment(JspFragment fragment)
    {
        this.fragment = fragment;
    }
    public JspFragment getFragment()
    {
        return this.fragment;
    }
    @Override
    public void doTag() throws JspException, IOException
    {
        JspWriter out = getJspContext().getOut();
        out.println("<div style='padding:10px;border:1px solid black;"
            + ";border-radius:20px'>");
        out.println("<h3>下面是动态传入的JSP片段</h3>");
        // 调用、输出“页面片段”
        fragment.invoke( null );
        out.println("</div");
    }
}

网页代码

<body>
    <myTag:helloWorld/>
    This is my JSP page. <br>

    <myTag:fragment>
    <jsp:attribute name="fragment">
    <%-- 使用jsp:attribute标签传入fragment参数(该注释不能放在fragment内) -->
        <%-- 下面是动态的JSP页面片段 --%>
        <myTag:helloWorld/>
    </jsp:attribute>
</myTag:fragment>
<br/>

    <myTag:fragment>
        <jsp:attribute name="fragment">
            ${pageContext.request.remoteAddr}
        </jsp:attribute>
    </myTag:fragment>   
  </body>

4、动态属性的标签
有时候需要传入自定义标签的属性和个数是不确定的,属性名也不确定,这就需要借助于动态属性的标签了,

动态属性标签比普通标签多了如下两个额外的要求
标签处理类还需要实现DynamicAttributes接口
配置标签时通过子元素指定该标签支持的动态属性

<h2>下面显示的是自定义标签中的内容</h2>
    <h4>指定两个属性</h4>
    <myTag:dynaAttr name="李白" url="www.libai.com" />
    <br />
    <h4>指定四个属性</h4>
    <myTag:dynaAttr 书名="盗墓笔记" 价格="99.0" 出版时间="2008年" 描述="盗墓的书" />
    <br />

本质是for循环

public class DynaAttributesTag
    extends SimpleTagSupport implements DynamicAttributes
{
    // 保存每个属性名的集合
    private ArrayList<String> keys = new ArrayList<String>();
    // 保存每个属性值的集合
    private ArrayList<Object> values = new ArrayList<Object>();

    @Override
    public void doTag() throws JspException, IOException
    {
        JspWriter out = getJspContext().getOut();
        // 此处只是简单地输出每个属性
        out.println("<ol>");
        for( int i = 0; i < keys.size(); i++ )
        {
            String key = keys.get( i );
            Object value = values.get( i );
            out.println( "<li>" + key + " = " + value + "</li>" );
        }
        out.println("</ol>");
    }

    @Override
    public void setDynamicAttribute( String uri, String localName,
        Object value )throws JspException
    {
        // 添加属性名
        keys.add( localName );
        // 添加属性值
        values.add( value );
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值