1010cc时时彩标准版 > 三分时时彩1010CC > 自定义标签,学习笔记_Java_day13_JSTL_自定义标签库

原标题:自定义标签,学习笔记_Java_day13_JSTL_自定义标签库

浏览次数:53 时间:2019-08-16

自定义jsp标签,jsp标签

自定义标签

 

一、创造自定义标签基本步骤

一、成立自定义标签基本步骤

建贰个index.jsp模拟Servlet中的操作

 

 

  • jsp自定义标签
    • 概述
    • 一贯不标签宗旨的价签
    • 富含标签主体的标签
1 自定义标签概述

 

1.1 自定义标签的步子

实质上大家在JSP页面中动用标签就相当于调用某些对象的某部方法一致,比如:<c:if test=””>,这正是在调用对象的方法一致。自定义标签其实便是自定义类同样!

l  定义标签管理类:必须是Tag或SimpleTag的兑现类;

l  编写标签库描述符文件(TLD);

 

SimpleTag接口是JSP2.0中新付出的接口,用来简化自定义标签,所以今后大家基本上都以运用SimpleTag。

Tag是老的,守旧的自定义标签时使用的接口,现在不建议利用它了。

 

1.2 SimpleTag接口介绍

SimpleTag接口内容如下:

l  void doTag():标签施行措施;

l  JspTag getParent():获取父标签;

l  void setParent(JspTag parent):设置父标签

l  void setJspContext(JspContext context):设置PageContext

l  void setJspBody(JspFragment jspBody):设置标签体对象;

 

请记住,万物皆对象!在JSP页面中的标签也是目的!你能够通过查看JSP的“真身”清楚的明白,全体标签都会化为对象的主意调用。标签对应的类大家称为“标签管理类”!

标签的生命周期:

  1. 当容器(汤姆cat)第贰次实践到有些标签时,会创造标签管理类的实例;
  2. 接下来调用setJspContext(JspContext)方法,把当下JSP页面包车型大巴pageContext对象传递给那些办法;
  3. 即使当前标签有父标签,那么使用父标签的价签管理类对象调用setParent(JspTag)方法;
  4. 举例标签有标签体,那么把标签体转变来JspFragment对象,然后调用setJspBody()方法;
  5. 老是实践标签时,都调用doTag()方法,它是标签管理措施。

 

HelloTag.java

public class HelloTag implements SimpleTag {

    private JspTag parent;

    private PageContext pageContext;

    private JspFragment jspBody;

   

    public void doTag() throws JspException, IOException {

       pageContext.getOut().print("Hello Tag!!!");[崔1] 

    }

    public void setParent(JspTag parent) {

       this.parent = parent;

    }

    public JspTag getParent() {

       return this.parent;

    }

    public void setJspContext(JspContext pc) {

       this.pageContext = (PageContext) pc;

    }

    public void setJspBody(JspFragment jspBody) {

       this.jspBody = jspBody;

    }

}

 

1.3 标签库描述文件(TLD)

标签库描述文件是用来叙述当前标签库中的标签的!标签库描述文件的扩充名字为tld,你能够把它放到WEB-INF下,那样就不会被客户端间接待上访谈到了。

hello.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>[崔2] 

    <short-name>itcast</short-name>[崔3] 

    <uri>http://www.itcast.cn/tags</uri>[崔4] 

    <tag>[崔5] 

       <name>hello</name>[崔6] 

       <tag-class>cn.itcast.tag.HelloTag</tag-class>[崔7] 

       <body-content>empty</body-content>[崔8] 

    </tag>

</taglib>

 

1.4 使用标签

在页面中运用标签分为两步:

l  使用taglib导入标签库;

l  使用标签;

 

<%@ taglib prefix="it" [崔9] uri="/WEB-INF/hello.tld"[崔10]  %>

......

<it:hello/>

 

1、步骤

1、步骤

图片 1

概述

自定义标签须求贯彻SimpleTag接口,在概念标签的时候,只须求达成该接口的多少个法子就足以了.

  • ` void setJspContext(JspContext pc)
    • 私下认可传入PageContext对象
    • 通过PageContext对象实现操作
  • void setParent(JspTag parent)
    • 比方有父标签,则实行该方法,未有的话,就不进行了
  • void setJspBody(JspFragment jspBody)
    • 把代表标签体的JspFragment对象传进来
  • void doTag()
    • 施行标签

在调用自定义标签的时候,会暗许调用者多少个方法.并且推行是有种种的,顺序正是地方这一个样子.
其中:
JspFragment表示某些对象中的部分JSP代码,在simpleTag接口中,正是JSP标签的正文部分.
JspFragment对象中有贰个void invoke(Writer out)能够施行该有的,并将全数出口定向到给定 Writer,若是 out 为 null,则将出口定向到与该部分关联的 JspContext 的 getOut() 方法重临的 JspWriter

2 自定义标签进级

2.1 继承SimpleTagSupport

  承袭SimpleTagSuppport要比完结SimpleTag接口方便太多了,现在你只需求重写doTag()方法,其他方法都早就被SimpleTagSuppport完结了。

 

public class HelloTag extends SimpleTagSupport {

    public void doTag() throws JspException, IOException {

       this.getJspContext().getOut().write("<p>Hello SimpleTag!</p>")[崔11] ;

    }

}

 

2.2 有标签体的标签

咱俩先来看看标签体内容的可选值:

<body-content>成分的可选值有:

l  empty:无标签体。

l  JSP:古板标签帮助它,SimpleTag已经不再支持使用<body-content>JSP</body-content>。标签体内容能够是任张忠西:EL、JSTL、<%=%>、<%%>,以及html;

l  scriptless:标签体内容无法是Java脚本,但足以是EL、JSTL等。在SimpleTag中,假使供给有标签体,那么就采取该选用

l  tagdependent:标签体内容不做运算,由标签管理类自行管理,无论标签体内容是EL、JSP、JSTL,都不会做运算。那么些选项差非常少未有人会利用!

 

自定义有标签体的价签要求:

l  获取标签体对象:JspFragment jspBody = getJspBody();;

l  把标签体内容输出到页面:jspBody.invoke(null);

l  tld中钦命标签内容类型:scriptless。

 

public class HelloTag extends SimpleTagSupport {

    public void doTag() throws JspException, IOException {

       PageContext pc = (PageContext) this.getJspContext();

       HttpServletRequest req = (HttpServletRequest) pc.getRequest();

       String s = req.getParameter("exec");

       if(s != null && s.endsWith("true")) {

           JspFragment body = this.getJspBody()[崔12] ;

           body.invoke[崔13] (null);

       }

    }

}

    <tag>

       <name>hello</name>

       <tag-class>cn.itcast.tags.HelloTag</tag-class>

       <body-content>scriptless</body-content>[崔14] 

    </tag>

    <itcast:hello>

        <h1>哈哈哈~</h1>

    </itcast:hello>

 

2.3 不推行标签上边包车型地铁页面内容

  即使指望在施行了自定义标签后,不再实施JSP页面上边包车型大巴事物,那么就必要在doTag()方法中选用SkipPageException。

public class SkipTag extends SimpleTagSupport {

    public void doTag() throws JspException, IOException {

       this.getJspContext().getOut().print("<h1>只能看到我!</h1>");

       throw new SkipPageException();

    }

}

    <tag>

       <name>skip</name>

       <tag-class>cn.itcast.tags.SkipTag</tag-class>

       <body-content>empty</body-content>

    </tag>

  <itcast:skip/>

  <h1>看不见我!</h1>

 

2.4 带有属性的竹签

  一般标签都会蕴藏属性,比如<c:if test=””>,当中test正是四个boolean类型的天性。完结带有属性的价签须要:

l  在拍卖类中给出JavaBean属性(提供get/set方法);

l  在TLD中部属相关属性。

 

public class IfTag extends SimpleTagSupport {

    private boolean test;

    public boolean isTest() {

       return test;

    }

    public void setTest[崔15] (boolean test) {

       this.test = test;

    }

    @Override

    public void doTag() throws JspException, IOException {

       if(test) {

           this.getJspBody().invoke(null);

       }[崔16] 

    }

}

    <tag>

       <name>if</name>

       <tag-class>cn.itcast.tag.IfTag</tag-class>

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

       <attribute>[崔17] 

           <name>test</name>[崔18] 

           <required>true</required>[崔19] 

           <rtexprvalue>true</rtexprvalue>[崔20] 

       </attribute>

    </tag>

<%

    pageContext.setAttribute("one", true);

    pageContext.setAttribute("two", false);

%>

<it:if test="${one }">xixi</it:if>[崔21] 

<it:if test="${two }">haha</it:if>[崔22] 

<it:if test="true">hehe</it:if>[崔23] 


 [崔1]获取out对象,输出Hello Tag!!!

 [崔2]钦点当前标签库的版本

 [崔3]点名当前标签库的简称,这些称呼无所谓了,随意起。

 [崔4]点名标签库的uri

 [崔5]配备一个标签!二个<tag>表示四个标签。

 [崔6]钦定标签的名目

 [崔7]钦赐标签管理类

 [崔8]内定标签体内容类型为空类型,即未有标签体。

 [崔9]钦赐标签库前缀

 [崔10]钦赐标签库的tld文件地点

 [崔11]向页面输出!注意,不能够向页面输出<%%>东西!

 [崔12]赢得当前标签的标签体对象

 [崔13]向页面输出标签体内容。

 [崔14]钦命标签体内容为scriptless,即标签体内容能够是例行的html,也能够是EL或JSTL

 [崔15]该方法会在doTag()以前被调用,传入属性值。

 [崔16]假使test为true,推行标签体内容,不然怎么样都不做。

 [崔17]扬言属性

 [崔18]属性名为test

 [崔19]为true表示属性是必须的,为false表示属性为可选的。

为true表示 [崔20]属性值可以为EL或JSTL,不然表示只可以是常量。

 [崔21]能够看看xixi

 [崔22]不会举行haha

 [崔23]可以看出hehe

标签管理类(标签也是多个指标,那么就须要先有类!)

标签管理类(标签也是一个对象,那么就须求先有类!)

testtag.jsp

平昔不标签大旨的标签

S1:达成贰个类
java ee提供了三个SimpleTag的完成类,在应用的时候,能够一直接轨这一个类,然后采取要求的法门重写就能够了.

package userDefinedJspTag;

import java.io.IOException;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class TagDemo1 extends SimpleTagSupport {

    private PageContext pc;

    @Override
    public void setJspContext(JspContext pc) {
        this.pc = (PageContext) pc;
    }

    @Override
    public void doTag() throws JspException, IOException {
        pc.getOut().print("hello");
    }

}

S2:编辑TLD配置文件
跟自定义el函数大概,只是这里运用的是tag标签.

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
 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>myfn</short-name>
 <uri>http://www.thecatcher/mytag</uri>


 <!-- 配置自定义标签 -->
 <tag>
    <name>printHi</name>
    <tag-class>userDefinedJspTag.TagDemo1</tag-class>
    <body-content>empty</body-content>
 </tag>
 </taglib>

S3:JSP文件中引进并利用

...
<%@ taglib uri="http://www.thecatcher/mytag"  prefix="mytag"%>
...
<mytag:printHi/>

tld文件,它是五个xml

tld文件,它是多少个xml

图片 2

包蕴标签主体的标签

含有主体的竹签,跟不带大旨的标签大概.
doTag()方法里,声爱他美个JspFragment,然后invoke一下就足以了

public void doTag() throws JspException, IOException {
        JspFragment jf = this.getJspBody();
        //  jf.invoke(pc.getOut());
        //把这里写成null的话,服务器底还是会自动给丫传入一个out的.
        jf.invoke(null);
    }

TLD的配置也可能有一点点不相同,body-content这里不可能再写empty了.
body-content有五个值可选:

  • empty:空,不带主体
  • JSP:支持EL表明式,java代码等的主体
  • scriptless:不扶助java代码,不过EL表达式等照旧足以行使的.
  • tagdependent:不扶助全数总计的形式. EL表明式中的计算不会举办解析.

运用EL表明式,jsp标签的基本点目标正是缩短java代码的使用. 所以带主体的竹签最常用的那几个天性正是scriptless.

 <tag>
    <name>out</name>
    <tag-class>userDefinedJspTag.TagDemo2</tag-class>
    <body-content>scriptless</body-content>
 </tag>

使用的时候也很简单,那样就足以了.
<mytag:out>你好啊.</mytag:out>

jsp自定义标签 概述 未有标签大旨的标签 带有标签主体的价签 概述 自定义标签必要完结SimpleTag接口,在概念标签的时...

页面中应用<%@taglib%>来钦赐tld文件的岗位

页面中运用<%@taglib%>来内定tld文件的地方

启动tomcat,访问index.jsp

2、标签管理类

2、标签管理类

图片 3

SimpleTag接口

SimpleTag接口

步向jstl的宗旨jar包和规范包到lib中

  • void doTag():每一回施行标签时都会调用这几个形式;
  • JspTag getParent():重临父标签(非生命周期方法)
  • void setParent(JspTag):设置父标签
  • void setJspBody(JspFragment):设置标签体
  • void setJspContext(JspContext):设置jsp上下文对象,它的子类是PageContext
  • void doTag():每回施行标签时都会调用这么些主意;
  • JspTag getParent():再次回到父标签(非生命周期方法)
  • void setParent(JspTag):设置父标签
  • void setJspBody(JspFragment):设置标签体
  • void setJspContext(JspContext):设置jsp上下文对象,它的子类是PageContext

图片 4

  在那之中doTag()会在其他八个法子之后被汤姆cat调用。

  在那之中doTag()会在别的多个主意之后被汤姆cat调用。

投入标签库

3、配置tld文件

3、配置tld文件

图片 5图片 6图片 7

tld文件一般都置于WEB-INF之下,这样保障客户端访谈不到。

tld文件一般都停放WEB-INF之下,那样保险客户端访谈不到。

作用前边边的一样

<tag>
       <name>MyTag1</name>   指定当前标签的名称
       <tag-class>tag.MyTag1</tag-class>  指定当前标签的标签处理类
       <body-content>empty</body-content> 指定标签体的类型,我们这里使用的是空标签。
</tag>
<tag>
       <name>MyTag1</name>   指定当前标签的名称
       <tag-class>tag.MyTag1</tag-class>  指定当前标签的标签处理类
       <body-content>empty</body-content> 指定标签体的类型,我们这里使用的是空标签。
</tag>

图片 8

4、页面中钦赐tld文件地点

4、页面中指定tld文件地方

用户定义的一种自定义的jsp标记。当多少个暗含自定义标签的jsp页面被jsp引擎编译成servlet时,tag标签被转化成了对三个名称叫标签管理类 的对象的操作。于是,当jsp页面被jsp引擎转化为servlet后,实际上tag标签被转化为了对tag管理类的操作。

 二、标签体内容

 二、标签体内容

图片 9

1、标签体内容

1、标签体内容

支出自定义标签,其宗旨就是要编写管理器类,多个标签对应二个标签管理器类,而三个标签库则是累累标签管理器的集结。全数的竹签管理器类都要兑现 JspTag 接口,该接口中尚无定义任何方法,主要作为 Tag 和 SimpleTag 接口的父接口。

  • empty:无标签体。
  • JSP:jsp2.0曾经不复扶助这几个类型。表示标签体内容能够是:Java脚本,能够是标签,能够是EL表明式。
  • scriptless:只好是EL表明式,也足以是另外标签。
  • tagdependent:标签体内容不会被推行,而是径直赋值标签管理类。
  • empty:无标签体。
  • JSP:jsp2.0早已不复支持那几个项目。表示标签体内容能够是:Java脚本,可以是标签,能够是EL表明式。
  • scriptless:只可以是EL表达式,也得以是别的标签。
  • tagdependent:标签体内容不会被推行,而是径直赋值标签管理类。

在 JSP 2.0 以前,全部标签处理器类都不能够不兑现 Tag 接口,那样的价签称为守旧标签。

2、不再实践标签下边内容的竹签。

2、不再执行标签下边内容的竹签。

JSP 2.0 标准又定义了一种新的品种的标签,称为轻易标签,其相应的管理器类要落实SimpleTag 接口

  • 在标签管理类中的doTag()使用SkipPageException来终结。
  • 汤姆cat会调用标签管理类的doTag()方法,然后汤姆cat会得到SkipPageException,它会跳过本页面别的剧情。
  • 在标签管理类中的doTag()使用SkipPageException来终止。
  • 汤姆cat会调用标签管理类的doTag()方法,然后汤姆cat会获得SkipPageException,它会跳过本页面别的剧情。

空标签:<hello/>

三、标签属性

三、标签属性

带有属性的空标签:<max num1=“3” num2=“5”/>

步骤:

步骤:

包涵内容的标签:<greeting> hello</greeting>

1、给你的标签管理类增多属性。

1、给你的竹签管理类加多属性。

包蕴内容和属性的标签:<greeting name=“汤姆”>hello</greeting>

为标签管理类增加属性,属性至少要且贰个set方法,这么些set方法会在doTage()方法在此以前被汤姆cat推行,所在doTage()中就能够运用质量了。

为标签管理类加多属性,属性至少要且四个set方法,那一个set方法会在doTage()方法在此之前被汤姆cat试行,所在doTage()中就足以选取质量了。

一:编写成功标签效应的 Java 类

2、在tld文件中对品质进行计划。

2、在tld文件中对品质举行安顿。

二:编写标签库描述文件,在tld文件中对自定义中打开描述

<attribute>
    <name>test</name>  指定属性名
    <required>true</required>  指定属性是否为必需的
    <rtexprvalue>true</rtexprvalue> 指定属性是否可以使用EL表达式
</attribute>
<attribute>
    <name>test</name>  指定属性名
    <required>true</required>  指定属性是否为必需的
    <rtexprvalue>true</rtexprvalue> 指定属性是否可以使用EL表达式
</attribute>

三:在 JSP 页面中程导弹入和选取自定义标签

本文由1010cc时时彩标准版发布于三分时时彩1010CC,转载请注明出处:自定义标签,学习笔记_Java_day13_JSTL_自定义标签库

关键词:

上一篇:子类的链式调用,Android面试题准备

下一篇:没有了