tag_tags - CSDN
精华内容
参与话题
  • Tag功能介绍—我们为什么打Tag

    千次阅读 2016-02-12 13:10:33
    想必CSDN的新老用户在访问CSDN网站的博客、社区、下载等服务时,经常能够看到“请您添加标签”的提示。也许很多人对此抱有疑问:加标签有什么用?...CSDN标签,也称为Tag,添加Tag有三大好处:更快检索

    转自:http://blog.csdn.net/csdnproduct/article/details/12423189

    想必CSDN的新老用户在访问CSDN网站的博客、社区、下载等服务时,经常能够看到“请您添加标签”的提示。也许很多人对此抱有疑问:加标签有什么用?在这里我们为您集中解答一下疑惑。

    Tag标签是什么?

    CSDN标签,也称为Tag,添加Tag有三大好处:更快检索、更精准展示、更有效传播与反馈。CSDN提供的Tag标签服务,可以帮助用户更加便捷、有效、迅速、专业地组织并查找内容。包括CSDN内容频道、博客、社区、下载、问答、会议、招聘、CODE……基本上所有的产品都支持该功能,Tag作为内容的基本属性,使用Tag可以很精确地全站式贯通同一主题的所有内容服务。


    近期发布的Tag新功能——CSDN“ 我的Tag”,正是基于我们的基础Tag服务,提供给用户更加方便、个性化的标签内容定制功能。只要点下某个您感兴趣的主题的“关注主题”按钮,即可在您个人的关注页里浏览CSDN全站最新全部的相关主题内容。

    为什么要打Tag?

    正如前面所说,Tag标签服务是为了帮助用户更加便捷、有效、迅速、专业的组织并查找内容,因此,如果CSDN的用户希望自己的内容可以更快地传播,更及时地获得其他用户的关注和反馈,我们建议您为您的内容加上对应的标签,以便于获得更好的服务。

    如何打Tag?

    我们建议用户添加Tag标签遵循以下原则:

    1. 每个Tag标签应该代表某个具体领域、事物、人物或概念,且不是孤立存在的,可以引发更多的讨论;
    2. 每个Tag标签应该尽量细分、精准,这样可以帮助用户的内容被更多人看到,可以获得更为有效的关注。

    例如,一篇有关“开源”的文章,可能提到的开源协议是BSD或GPL,公司是Google或Facebook,操作系统是Linux、Unix或Android,工具是版本控制工具、测试工具、文档工具……等等。这些具体的名称都可以加为Tag标签。

    此外,我们的系统本身会在用户添加内容时推荐部分Tag标签,用户也可以从中挑选认为合适的推荐项。

    如果您对我们的Tag标签服务有任何意见或建议,请在下面发表评论,我们会及时响应纳入需求。感谢您对CSDN产品的支持!

    展开全文
  • tag

    2012-11-19 22:23:14
    什么是自定义的tag? 一个自定义的tag标签是用户定义的一种JSP标记。当一个含有自定义的tag标签的JSP页面被jsp引擎编译成servlet时,tag标签被转化成了对一个称为tag处理类的对象进行的操作。于是当JSP页面被jsp引擎...

    什么是自定义的tag?

    一个自定义的tag标签是用户定义的一种JSP标记。当一个含有自定义的tag标签的JSP页面被jsp引擎编译成servlet时,tag标签被转化成了对一个称为tag处理类的对象进行的操作。于是当JSP页面被jsp引擎转化为servlet后,实际上tag标签被转化成为了对tag处理类的操作。

    自定义tag标签有很多特色,诸如:

    · 可以在JSP页面中自定义tag标签的属性

    · 访问JSP页面中的所有对象

    · 可以动态地修改页面输出

    · 彼此这间可以相互通信。你可以先创建一个JavaBeans组件,然后在一个tag中调用此JavaBeans组件,同时可以在另一个tag中调用它。

    · tag允许相互嵌套,可以在一个JSP页面中完成一些复杂的交互。


    使用tag标签



    要使用tag标签,JSP程序员必须做2件事:

    · 声明此tag标签的tag库

    · 实现此tag标签

    声明tag标签所在的tag库

    如果要使用tag标签,则应用JSP的taglib指示符来指定其tag库(注意:taglib要在在使用此tag标签之前声明)

    <%@taglib uri=”/WEB-INF/tutorial-template.tld” prefix=”tt” %>

    uri属性定义了唯一的标签库描述(以下简称TLD),它可以是直接是tld文件名或一个独一无二的名字。prefix是用来区别其它TLD中和本TLD中有重名的tag的一种手段。

    TLD必须以.tld作为扩展名,并且存放在当前应用的WEB-INF目录或其子目录下。你可以通过它的文件名直接引用它,也可以通过别的方式间接地引用它。

    以下taglib指示符直接引用一个TLD:

    <%@taglib uri=”/WEB-INF/tutorial-template.tld” prefix=”tt” %>

    以下的taglib指示符通过一个逻辑名称间接地引用一个TLD:

    <%@taglib uri=”/tutorial-template” prefix=”tt” %>

    如果是间接引用TLD的话,那你必须还要在web.xml中定义此逻辑名称与tld文件之间的映射,具体做法是在web.xml中加入一个名为taglib的元素:

    <taglib>

    <taglib-uri>/tutorial-template</taglib-uri>

    <taglib-location>

    /WEB-INF/tutorial-template.tld

    </taglib-location>

    </taglib>


    实现此tag标签


    为了实现tag标签,你有2种方法来存放tag处理类。一、让tag处理类以.class的方式存放于当前应用的WEB-INF/class子目录下,二、如果tag处理类是以JAR包的形式存在的话,那可以放在当前应用的WEB-INF/lib目录下,如果tag处理类要在多个应用中共享,那么它就应放在jsp服务器上的common/lib目录下,对于tomcat来说,就是tomcat/common/lib目录下。


    tag标签类型


    自定义的tag标签遵循XML语法。它有一个开始标记和一个结束标记,有的还有body(即文本节点):

    <tt:tag>

    body

    </tt:tag>


    一个不带body的tag标签如下:

    <tt:tag/>


    简单的tag标签

    一个没有body和属性的tag标签如下:

    <tt:simple/>


    带属性的tag标签


    自定义标签可以有自己的属性。属性一般在开始标记中定义,语法为 attr=”value”。属性的作用相当于自定义标签的一个参数,它影响着tag处理类的行为。你可以在TLD中详细定义它。

    你可以用一个String常量给一个属性赋值,也可以通过表达式给它赋值,如<%=...%>。以struts为例,它的logic:present标签就是用的String常量来给属性赋值:

    <loglic:presentparameter = “Clear”>

    而另一个标签logic:iterate是用表达式来给属性赋值:

    <logci:iteratecollection=”<%=bookDB.getBooks() %>”

    id=”book” type=”database.BookDetails”>


    带body的tag标签

    一个自定义标签可以包含其它自定义标签、脚本变量、HTML标记或其它内容。

    在下述例子中,此JSP页面使用了struts的logic:present标签,如果些标签定义了parameter=”Clear”的属性,则将清除购物车的内容,然后打印出一条信息:

    <logic:presentparameter=”Clear”>

    <%cart.clear(); %>

    <fontcolor=”#ff0000” size=”+2”><strong>

    你选择了清除购物车!

    </strong></font>

    </logic:present>


    到底是用属性还是用body来传递信息?

    如上所述,我们既可以通过属性,也可以通过body来传递信息。但一般来说,比较简单的类型,如字符串或简单表达式最好采用属性来传递信息。


    定义脚本变量的tag标签

    所谓脚本变量,是指JSP中可以调用的变量或对象。它可由tag标签产生。以下示例阐述了一个tag标签定义了一个名为tx的由JNDI所定义的事务处理对象。脚本变量可以是ejb对象、事务、数据库连接等等:

    <tt:lookupid=”tx” type=”UserTransaction” name=”java:comp/UserTransaction” />

    <%tx.begin(); %>

    ...


    具有协作关系的tag标签

    自定义tag标签之间可以通过共享对象来实现协作。在下述例子中,标签tag1创建了一个名为obj1的对象,在标签tag2仍可以重复使用obj。

    <tt:tag1attr1=”obj1” value1=”value”/>

    <tt:tag2attr1=”obj1” />

    在以下这个例子当中,如果外层的tag标签创建了一个对象,那么其内层的所有tag标签都可以使用这个对象。由于这样产生的对象没有一个指定的名字,那么就可以将少重名的冲突。这个例子阐述了一系列协作的嵌套对象。

    <tt:outerTag>

    <tt:innerTag/>

    </tt:outerTag>

    Tag处理类


    Tag处理类必须实现Tag接口或BodyTag接口,不过现在一般都流行从TagSupport或BodyTagSupport类中继承,这些类或接口都可以在javax.servlet.jsp.tagext包中找到。

    当JSP引擎看到自己的JSP页面中包含有tag标签时,它会调用doStartTag方法来处理tag标签的开头,调用doEndTag方法来处理tag标签的结束。

    下表说明不同类型的tag所需要不同的处理过程:

    Tag处理类的方法

    Tag标签类型
    所调用的方法

    基本标签
    doStartTag, doEndTag, release

    带属性的标签
    doStartTag, doEndTag, set/getAttribute1...N, release

    带内容的标签
    doStartTag, doEndTag, release

    带内容的标签,且内容重复循环
    doStartTag, doAfterBody, doEndTag, release

    带内容的标签,且内容与JSP交互
    doStartTag, doEndTag, release, doInitBody, doAfterBody, release

    一个tag处理类可以通过javax.servlet.jsp.PageContext来与JSP交互,通过javax.servlet.jsp.PageContext类,tag处理类可以访问JSP中的request、session和application对像。

    如果tag标签是互相嵌套的,那内层的tag处理类可以通过它的parent属性来访问上层的tag处理类。

    一般情况都将所有的tag处理类打成了JAR的包,以便于发布。


    Tag库描述(简称TLD)


    Tag库是用xml语言描述的,TLD包括了tag库中所有tag标签的描述,它一般用来被jsp服务器用来校验tag的语法正确性,或者被jsp开发者用来开发新的标签。

    TLD的文件扩展名必须为.tld,而且必须放在当前WEB应用的WEB-INF目录或其子目录中。

    一个TLD的内容的开头必须遵守标准的XML开头,用于描述DTD和xml的版本,例如:

    <?xmlversion="1.0" encoding="ISO-8859-1" ?>

    <!DOCTYPEtaglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
    TLD
    必须以<taglib>来作为它的根元素,<taglib>的子元素如下表:


    <taglib>的子元素

    Element
    Description

    tlib-version
    Tag库的版本

    jsp-version
    Tag库所需要的jsp的版本

    short-name
    助记符,tag的一个别名(可选)

    uri
    用于确定一个唯一的tag库

    display-name
    被可视化工具(诸如Jbuilder)用来显示的名称(可选)

    small-icon
    被可视化工具(诸如Jbuilder)用来显示的小图标(可选)

    large-icon
    被可视化工具(诸如Jbuilder)用来显示的大图标(可选)

    description
    对tag库的描述(可选)

    listener
    参见下面listener元素

    tag
    参见下面tag 元素

    Listener元素

    一个tag库可能定义一些类做为它的事件侦听类,这些类在TLD中被称为listener 元素,jsp服务器将会实例化这些侦听类,并且注册它们。Listener元素中有一个叫listener-class的子元素,这个元素的值必须是该侦听类的完整类名。

    Tag元素

    每个tag元素在tag库中都要指出它的名字、类名、脚本变量、tag的属性。其中脚本变量的值可以直接在TLD中定义或通过tag附加信息的类来取得。每个属性描述了这个属性是否可以省略,它的值是否可以通过<%=…%>这样的JSP语法来获得,以及属性的类型。

    每一个tag在TLD中对应一个tag元素,下表是tag元素的子元素:

    Tag元素的子元素

    元素名称
    描述

    name
    独一无二的元素名

    tag-class
    Tag标签对应的tag处理类

    tei-class
    javax.servlet.jsp.tagext.TagExtraInfo的子类,用于表达脚本变量(可选)

    body-content
    Tag标签body的类型

    display-name
    被可视化工具(诸如Jbuilder)用来显示的名称(可选)

    small-icon
    被可视化工具(诸如Jbuilder)用来显示的小图标(可选)

    large-icon
    被可视化工具(诸如Jbuilder)用来显示的大图标(可选)

    description
    此tag标签的描述

    variable
    提供脚本变量的信息(同tei-class)(可选)

    attribute
    Tag标签的属性名

    以下章节介绍对于不同类型的tag,如何具体地实现它们。


    简单的tag


    tag处理类

    简单的tag处理类必须实现Tag接口的doStartTag和doEndTag方法。当jsp引擎碰到tag标签的开头时,doStartTag被调用,因为简单的tag没有body,所以此方法将返回 SKIP_BODY。当jsp引擎碰到tag标签的结尾时,doEndTag被调用,如果余下的页面还要被计算,那它将返回EVAL_PAGE,否则将会返回SKIP_PAGE。

    以下是例子:对于标签 <tt:simple /> ,它的tag处理类实现如下:


    public SimpleTag extends TagSupport

    {

    publicint doStartTag() throws JspException

    {

    try{

    pageContext.getOut().print(“Hello.”);

    }catch(Exceptione){

    thrownew JspTagException(“SimpleTag: “ + e.getMessage());

    }

    returnSKIP_BODY;

    }

    publicint doEndTag()

    {

    returnEVAL_PAGE;

    }

    }


    注意:如果tag标签没有内容的话,那必须定义body-content元素为空,例如

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


    带属性的tag标签


    tag处理类

    对于tag标签的每个属性,你必须依照JavaBeans规范来定义其属性,以及get和set方法。以struts的logic:present 标签为例,

    <logic:presentparameter=”Clear”>

    与此相应,此tag处理类应有如下方法和定义:


    protected String parameter = null;

    publicString getParameter()

    {

    returnthis.parameter;

    }

    publicvoid setParameter(String parameter)

    {

    this.parameter= parameter;

    }


    注意:如果你的属性名为id,而且你的tag处理类是从TagSupport类继承的,那你就不需要定义它的属性和set和get方法,因为他们早已在TagSupport被定义过了。

    Attribute元素

    对于tag标签的每个属性,你必须定义它是否必须的,它的值是否可以用诸如<%= …%>的表达式来获得,以及它的类型(可选),如果不指定它的类型,那就默认为是java.lang.String类型。如果rtexprvalue元素被定义为true或yes,那么在type元素中就定义了attribute的返回类型。

    <attribute>

    <name>attr1</name>

    <required>true|false|yes|no</required>

    <rtexprvalue>true|false|yes|no</rtexprvalue>

    <type>attribute的返回类型(只用当rtexprvalue为真是才有效)</type>

    </attribute>

    如果tag的某个属性不是必须的,那tag处理类会自动提供一个缺省值。

    例如,在logic:present这个tag标签中定义了一个属性叫parameter,但它不是必须的,而且它可以被诸如<%= …%>的表达式来赋值。

    <tag>

    <name>present</name>

    <tag-class>org.apache.struts.taglib.logic.PresentTag</tag-class>

    <body-content>JSP</body-content>

    <attribute>

    <name>parameter</name>

    <required>false</required>

    <rtexprvalue>true</rtexprvalue>

    </attribute>

    </tag>


    属性元素的校验


    有关于tag标签的有效值可以从tag库的说明文档中获得,当JSP页面被编译时,jsp引擎会强制性地参照TLD中定义的规则进行检查。

    还有一个方法也可以进行属性元素的校验,就是先继承类TagExtraInfo,然后调用它的isValid方法。这个类同时也起到提供tag中定义的脚本变量信息的作用。

    IsValid方法通过TagData对象来传递属性信息,它包括着tag的所有的属性名-值的信息。由于校验发生在运行时刻,因此这个属性的值将被赋值为TagData.REQUEST_TIME_VALUE。

    例如tag标签<tt:twa attr1=”value1” />在TLD中定义如下:

    <attribute>

    <name>attr1</name>

    <required>true</required>

    <rtexprvalue>true</rtexprvalue>

    </attribute>


    这个定义说明了attr1能在运行期间被赋值。

    以下的isValid方法检查attr1属性的值是否属于Boolean类型。注意由于attr1能在运行刻被赋值,那么isValid方法必须检查tag用户是否对此tag进行了运行时刻赋值。


    Public class TwaTEI extends TagExtraInfo

    {

    publicboolean isValid(Tagdata data)

    {

    Objecto = data.getAttribute(“attr1”);

    If(o!= null && o != TagData.REQUEST_TIME_VALUE)

    {

    if(( (String)o).toLowerCase().equals(“true”) ||?

    ((String)o).toLowerCase().equals(“false”) )

    returntrue;

    else

    returnfalse;

    }

    else

    returntrue;

    }

    }

    带body的tag

    tag处理类


    如果tag标签含有内容,那处理方式会略微有些不同,而且还要视tag处理类是否要与body交互的情况而定。如果要与body交互,那我们认为tag处理类要可能要对body进行操作。

    Tag处理类不与body交互

    如果tag处理类不与body交互,tag处理类应该实现Tag接口或从TagSupport中派生,如果body要被计算,那么doStartTag方法应返回 EVAL_BODY_INCLUDE,否则应返回SKIP_BODY。

    如果tag处理类要对body反复运算,则它应该实现IterationTag或从TagSupport中派生。如果tag处理类认为body还未计算完的话,那它的doStartTag方法和doAfterBody方法必须返回EVAL_BODY_AGAIN。

    Tag处理类与body交互

    如果tag处理类与body交互,那tag处理类应实现BodyTag接口或从BodyTagSupport中派生。这种tag处理类一般要实现doInitBody和doAfterBody方法。

    Body允许一些方法来读写它的内容。Tag处理类可以调用body内容的getString或getReader方法来从body中提取信息,也可用 writeOut(out) 方法来将body的内容写入到out对象中。其中out对象通过tag处理类的getPreviousOut方法来获得。

    如果body的内容需要被计算,那么doStartTag方法必须返回EVAL_BODY_BUFFERED,否则,它将返回 SKIP_BODY。

    doInitBody方法

    此方法在body内容已经设好,但未被计算之前被调用。你可以根据不同的body内容来制定初始化策略。

    doAfterBody方法

    此方法在body内容已被计算后进行调用。

    和doStartTag方法一样,doAfterBody方法返回一个指示符指示是否要继续计算body,如果要继续计算,则doAfterBody应返回EVAL_BODY_BUFFERED,否则,它应返回SKIP_BODY。

    release方法

    tag处理类调用此方法将它的状态重置为初始状态,并释放所有的私有资源。


    以下的例子读取body的内容(其中含有一条sql语句),然后将它传递给一个对象,让它进行查询。由于此处body不须重新计算,所以doAfterBody会返回SKIP_BODY。


    Public class QueryTag extends BodyTagSupport

    {

    publicint doAfterBody() throws JspTagException

    {

    BodyContentbc = getBodyContent();

    //将body的内容以字符串的格式提取出来

    Stringquery = bc.getString();

    //清除body

    bc.clearBody();

    try{

    Statementstmt = connection.createStatement();

    Resultresult = stmt.executeQuery(query);

    }catch(SQLExceptione){

    thrownew JspTagException(“queryTag: “ + e.getMessage() );

    returnSKIP_BODY;

    }

    }


    body-content元素


    由于tag可能会有body,你必须用body-content元素来指定body内容的类型:

    <body-content>JSP|tagdependent</body-content>


    如果body的内容是定制的或内部的tag、脚本元素、或HTML广本,则归类为JSP类型。其他的类型,比如上面代码所述的?D?D将sql statement类传给 query tag的这种类型应该标为tagdependent。

    注意:实际上body-content的值并不影响tag处理类对body内容的处理,它仅仅是被tag编辑工具用来描述此body的内容。


    用tags定义脚本变量

    tag处理类


    tag处理类负责创建或设置页面中定义的脚本变量,用pageContext.setAttribute(name,value,scope)或pageContext.setAttribute(name,value)方法来实现。一般来说,tag处理类通过脚本变量的名称来获取它,脚本变量的名称一般可用get方法来获得。

    如果脚本变量的值依赖于tag处理类中的上下文中某一对象,那它可用pageContext.getAttribute(name,scope)方法来找到那个对象。一般的处理过程是tag处理类先找到脚本变量,再对其进行处理,然后用pageContext.setAttribute(name,object)的方法来设置它的新值。

    对象的生存周期(scope)如下表:

    对象的生存周期表

    名字
    可访问范围
    生存周期

    page
    当前页面
    一直有效,除非页面向客户提交响应或重定向到一个新页面

    request
    当前页面或当前页面重定向到的页面
    一直有效,除非页面向客户提交响应

    session
    当前页面或在同一浏览器窗口中的页面
    一直有效,除非关闭当前浏览器、超时、网络故障

    application
    整个web应用程序的所有请求
    一直有效,除非发生网络故障、服务器故障

    提供关于脚本变量的信息

    以下示例定义了一个名为“book”的脚本变量,用来访问程序中关于书的信息:

    <bean:defineid=”book” name=”bookDB”property=”bookDetails” type=”database.BookDetails” />

    <fontcolor=”red” size=”+2” >

    <%=messages.getString(“CartRemoved”) %>

    <strong><jsp:getPropertyname=”book” property=”title”/></strong>

    </font>

    当包含此tag的JSP页面被编译时,jsp引擎会自动生成关于此book的同步的代码(同步可以避免几个客户同时访问此book时造成的冲突),要生成同步代码,jsp引擎需要知道此脚本变量的如下信息:

    · 脚本变量名称

    · 脚本变量所属的类

    · 此脚本变量是否引用了一个新的或已存在的对象

    · 此脚本变量的有效性

    有两种办法可以向jsp引擎提供关于脚本变量的信息:在TLD中定义variable子元素,或用tei-class子元素定义一个额外tag信息类。用variable最简单,但可能降低了一些灵活性。

    Variable元素

    Variable元素有如下子元素:

    · name-given ?D?D 给出的名字,是一个常量

    · name-from-attribute?D?D 属性名,在编译时给出的属性名

    name-given或name-from-attribute两者必须选一,但以下子元素是可选的:

    · variable-class?D?D变量的类型,缺省为java.lang.String。

    · declare?D?D此脚本变量是否引用了一个新对象,缺省为True。

    · scope?D?D脚本变量的范围,缺省为NESTED。下表描述了scope的几种类型:

    脚本变量的有效范围


    有效性
    方法

    NESTED
    在tag标签的开始和结束之间
    如果tag处理类实现BodyTag接口,则在doInitBody和doAfterBody中调用,否则在doStartTag中调用

    AT_BEGIN
    从tag标签的开始一直到页面结束
    如果tag处理类实现BodyTag接口,则在doInitBody、doAfterBody和doEndTag中调用,否则在doStartTag和doEndTag中调用

    AT_END
    从tag标签的结束一直到页面结束
    在doEndTag中调用

    以struts为例,它的bean:define标签的实现遵循JSP1.1规范,此规范要求使用额外tag信息类来定义脚本变量。Variable元素是JSP1.2规范中加入的。以bean:define标签为例,你可以定义如下variable元素:

    <tag>

    <variable>

    <name-from-attribute>id</name-from-attribute>

    <variable-class>database.BookDetails</variable-class>

    <declare>true</declare>

    <scope>AT_BEGIN</scope>

    </variable>

    </tag>

    额外tag信息类

    如果要定义一个额外tag信息类,你要继承javax.servlet.jsp.TagExtraInfo类。一个TagExtraInfo类必须实现getVariableInfo方法,此方法返回一个叫VariableInfo的数组类,它包括如下信息:

    · 变量名

    · 变量所属类名

    · 此变量是否引用了一个新对象

    · 此变量的有效范围

    jsp引擎将一个名为data的参数传给getVariableInfo方法,data中包括tag标签中的所有“属性名?D?D属性值”对。它可以用来向VariableInfo对象提供脚本变量的名字和类名。

    以struts为例,它在bean:define标签中定义了一个名为DefineTei的额外tag信息类,用来向脚本变量提供信息。由于脚本变量的名称(book)和类名(database.BookDetails)是通过tag标签的属性来传递的,它们一般定义在VariableInfo的构建代码中,并且可用data.getAttributeString方法来得到这些信息。如果要允许book脚本变量能在从tag开始直到整个JSP页面结束的范围内都可用的话,那它的范围应设为AT_BEGIN。如下所示:


    public class DefineTei extends TagExtraInfo

    {

    publicVariableInfo[] getVariableInfo(TagData data)

    {

    Stringtype = data.getAttributeString(“type”);

    If(type == null)

    type= “java.lang.Object”;

    returnnew VariableInfo[] {

    newVariableInfo(data.getAttributeString(“id”),?

    type,

    true,

    VariableInfo.AT_BEGIN)

    };

    }

    }


    注意:关于额外tag信息类的类名必须要在TLD中的tag标签下的tei-class子元素中定义。因此,DefineTei的tei-class中的定义看起来如下:
    <tei-class>
    org.apache.struts.taglib.bean.DefineTagTei
    </tei-class>


    具有协作关系的tag


    tag通过共享对象来进行协作,JSP技术支持2种方式的对象共享。

    第一种方法是使用pageContext对象进行对象的共享(可支持JSP页面和tag处理类之间的共享),如果在一个tag处理类中要调用由另一个tag处理类创建的对象,可调用pageContext.getAttribute(name,scope)方法。

    第二各方式的共享是对于tag之间有嵌套关系而言的,外层的tag所创建的对象对于内层的tag来说是可以共用的。这种形式的共享的好处是减少了可能存在的重名冲突。

    要访问一个嵌套tag创建的对象,tag处理类必须先找到此嵌套tag对象,可用TagSupport的静态方法 TagSupport.findAncestorWithClass(from, class)或TagSupport.getParent方法。前者在当不确定此tag是否为嵌套tag对象时使用。一旦它的父类被找到,它就能访问其所有动态或静态创建的对象。静态创建的对象是父类的成员,而动态创建的对象可能是父类的私有对象。诸如此类的对象可以用tag处理类的setValue方法来保存,用getValue方法来获得。

    下例阐述了以上两种共享对象的方法。在这个例子当中,一个查询tag检查一个名为connection的属性名是否在doStartTag中被设置。如果connection属性被设置,tag处理类从pageContext中得到这个connection对象。否则,此tag处理类先找到它的父tag处理类,然后从它的父tag处理类中找到connection对象。


    public class QueryTag extends BodyTagSupport

    {

    privateString connectionId;

    publicint doStartTag() throws JspException

    {

    Stringcid = getConnection();

    if(cid!= null)

    {

    //存在一个connection id,使用它。

    connection= (Connection) pageContext.getAttribute(cid);

    }

    else

    {

    ConnectionTagancestorTag = (ConnectionTag)findAncestorWithClass(this,?

    ConnectionTag.class);

    if(ancestorTag== null)

    {

    thrownew JspTagException(“一个没有connection属性的查询标签必须被一个connection标记嵌套。”);

    }

    connection= ancestorTag.getConnection();

    }

    }

    }?


    此查询标签在JSP页面中的调用形式可以从以下2种定义中任选一种:

    <tt:connectionid=”con01” ...> ... </tt:connection>

    <tt:queryid=”balances” connection=”con01”>

    SELECTaccount, balance FROM acct_table

    wherecustomer_num = <%= request.getCustno() %>

    </tt:query>

    <tt:connection...>

    <x:queryid=”balances”>

    SELECTaccount, balance FROM acct_table

    wherecustomer_num = <%= request.getCustno() %>

    </x:query>

    </tt:connection>

    与此同时,在TLD中必须指定connection属性为可选的,定义如下:

    <tag>

    ...

    <attribute>

    <name>connection</name>

    <required>false</required>

    </attribute>

    </tag>

    展开全文
  • Tag文件和Tag标记的用法详解

    千次阅读 2018-09-22 13:53:06
    Tag文件和Tag标记 目录 1.为什么要使用Tag文件 2.Tag文件的结构 3.Tag文件的存储目录 4.Tag标记 5.Tag文件中常用的指令 1)tag指令 2)attribute指令 3)variable指令 4)taglib指令 5)include指令 6.Tag...

                                          Tag文件和Tag标记


    目录

    1.为什么要使用Tag文件

    2.Tag文件的结构

    3.Tag文件的存储目录

    4.Tag标记

    5.Tag文件中常用的指令

    1)tag指令

    2)attribute指令

    3)variable指令

    4)taglib指令

    5)include指令

    6.Tag文件的嵌套


    1.为什么要使用Tag文件

     1) 在Web应用中许多JSP页面都有相同的信息,如都需要相同的导航栏和尾页等。如果能把相同的信息都形成一种特殊的文件,而且各个JSP页面都可以使用这种特殊的文件,那么就能实现代码的复用,维护性就比较好了

    2)实现代码复用还有另外两种方式,include指令和include动作,那就来说说他们的不足吧,首先不论是include指令还是include动作处理的都是单一 的JSP文件,用户可以通过输入地址栏的方式来访问响应的JSP文件,这时候用户访问的JSP文件可能只是一个导航栏,这不是设计者希望看到的.include指令的耦合性太大,include动作虽然耦合性较小但是能放在Web服务目录的任意子目录中,不仅显的杂乱无章,还不利于管理和维护.

    3)使用tag文件就能很好的解决这一缺点,tag文件不仅能实现动态加载实现代码复用,还不能让用户直接访问,tag文件放在指定 的目录下,维护起来会比较方便(很多时候会让tag文件去处理数据,而JSP页面只是去显示数据,实现数据显示和数据处理分离,这样就比较便于维护了)


    2.Tag文件的结构

    Tag文件是扩展名为.tag的文件,其实与JSP文件差不多.在Tag文件中可以使用HTML标签,可以使用java脚本以及JSP动作和指令,还可以使用某些特殊的指令(后面会讲)


    3.Tag文件的存储目录

    Tag文件必须存在/WEB-INF/tags 文件夹下(不然会报错),存放目录如下图所示:


    4.Tag标记

    编写了一个Tag文件会对应生成一个Tag标记,Tag标记的格式为:

    <Tag 文件名字/>或

    <Tag 文件名字>

             标记体

    </Tag 文件名字>

    当JSP页面希望向Tag文件传递相应的信息时,可以使用标记体来传递,在Tag文件中通过<jsp:doBody/>来调用标记体

    一个Tag文件对应一个Tag标记,那么该目录下有若干个Tag文件就行成了一个库,在JSP页面要调用Tag文件,就要通过taglib指令来引入相应目录下的一个标记库,只有这样JSP页面才能调用相应的Tag文件并动态执行该Tag文件

    <%@taglib prefix="前缀" tagdir="自定义标记库的位置"%>

    注意:使用前缀可以区别不同标记库下相同名字的标记文件

    如:调用/WEB-INF/tags/math/random.tag文件就可以在JSP页面中这样写

    <%@taglib prefix="math" tagdir="/WEB-INF/tags/math/"%>来引入标记库

    之后可以<math:random/>或者<math:random>标记体</math:random>来调用了并执行相应tag文件了


    5.Tag文件中常用的指令

    1)tag指令

    1.body-content属性

    body-content属性的值有empty、tagdependent、scriptless,其默认值是scriptless

    empty:当body-content属性的属性值为empty时,JSP页面中必须使用没有标记体的tag标记,<Tag 文件名字>

    tagdependent:当body-content属性的属性值为tagdepentdent时,JSP页面通过标记体传来的信息全部按纯文本处理

    scriptless:当body-content属性的属性值为scriptless时,标记体中不能使用Java程序块,可以使用文本,EL表达式,一个自定义标记,一个动作

    2.language属性

    其属性值只支持java

    3.import属性

    引入java核心类包,可以在Tag文件中使用某些类,跟导包没什么区别就不说了

    4.pageEncoding属性

    Tag文件的编码属性,其默认值是ISO-8859-1

    2)attribute指令

    Tag文件充当着代码复用的角色,如果能像include动作一样向Tag文件传递数据,这会让Tag文件的功能更加强大,这当然是可以的,在Tag文件中有attribute指令,其语法格式如下:

    <%attribute name="对象名字" required="true"|"false" type="对象的类型"%>

    attribute指令中name属性是必须的,该属性是引用一个对象的名字.required为true时必须给其传值,为false时可以传可以不传,type为该对象的类型,默认为java.lang.String类型,可以改为其他类型,但要注意的是,必须对象类型必须带有包名,如不能简写为type="Integer"必须是type="java.lang.Integer"

    需要注意的是:在Tag文件中不可以再定义和attribute指令中name属性指定的对象具有相同名字的变量,否则将隐藏attribute指令中的对象,使其失效(可以通过观察源码发现,attribute中的变量其实在Tag文件中一个成员变量)

    下面是使用attribute指令的一个例子计算三角形面积的例子:

    JSP页面:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@taglib prefix="kai" tagdir="/WEB-INF/tags/geng" %>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'MyJsp.jsp' starting page</title>
        
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<!--
    	<link rel="stylesheet" type="text/css" href="styles.css">
    	-->
    
      </head>
      
      <body>
      <form action="" method="post">
      边长A: <input type="text" value="" name="a"><br>
      边长B: <input type="text" value="" name="b"><br>
      边长C: <input type="text" value="" name="c"><br>
      <input type="submit" value="Enter">
      </form>
      <br>
      <%
      		if((request.getParameter("a")!=null && request.getParameter("a")!="")
      			&& (request.getParameter("b")!=null && request.getParameter("b")!="")
      			&& (request.getParameter("c")!=null && request.getParameter("c")!="") ){
       %>
      	<kai:Addsum a="<%=Double.valueOf(request.getParameter(\"a\"))%>" b="<%=Double.valueOf(request.getParameter(\"b\"))%>" c="<%=Double.valueOf(request.getParameter(\"c\"))%>">
      	</kai:Addsum>
      	<%}%>
      </body>
    </html>
    

    tag文件:

    <%@tag import="java.text.DecimalFormat"%>
    <%@tag pageEncoding="UTF-8" body-content="scriptless"%>
    <%@attribute name="a" required="false" type="java.lang.Double"%>
    <%@attribute name="b" required="false" type="java.lang.Double"%>
    <%@attribute name="c" required="false" type="java.lang.Double"%>
    <html>
    	<head>
    	</head>
    	<body>
    		以下是调用Tag文件的效果:<br>
    		这是一个Tag文件,负责计算三角形的面积.<br>
    		JSP页面传递过来的三条边:<%=a%>,<%=b%>,<%=c%><br>
    		<%
    			DecimalFormat format = new DecimalFormat("0.00");
    			if(a+b>c && a+c>b && b+c>a){
    				double p = (a+b+c)/2;
    				out.print("三角形的面积: "+format.format(Math.sqrt(p*(p-a)*(p-b)*(p-c))));
    			}else{
    				out.print("<br>"+a+" "+b+" "+c+" 不能构成三边");
    			}
    		 %>
    	</body>
    </html>

     

    3)variable指令

    Tag文件通过使用attribute指令JSP页面可以向Tag文件传递数据.在某些Web设计中,不仅需要向其传递数据,还需要他返回某些数据进行特殊处理.比如多个JSP页面需要Tag文件处理一些数据,但是不需要显示,因为每个JSP页面需要特殊的显示,这时候就可以使用variable指令,variable指令语法格式如下:

    <%variable name-given="对象名字" variable-class="对象类型" scope="有效范围"%>

    name-given:用来指定对象的名字,要符合命名规则

    variable-class:指定的类型,注意需要打全包名,不能进行简写

    scope中有三个属性值:

                    1.AT_BEGIN,在使用JSP页面标记的时候就可以使用该对象

                     2.NESTED,只能在标记体中使用该对象

                     3.AT_END,只能在标记体结束后使用该对象

    Tag通过jspContext.setAttribute("对象的名字",对象的引用);把对象名字和对象引用存储到内置对象jspContext中,JSP页面才能使用该对象

    4)taglib指令

    和JSP页面一样,Tag文件中也可以使用taglib指令来调用其他的tag文件,操作一样

    5)include指令

    其用法与JSP页面中的include指令差不多,这里就不说了


    6.Tag文件的嵌套

    在使用Tag标记时,可以带有标记体,标记体还可以是一个Tag标记,这就实现了Tag标记的嵌套


    转载请注明出处

    展开全文
  • Tag文件的创建与应用

    千次阅读 2017-12-07 21:36:33
    Tag文件,几乎和JSP文件一模一样,可以被JSP页面动态加载调用。Tag文件有什么优势呢(既然和JSP几乎一模一样,那就得想想这个必然有不一样的地方,不然要它存在干嘛) 在设计Web应用时,可以通过编写Tag文件实现...

    Tag文件,几乎和JSP文件一模一样,可以被JSP页面动态加载调用。Tag文件有什么优势呢(既然和JSP几乎一模一样,那就得想想这个必然有不一样的地方,不然要它存在干嘛)

    1. 在设计Web应用时,可以通过编写Tag文件实现代码复用。
    2. 可将JSP页面中的关于数据处理的代码放在一个Tag文件中,让JSP页面只负责显示数据。即通过使用Tag文件将数据的处理和显示相分离,方便web项目的维护

    开始尝试创建应用tag文件

    1.在WEB服务目录下创建如下目录结构

    Web服务目录\WEB-INF\tags,

    没错,就是你想的那样,在WEB-INF下建一个tags文件夹,把tags文件放在那里

    tags文件下一般来说会建一些tag库,lib1,lib2,lib3.....(这种标号式的命名方式可别学)

    Web服务目录\WEB-INF\tags\lib1

    2.创建tag文件

    其实和jsp差不多,模仿一下下面

    <%@tag pageEncoding="GB2312" %>
    <p>这是一个Tag文件,负责计算1~100内的奇数之和</p>
    <%
    int sum=0,
        i=1;
        for (i=1;i<=100;i++)
        {
            sum=sum+i;
        }
        out.println(sum);
    
    %>
    大致会是如图所示


    2.引入tag文件

    <%@ taglib tagdir="自定义标记库的位置" prefix="前缀" %>

    在jsp文件顶部写这样的标签,如本文例子就写为

    <%@ taglib tagdir="/WEB-INF/tags/lib1" prefix="beijing" %>
    在jsp中调用标签

    <beijing:AddSum/>
    就可以调用目录下lib1库中的AddSum.tag了。

    这里,一开始学我也有点蒙,前缀是啥用,书上写了

    通过前缀可以有效地区分不同标记库中具有相同名字的标记文件
    这样有些明白了吧,就是给标记库取一个别名,以防各种库的tag混在一起,同名tag会有歧义

    仅仅简单介绍,以后继续补充

    展开全文
  • jQuery tagcloud 插件

    2020-07-30 23:32:51
    这个是自己根据一个已经有 3D 特效的标签云源代码修改而成,感谢原作者! 用法: <div id="tag"> <a href=...>... <a href=...>... <a href=...>... ...然后 $("#tag").tagcloud({color:...,radius:...}); 即可
  • git命令之git tag 给当前分支打标签

    万次阅读 多人点赞 2013-04-12 15:18:42
    git tag — 标签相关操作 发表于 2011年06月29日 由 机器猫 标签可以针对某一时间点的版本做标记,常用于版本发布。 列出标签 $ git tag # 在控制台打印出当前仓库的所有标签 $ git tag -l ...
  • HTML 标签(tag

    千次阅读 2018-09-16 10:27:40
    *html标签是由尖括号包围的关键词,例如&lt;html&gt;、&lt;head&gt;、&lt;title&...*标签中的第一个标签是开始标签(也叫头标签),第二个标签是结束标签(也叫尾标签);...
  • Tag文件与Tag标记

    2018-10-18 17:26:39
    1.tag的基本知识 扩展名为.tag的文本文件,其结构几乎和jsp文件相同。 tag文件存放在/WEB_INF/tags文件夹下,再此文件夹下可以创建子目录和tag文件 3.在jsp中如何调用 (1)调用无参的tag文件 &lt;%@ ...
  • git checkout tag

    万次阅读 2018-12-24 17:20:22
    git clone 整个仓库后使用,以下命令就可以取得该 tag 对应的代码了  git checkout tag_name  但是,这时候 git 可能会提示你当前处于一个“detached HEAD" 状态。 因为 tag 相当于是一个快照,是...
  • C#中控件的tag属性

    万次阅读 2014-12-24 10:16:16
    tag属性在很多控件的属性中都会有,但是如何使用呢?tag的使用有何意义呢? tag本身是“标签”的意思,顾名思义,就是给控件打上标签。 当项目中有很多类型名称各不相同的控件时,可以将这些控件打上相同的...
  • golang中json与struct中tag简介

    万次阅读 2018-02-02 14:03:10
    使用 Golang 的 encoding/json 库已经提供了很好的封装,可以让我们很方便地进行 JSON 数据的转换。 Go 语言中数据结构和 JSON 类型的对应关系如下表: golang 类型 JSON 类型 ...字
  • Docker 重命名镜像 TAG

    万次阅读 2017-04-01 16:50:53
    使用docker images时,可能会出现REPOSITORY 和TAG均为none的镜像,如下图 重命名镜像docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)#例子 docker tag ca1b6b825289 registry....
  • 小白学tkinter(tags(标签)的用法)

    千次阅读 2017-08-12 18:48:14
    Tag:SEL 表示对应的选中内容。 可以自定义任意的tags数量,名称可以任意。 tag_add():为指定的文本添加Tags tag_config():可以设置Tags的样式from tkinter import * root = Tk() text = Text(root,width = 30,...
  • GIT删除本地tag和远程tag

    万次阅读 2019-11-29 19:38:31
    tag v20190514为例,这个tag已经同步到远程,但是现在发现了一个问题,需要撤回该tag,git命令如下: 删除本地tag: git tag -d v20190514 删除远程tag: git push origin :refs/tags/v20190514 ...
  • Git把Tag推送到远程仓库

    万次阅读 2018-03-15 10:12:25
    一、列出标签$ git tag # 在控制台打印出当前仓库的所有标签二、搜索标签$ git tag -l ‘v0.1.*’ # 搜索符合模式的标签三、推送标签到远程仓库git push并不会把tag标签传送到远端服务器上,只有通过显式命令才能...
  • git 获取指定的tag处代码

    万次阅读 2017-05-19 11:11:27
    git 获取指定的tag处代码tag是对历史提交的一个id的引用,如果理解这句话就明白了tag的含义使用git checkout tag即可切换到指定tag,例如:git checkout v0.1.0切换到tag历史记录 会使当前指针处在分离头指针状态,...
  • 交付测试人员的代码,必须要打tag,那么基于jenkins实现,轻松打tag,并基于tag发版 流程: 1、开发环境每小时自动发版 2、需要交付测试人员时,基于开发自测通过版本,打TAG 在“Build History”中选择相应版本,...
  • git 如何获取指定 tag 代码

    万次阅读 2017-12-14 09:01:54
    git 如何获取指定 tag 代码1、查看本地git仓库下的tag git tag2、若本地没有仓库代码,可以选择拉去 git clone git@xxx.xxx:/progject.git3、切换到某一个tag下 git checkout tag_name4、提示: 当前处于一个...
  • git创建、删除分支和tag

    万次阅读 2015-10-27 14:14:49
    1.创建分支 git branch branchname //创建并切换到新分支 git checkout -b branchname //远程分支 git push origin branchname //查看远程分支 git branch -r 2.删除分支 2.1删除本地分支(-D强制删除) ...
  • 1.tag 是什么?  2.使用tag 的好处?  3.tag 和 branch 的区别以及使用场景? tag 是什么?  tag , 翻译过来是标签的意思,顾名思义,标签是为了标记某种事物。  tag 是 Git 版本库的一个快照,指向某个 commit...
1 2 3 4 5 ... 20
收藏数 880,895
精华内容 352,358
关键字:

tag