自定义标签

来源:互联网 发布:淘宝优惠券公众号排名 编辑:程序博客网 时间:2024/05/16 14:34

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
原创粉丝点击