jsp&自定义标签

3自定义标签

        当现有的标签无法满足需求的时候,就需要开发者自行开发标签

        需求:获取客户端得IP地址
            <%
                String ip=request.getRemoteHost();
                out.write("当前客户端的IP为"+ip);  
            %>
            使用自定义标签替代以上脚本
            1)导入自定义标签
            <%@ taglib uri="http://dxq.cn" prefix="dxq"%>
            showIp标签:作用可以显示客户的IP地址
            <dxq:showIp>        </dxq:showIp> 

3.1自定义标签出来程序:

            1)开发一个普通的java类,继承 SimpleTagSupport 重写doTage方法
            public class ShowIP extends SimpleTagSupport{
                //

                public void doTag() throws JapException,IoException{
                    1获取客户的IP
                    public class ShowIpTag  extends SimpleTagSupport{
                    private JspContext jspContext;
                    @Override
                    //用于设置PageContext对象
                    //JspContext 是PageContext的父类实际是传入PageContext对象
                    public void setJspContext(JspContext pc) {
                        this.jspContext=pc;
                }
            @Override
                public void doTag() throws JspException, IOException {
                    //1获取客户端IP
                    PageContext pageContext=(PageContext)this.getJspContext();
                    //2通过pageContext获取其8个内置对象
                        HttpServletRequest request= (HttpServletRequest)pageContext.getRequest();
                        String ip=request.getRemoteHost();
                        //3把IP地址输入到浏览器
                        JspWriter out = pageContext.getOut();
                        out.write("当前客户的IP为"+ip);
                }
            }
            自定义tld文件
            2)在项目WEB-INF目录下建立一个tld文件
                <?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>JSTL core</display-name>
              <!-- 标签库版本号 -->
              <tlib-version>1.2</tlib-version>
              <!-- 简单的名称,用于标签库名的前缀 -->
              <short-name>dxq</short-name>
              <!-- 是标签库名的唯一标识 -->
              <uri>http://dxq.cn</uri>

                <!-- 定义一个标签 -->

              <tag>
                <!-- 标签名称    -->
                <name>showIp</name>
                <!-- 标签处理程序的全名 包名+类名 -->
                <tag-class>dxq.ListUser.ShowIpTag</tag-class>
                <!-- 标签输出的格式 -->
                <body-content>scriptless</body-content>
              </tag>
        3)在jsp页面顶部导入自定义标签库
        <%@ taglib uri="http://dxq.cn" prefix="dxq"%>
        4)使用标签库的标签
            <dxq:shoIp></dxq:showIp>

3.2自定义标签的执行过程

        访问:http://localhost:8080/day12/07.tag.jsp
        前提:Tomcat启动的时候,会读取day12项目下的WEB-INF的文件,包括,web.xml和tld文件
            1)翻译成Java文件-》编译成class文件-》构造方法-》调用jspService()方法
            2)在内存的tld文件查询是否存在一个URI名称为http://dxq.cn的tld文件
            3)得到对应的tld文件内容、
            4)读到<dxq:showIp>内容时,截取showIp名称(就是标签),到tld文件中查询是否存在name为showIp
                的tag标签
            5)取出<tag>标签的内容 <tag-class>字符串dxq.ListUser.ShowIpTag

3.3自定义标签的生命周期

        由Tomcat服务器调用
        1)构造方法:构造标签器对象
        2)void setJspContext(pc )  传入PageContext对象 JspContext是PageContext的父类
                            可以使用getJSPContext()方法获取PageContext对象
        3)void setParent(JspTag parent) 传入父标签对象,如果没有父标签,则不调用此方法
                                使用getParent()方法获取父标签
        4)setJspBody(jspBody)       传入标签体内容,如果没有标签体,则不调用此方法 
                                使用getJspBody()获取标签体内容:标签体的内容
                                封装到JspFragment中
        5)void doTage()         调用标签时执行此方法,我们的业务逻辑就卸载这个方法中
                            可以调用getJSPContext()getParent()getJspBody()

3.4自定义标签的作用:

        1)控制标签体内容是否输出
            /**
             * 1)控制标签内容是否输出
             *  输出 :jspbody.invoke(null)
             * 不输出:什么都不做
             */
            //得到标签体内容
            JspFragment jspBody= this.getJspBody();
            //输出标签体内容
            //invoke(Writer writer)执行此方法,可以把标签体内容往指定的writer输出
            JspWriter writer = this.getJspContext().getOut();
            //向浏览器输出标签体内容
            jspBody.invoke(writer);

            //第二种方式
            JspFragment jspbody= this.getJspBody();
            jspBody.invoke(this.getJspContext().getOut());//等价于
            jspbody.invoke(null);//默认情况下就是我那个浏览器输出

        2)控制标签后面的内容是是否输出
            /**
             * 控制标签后面的内容
             *  输出:什么都不做
             * 不输出: 抛出一个SkipPageException异常
             * 
             */
            throw new   SkipPageException();

        3)重复控制标签体内容的输出
            /**
             * 控制重复输出标签体内容
             * 
             */
            JspFragment jspBody = this.getJspBody();
            for(int i=0;i<5;i++){
                jspBody.invoke(null);
            }


        4)改变标签体内容
                /**
                 * 改变标签体内容
                 */
                //1得到标签体内容
                JspFragment jspBody = this.getJspBody();
                //创建一个StingWriter,用来存储标签内容
                    StringWriter sw = new StringWriter();
                //把标签体内容拷贝到StringWriter中
                    jspBody.invoke(sw);
                //得到StringWriter的内容
                    String content= sw.toString();
                //2修改内容
                    content =content.toUpperCase();
                //3.输出修改后的内容
                    this.getJspContext().getOut().write(content);

3.5带有属性的自定义标签:

    1)在标签处理程序,添加一个setXXX方法,用于给属性赋值
        private int num;
        public void setNum(int num){
            this.num=num;
        }
    2.在tld文件中进行配置
        <?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>JSTL core</display-name>
          <!-- 标签库版本号 -->
          <tlib-version>1.2</tlib-version>
          <!-- 简单的名称,用于标签库名的前缀 -->
          <short-name>dxq</short-name>
          <!-- 是标签库名的唯一标识 -->
          <uri>http://dxq.cn</uri>

            <!-- 定义一个标签 -->

          <tag>
            <!-- 标签名称    -->
            <name>showIp</name>
            <!-- 标签处理程序的全名 包名+类名 -->
            <tag-class>dxq.ListUser.ShowIpTag</tag-class>
            <!-- 标签输出的格式 -->
            <body-content>scriptless</body-content>
            <!-- 配置属性 -->
            <attribute>
                <!--属性名称  -->
                <name>num</name>
                <!-- 属性是否必须的:true必须;false可选的 -->
                <required>true</required>
                <!-- 该属性是否可以写EL表达式的内容
                    true:可以写EL
                        false不可以写EL表达式
                     -->
                     <rtexprvalue>false</rtexprvalue>
                </attribute>
              </tag>

3.6标签体内容的输出格式

     <body-content>scriptless</body-content>
    jsp:表示标签体内容可以支持和输出jsp表达式内容(注意:这个配置只能在传统标签中使用)
    scriptless:标签提内容不支持jsp表达式内容
    empty:标签体内容是空的
    tagdependent:标签体内容支持jsp表达式,不输出jsp表达式内容,吧jsp表达式当做字符串处理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值