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

来源:互联网 发布:sql语句update语句 编辑:程序博客网 时间:2024/05/22 07:59

比对:
创建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>

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

原创粉丝点击