JSP自定义标签的一些基本知识点以及运用

这几天上党课少听了一节(jsp的自定义标签)。今天借了本图书馆的书再结合小冯给我的讲解。把基本的知识记下来。
我们需要把自定义一个.tld的文件放置在WEB-INF目录下,名字可自定义。配置可参照系统再带的。
添加一个简单的empty自定义的标签格式是:

<tag>
    <name>hello</name>
    <tag-class>com.yc.web.taglibs.HelloTag</tag-class>
    <body-content>empty</body-content>
</tag>

其中 body-content 中还可以配置几个不同的参数
tagdependent:标签体内容直接被写入BodyContent,由自定义标签类来进行处理,而不被JSP容器解释
JSP:接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、JSP指令和动作。
empty:空标记,即起始标记和结束标记之间没有内容。
scriptless:接受文本、EL和JSP动作。

当我们需要在页面传递参数给这个标签的时候我们定义如下:

<tag>
    <name>hello2</name>
    <tag-class>com.yc.web.taglibs.HelloTag2</tag-class>
    <body-content>empty</body-content>
    <attribute>
    <name>name</name>
    <!-- 是否为必填字段,true和false表示 -->
    <required>false</required>
    <!-- 是否支持el表达式 -->
    <rtexprvalue>false</rtexprvalue>
    </attribute>
</tag>

其中需要在attribute节点中加入一些定义。
需要传递参数时注意要设定一个set方法
页面引入时我们需要在页头加上一句
<%@ taglib prefix=”yc” uri=”http://java.itcre.com/taglib/yc” %>
其中的uri为自己在.tld中自己设置的,(自定义标签,所有随便定义一个你喜欢的域名都没关系)。

我们在页面使用这个需要传递的参数的标签:

<yc:hello2 name="Wion"/>

标签对应的实现类需要重载几个类的方法。其中有几个返回值
doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY,
如果返回EVAL_BODY_INCLUDE则继续执行;
如果返回SKIP_BODY则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行
而直接执行doEndTag()方法。

setBodyContent()方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。
标签体内容执行完后,会调用doAfterBody()方法,此方法可返回EVAL_BODY_TAG, SKIP_BODY,
EVAL_PAGE或SKIP_PAGE。
如果返回EVAL_BODY_TAG则会再次设置标签体内容,直到返回SKIP_BODY
如果返回EVAL_PAGE则标签体执行完后会继续执行JSP页面中接下来的部分;
如果返回SKIP_PAGE,则JSP页面的后续内容将不再执行。

对应的,可以实现仿照ForEach。

实现类中这样写:

package com.yc.web.taglibs;

import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

public class ForEachTag extends TagSupport {
    private Collection items;
    private String var;
    private Iterator its;

    public void setItems(Collection items) {
        this.items = items;
    }

    public void setVar(String var) {
        this.var = var;
    }

    @Override
    public int doEndTag() throws JspException {
        return super.EVAL_PAGE;
    }

    @Override
    public int doStartTag() throws JspException {
        if (items == null || items.size() < 0) {
            return super.SKIP_BODY;
        }
        its = items.iterator();
        if (its.hasNext()) {
            Object obj = its.next();
            // 将obj存到pageContext(pagecontext,request,session,application)
            super.pageContext.setAttribute(var, obj);
        }
        // 执行标签体
        return super.EVAL_BODY_INCLUDE;
    }

    @Override
    public int doAfterBody() throws JspException {
        // 判断是否还有下一个,如果有,则再循环body一次
        if (its.hasNext()) {
            Object obj = its.next();
            // 将obj存到pageContext(pagecontext,request,session,application)
            super.pageContext.setAttribute(var, obj);
            return super.EVAL_BODY_AGAIN;
        } else {
            return super.SKIP_BODY;
        }
    }

}

这样配置tab标签:

<tag>
        <name>forEach</name>
        <tag-class>com.yc.web.taglibs.ForEachTag</tag-class>
        <body-content>JSP</body-content>

        <attribute>
            <name>items</name>
            <!-- 是否为必填字duan -->
            <required>true</required>
            <!-- 是否支持el表达式 -->
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>var</name>
            <!-- 是否为必填字duan -->
            <required>false</required>
            <!-- 是否支持el表达式 -->
            <rtexprvalue>false</rtexprvalue>
        </attribute>
    </tag>

在页面使用:

<table border="1">
        <yc:forEach items="${list}" var="v">
            ${v.id} ${v.name} <br/>
        </yc:forEach>
    </table>

自定义标签可以自己打包成一个Jar包,下次方便引用。
打包方法我截图老师的以作查阅:
标记库打包

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值