自定义标签

5 篇文章 0 订阅
4 篇文章 0 订阅

1)自定义标签主要用于移除Jsp页面中的代码。
2)要使用自定义标签移除jsp页面中的Java代码,只需要完成以下两个步骤:

  • 编写一个实现Tag接口的Java类,把页面Java代码移动到这个Java类中(标签处理器类)
  • 编写标签库描述符(tld)文件,在tld文件中对标签处理器描述成一个标签

3)快速入门:使用标签输出客户机IP

    您的ip是:
    <%
        String ip = request.getRemoteAddr();
        out.print(ip);
    %>
    您的ip是:<fix:viewIP/> //Java tld-->viewIP
步骤一:
public class ViewIPTag extends TagSupport {
        public int doStartTag() throws JspException {
            HttpServletRequest request = (HttpServletRequest) this.pageContext.getRequest();
            //setPageContext方法由服务器先调用,已将pageContext传进来
            JspWriter out = this.pageContext.getOut();
            String ip = request.getRemoteAddr();
            try {
                out.prinlt(ip);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            return super.doStartTag();
        }
    }
步骤二:
1--在WEB-INF文件夹创建tld文件,对标签处理器类进行描述,抄web服务器中相同类型文件
        taglib
            description
            tlib-version
            short-name
            uri
            tag
                name//标签名
                tag-class//类
                body-content//empty表示标签体为空
    2--标签定义完毕,记得把标签绑定到uri上面
步骤三:
页面中使用标签,使用tablib指令导入

4)开发人员在编写Jsp页面时,经常还需要在页面引入一些逻辑,例如
控制jsp页面某一部分内容是否执行
控制jsp页面是否执行
控制jsp页面内容重复执行
修改jsp页面内容输出
自定义标签除了可以移除jsp页面的Java代码外,它也可以实现上述功能(5个功能)

tld文件中的四种标签体类型
    EMPTY //表示标签体为空
    JSP //表示标签体内容为jsp(传统标签里写)
    scriptless //无脚本jsp代码(约束更加严格,去掉jsp中<%%>,简单标签体里不能写JSP)
    tagdepentend

10、传统标签库功能详解
1)控制页面内容(标签体)是否输出(继承TagSupport类)

    通过控制doStartTag()的返回值控制是否显示
    //Tag.EVAL_BODY_INCLUDE表示显示
    //Tag.SKIP_BODY表示跳过内容不显示

2)控制整个jsp是否输出(在页面开头加一个无标签体的标签)(继承TagSupport类)

    通过doEndTag()的返回值来控制
    //Tag.EVAL_PAGE表示继续计算剩下的jsp,即显示标签后的以下内容
    //Tag.SKIP_PAGE表示跳过内容不显示

3)控制某一部分内容重复输出(继承TagSupport类)

    实现Tag接口(见JspTag接口图)无法实现,需要使用IterationTag得到EVAL_BODY_AGAIN
    1--doStartTag方法让标签体输出
    2--控制doAfterBody方法返回IterationTag.EVAL_BODY_AGAIN次数控制循环
    3--tld文件描述
    //doAfterBody方法(每次内容结束就会执行一次)返回IterationTag.EVAL_BODY_AGAIN继续执行,IterationTag.SKIP_BODY结束执行

4)用标签修改jsp页面内容(继承BodyTagSupport类)
实现IterrationTag接口只能实现迭代,无法实现修改,需要使用BodyTag接口
控制doStartTag方法如果返回值BODY.EVAL_BODY_BUFFERED,标签体内容就会封装到bodyContent中,标签内容可以通过getBodyContent得到,最后doEndTag方法需要设置执行剩余的jsp内容
代码:

    return BodyTag.EVAL_BODY_BUFFERED//doStartTag方法内容
    BodyContent bc = this.getBodyContent();//以下为doEndTag方法内容
    String content = bc.getString();//得到内容
    content = content.toUpperCase();//转换为大写
    try {
        this.pageContent.getOut().write(content);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
    return Tag.EVAL_PAGE;//余下的Jsp内容继续执行

5)以上技术现在基本不再使用,但是以前所开发的框架使用的是以上的方式,以上接口都是Jsp2.0之前定义的接口(实现这些接口的标签称为传统标签);在jsp2.0重新定义了SimpleTag接口可以满足以上功能(SimpleTagSupport类)(使用此接口的标签称为简单标签)(见JspTag接口图)

11、简单标签库功能详解(原理见简单标签原理图)
1)控制页面内容(标签体)是否输出(继承SimpleTagSupport类)
通过doTag()方法
代码:

    JspFragment jf = this.getJspBody();
    jf.invoke(this.getJspContext().getOut());//相当于jf.invoke(null),执行输出
    //doTag代码中不写内容就不输出

2)控制整个jsp是否输出(在页面开头加一个无标签体的标签)(继承SimpleTagSupport类)

    通过doTag()方法
    代码:
    throw new SkipPageException();

3)控制某一部分内容重复输出(继承SimpleTagSupport类)
通过doTag()方法
代码:

    JspFragment jf = this.getJspBody();
    for(int i=0;i<5;i++) {
        jf.invoke(null);
    }

4)用标签修改jsp页面内容(继承SimpleTagSupport类)
通过doTag()方法
代码:

    JspFragment jf = this.getJspBody();
    StringWriter sw = new StringWriter();
    jf.invoke(sw);
    String content = sw.toString();
    content = content.toUpperCase();
    this.getJspContext().getOut().write(content);

12、传统标签体与简单标签库区别:
传统标签体会驻留在内存中,等web应用结束时调用release方法销毁。而简单标签体会在dotag方法结束后即销毁

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值