jsp之有标签体的标签、带参数的标签

比对:
创建servlet:创建一个servlet必须实现Servlet,然后在web.xml中配置,这是servlet的根本。
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
Servlet类是个接口,里面包含了servlet的生命周期,每次创建一个servlet必须实现该接口以及该接口里面的所有方法。
弊端:Servlet接口里的方法有一些是我们用不到的,如果都实现就显得麻烦。
解决:自己手动创建一个MyGenericServlet抽象类,实现Servlet接口并实现接口里的一些通用的方法,我们创建servlet时只需去继承MyGenericServlet类即可。
实际上,已经有了这样的一个GenericServlet抽象类,该类不仅实现了Servlet接口,同时还实现了ServletConfig接口,这样就扩展了GenericServlet类的功能。
但是在开发过程当中我们创建servlet是去继承HttpServlet抽象类,该类继承GenericServlet抽象类,里面的方法更多更丰富。

创建自定义标签:
创建自定义标签需创建一个标签处理器类实现SimpleTag,然后手动创建一个xml配置文件配置。和创建servlet是类似的。
这里写图片描述
这里写图片描述
这里写图片描述
通常我们是去继承SimpleTagSupport类来创建一个自定义标签处理器类,通过该类创建自定义标签只需要根据需求重写doTag()方法,如果我们想获取JspContext,直接调用getJspContext(),这样一来就比较方便。
MyTag2.java

package com.atguigu.taglib;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;

/**
 * 通过继承SimpleTagSupport来创建一个自定义标签
 * @author lilichao
 *
 */
public class MyTag2 extends SimpleTagSupport {

    @Override
    public void doTag() throws JspException, IOException {
        //向页面输出一个内容
        JspWriter out = getJspContext().getOut();

        //通过out对象向页面中输出一个内容
        out.print("<h3>这是我的第二个自定义标签</h3>");
    }

}

===============================

创建带有标签体的标签:
什么是带有标签体的标签,就是在jsp页面中使用jsp自定义标签的时候,标签体里面是带有内容的。

    <a:MyTag3>
        我是MyTag3的标签体
    </a:MyTag3>

该标签即所谓的带有标签体的标签。

那怎么去实现呢,1、创建标签处理器类;2、手动创建xml配置文件,配置标签处理器类。
1、创建标签处理器类MyTag3.java

package com.atguigu.taglib;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

/**
 * 有标签体的标签
 * @author lilichao
 *
 */
public class MyTag3 extends SimpleTagSupport {

    @Override
    public void doTag() throws JspException, IOException {

        //获取out对象
        JspWriter out = getJspContext().getOut();

        //让标签体内容在页面中执行
        //获取标签体
        JspFragment body = getJspBody();
        //在标签体执行之前加点内容
        out.print("=====================寂寞的分割线========================<br />");
        //执行标签体
        body.invoke(out);
        //在标签体执行完成以后再加点内容
        out.print("<br />=====================寂寞的分割线========================<br />");

    }

}

该类继承SimpleTagSupport类,重写doTag方法,要使得标签处理器类能够处理标签体,必须调用父类的getJspBody方法获得标签体类。
2、手动创建xml配置文件atguigu-taglib.tld,配置标签处理器类,该配置文件可以配置多个tag标签,即可以同时配置多个标签处理器类。

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ">

    <tlib-version>1.0</tlib-version>
    <short-name>a</short-name>
    <uri>http://www.atguigu.com/taglib/a</uri>

    <tag>
        <name>MyTag</name>
        <tag-class>com.atguigu.taglib.MyTag</tag-class>
        <body-content>empty</body-content>
    </tag>

    <tag>
        <name>MyTag2</name>
        <tag-class>com.atguigu.taglib.MyTag2</tag-class>
        <body-content>empty</body-content>
    </tag>

    <tag>
        <name>MyTag3</name>
        <tag-class>com.atguigu.taglib.MyTag3</tag-class>
        <body-content>scriptless</body-content>
    </tag>
</taglib>

当标签体里有内容的时候

<body-content>scriptless</body-content>

不能再写成empty,为了能够服务器自动解析标签体里的EL表达式的时候必须是scriptless,其它的JSP、tagdependent这两个者一般不太常用。

==============================

创建带参数的标签:
什么是带参数的标签:类似html标签里的属性,带参数的标签就是说该标签带有属性,想要使用自定义标签带有属性,必须在配置文件里配置。

<a:MyTag4 test="${!empty param.name}">
        <a:MyTag3>
            您填写的name属性为 ${param.name }
        </a:MyTag3>
    </a:MyTag4>

模拟Java中if语句的功能
实现:1、创建标签处理器类;2、手动创建xml配置文件,配置标签处理器类。
1、创建标签处理器类MyTag4.java继承SimpleTagSupport类。

package com.atguigu.taglib;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;

/**
 * 模拟Java中if语句的功能
 * <if test="true">
        内容
    </if> 
 * @author lilichao
 *
 */
public class MyTag4 extends SimpleTagSupport {

    /**
     *  在处理器类中顶一个test属性
     */
    private boolean test;

    /**
     * 当标签中有属性时,只需要为指定的属性提供一个set方法,那么服务器会自动调用set方法为属性赋值
     * @param test
     */
    public void setTest(boolean test) {
        this.test = test;
    }

    @Override
    public void doTag() throws JspException, IOException {

        //如果test为true则执行标签体
        if(test){
            //执行标签体
            //getJspBody().invoke()可以传一个null,当传一个null作为参数时,他会默认在当前页面执行
            //getJspBody().invoke(null);

            JspWriter out = getJspContext().getOut();
            getJspBody().invoke(out);
        }

    }

}

如果使用的标签有属性,那么标签处理类应该有这样的一个属性,这里模拟Java中的if语句,if语句里面含有条件判断,如果为真,执行方法体,如果为假就不执行,所以创建的自定义标签处理器类必须有这样的一个条件标识标量,定义为布尔值。
2、手动创建xml配置文件atguigu-taglib.tld:

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ">

    <tlib-version>1.0</tlib-version>
    <short-name>a</short-name>
    <uri>http://www.atguigu.com/taglib/a</uri>

    <tag>
        <name>MyTag</name>
        <tag-class>com.atguigu.taglib.MyTag</tag-class>
        <body-content>empty</body-content>
    </tag>

    <tag>
        <name>MyTag2</name>
        <tag-class>com.atguigu.taglib.MyTag2</tag-class>
        <body-content>empty</body-content>
    </tag>

    <tag>
        <name>MyTag3</name>
        <tag-class>com.atguigu.taglib.MyTag3</tag-class>
        <body-content>scriptless</body-content>
    </tag>
    <tag>
        <name>MyTag4</name>
        <tag-class>com.atguigu.taglib.MyTag4</tag-class>
        <body-content>scriptless</body-content>
        <attribute>
            <name>test</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>

</taglib>

最后一个就是配置带有参数的标签,属性名name为test、是否必须为true、是否自动解析el表达式为true。这样配置完成后,在jsp页面通过taglib指令引入该配置文件,就可以使用配置好的标签。使用带参数的标签:

<a:MyTag4 test="${!empty param.name}">
        <a:MyTag3>
            您填写的name属性为 ${param.name }
        </a:MyTag3>
    </a:MyTag4>

============================

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值