• java_第一年_JavaWeb(12)


    SimpleTag标签

    定义了五个方法:setJspContext、setJspBody、setParent和getParent以及最重要的doTag方法(完成了所有的业务逻辑);

    • setJspContext方法:将JSP页面的pageContext对象传递给标签处理器对象
    • setJspBody方法:将代表标签体的JspFragment对象传递给标签处理器对象
    • setParent方法:将父标签处理器对象传递给当前标签处理器
    • getParent方法:获取当前标签的服标签处理器对象
    • doTag方法:用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容等

    SimpleTag接口提供了一个默认的实现类SimpleTagSupport,因此在编写时继承和扩展该类即可,再根据业务重写doTag方法;

    范例:是否输出jsp页面的某一部分

    标签处理器类:()

     public void doTag() throws JspException, IOException {
            //得到代表jsp标签体的JspFragment
            JspFragment jspFragment = this.getJspBody();
            
            //得到jsp页面的的PageContext对象
            PageContext pageContext = (PageContext) jspFragment.getJspContext();
            //调用JspWriter将标签体的内容输出到浏览器
            jspFragment.invoke(pageContext.getOut());
            
            //将标签体的内容输出到浏览器
            jspFragment.invoke(null);
            
        }

    提供了两种方法输出标签体内容;而标签体内容如下:

    <%@taglib uri="/xxx" prefix="ttt" %>
    <ttt:tagname>
        xiao兆
    </ttt:tagname>

    进行多次输出:

    public void doTag() throws JspException, IOException {
            // 得到代表jsp标签体的JspFragment
            JspFragment jspFragment = this.getJspBody();
            for (int i = 0; i < 5; i++) {
                // 将标签体的内容输出到浏览器
                jspFragment.invoke(null);
            }
    }

    修改标签体的内容:

    public void doTag() throws JspException, IOException {
            // 得到代表jsp标签体的JspFragment
            JspFragment jspFragment = this.getJspBody();
            StringWriter sw = new StringWriter();
            //将标签体的内容写入到sw流中
            jspFragment.invoke(sw);
            //获取sw流缓冲区的内容
            String content = sw.getBuffer().toString();
            content = content.toUpperCase();
            PageContext pageContext = (PageContext) this.getJspContext();
            //将修改后的content输出到浏览器中
            pageContext.getOut().write(content);
        }

    需要将结果写入一个自定义的缓冲区中,再将缓冲区的内容进行修改后进行输出即可;

    控制余下的jsp页面是否执行:

     public void doTag() throws JspException, IOException {
            //抛出一个SkipPageException异常就可以控制标签余下的Jsp不执行
            throw new SkipPageException();
    }

    jsp页面范例:

     <body>
          <h1>xiao兆</h1>
           <%--在jsp页面中使用自定义标签 --%>
           <ttt:tagname/>
           <!-- 这里的内容位于 <ttt:tagname/>标签后面,因此不会输出到页面上 -->
           <h1>learn</h1>
      </body>

     标签库

    我们在编写标签库时,标签有一个子元素<body-content>,表示标签体的内容,有四种类型:empty、JSP、scriptless、tagdependent;

    而在编写简单标签时是不允许设置JSP类型的;

    其各自代表的含义是:

    empty:表示没有标签体;

    scriptless:表示有标签体,且标签体不可以是java代码;

    JSP:表示有标签体,且标签体可以是java代码,不过使用java代码的话其实就失去了自定义标签的意义了;

    tagdependent:表示该标签体的内容是给标签处理器使用的,用的比较少;

    注意标签库的uri不能设置相同的,所以在设置时候最好带上tld文件的所在目录,降低uri重复的可能性;

    JspFragment类

    web容器在处理简单标签时,会把标签体内容用一个JspFragment对象表示,并调用setJspBody方法把其传递给标签处理器对象,JspFragment类中只定义了两种方法:

    getJspContext方法:返回调用页面的JspContext对象;

    invoke方法:控制是否执行输出、迭代标签体内容或修改后输出,如没调用,则相当于忽略标签体内容;

    带属性的标签体:

    <ttt:tagname count = "5">
        xiao兆
    </ttt:tagname>

    类似上面这种,包含count属性的标签体,其中count可在标签处理器充当一个变量,并通过Jsp页面中的标签体属性赋值给它,如果是8种基本数据类型,在JSP传递字符串时会自动改成相应的类型,不过如同date之类的复合数字类型,则不会进行自动转换,可通过表达式的方式给复合属性赋值,如:

    <%
            Date d = new Date();
            request.setAttribute("date", d);
    %>
          
          <gacl:demo6 date="${date}"/>

    自定义标签的每个属性都要对应一个<attribute>元素,位于<tag>元素里面,<attribute>元素也有多个子元素,用于描述每个属性:

  • 相关阅读:
    IIS7配置URL Rewrite链接重写
    wordpress导航菜单的链接支持弹出新页面
    c++绝对是拯救了世界,特别是程序员
    Linux 磁盘坏道检测和修复
    centos里mysql无法用localhost连接的解决方法
    php扩展开发
    IP多播
    因特网的路由选择协议
    ICMP协议
    ARP协议
  • 原文地址:https://www.cnblogs.com/lzj-learn/p/11643426.html
Copyright © 2020-2023  润新知