`

自定义JSP标签(带有属性)

 
阅读更多

1. 自定义标签运行原理

    自定义标签是用户定义的JSP语言元素。当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被

    称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作。

2. 两种标签

    可以定义两种类型的标签:
    (1) javax.servlet.jsp.tagext.Tag
    (2) javax.servlet.jsp.tagext.BodyTag

    有标签体的标签必须实现 BodyTag 接口, 无标签体的简单标签可以实现 Tag 接口。

3. 标签处理程序
    int doStartTag() throws JspException---处理开始标签
    int doEndTag() throws JspException---处理结束标签
    Tag getParent()/void setParent(Tag t)---获得/设置标签的父标签
    void setPageContext(PageContext pc)--- pageContext 属性的 setter 方法
    void release() 释放获得的所有资源

 

    doStartTag()和doEndTag()方法的返回值说明:
    SKIP_BODY      表示不用处理标签体,直接调用doEndTag()方法。
    SKIP_PAGE       忽略标签后面的jsp(SUN企业级应用的首选)内容。
    EVAL_PAGE      处理标签后,继续处理jsp(SUN企业级应用的首选)后面的内容。
    EVAL_BODY_BUFFERED   表示需要处理标签体,且需要重新创建一个缓冲(调用setBodyContent方法)。
    EVAL_BODY_INCLUDE  表示在现有的输出流对象中处理标签体,但绕过setBodyContent()和doInitBody()方法
    EVAL_BODY_AGAIN     对标签体循环处理。(存在于javax.servlet.jsp.tagext.IterationTag接口中)

 

    实现javax.servlet.jsp.tagext.Tag接口或扩展javax.servlet.jsp.tagext.TagSupport类:
    TagSupport 类定义了 get/setParent() 和 setPageContext(),这与所有标签处理程序几乎相同。get/setParent()

    方法允许标签嵌套。
    TagSupport 类还定义了一个可以被子类使用的 pageContext 实例变量 (protected PageContext pageContext),

    这个变量是由 setPageContext() 方法设置的。

 

    在创建自定义标签之前,需要创建一个 标签处理程序。标签处理程序是一个执行自定义标签操作的 Java 对象。

    在使用自定义标签时,要导入一个 标签库 —— 即一组标签/标签处理程序对。通过在 Web 部署描述符中声明库导

    入它,然后用指令 taglib 将它导入 JSP 页。

    <%@ taglib prefix="util" uri="http://org.dmwdp.pem/tag/util-1.0" %>

 

    如果 JSP 容器在转换时遇到了自定义标签,那么它就检查 标签库描述符(tag library descriptor) (TLD) 文件

    以查询相应的标签处理程序。TLD 文件对于自定义标签处理程序,就像 Web 部署描述符对于 servlet 一样。

    在运行时,JSP 页生成的 servlet 得到对应于这一页面所使用的标签的标签处理程序的一个实例。生成的 servlet 用

    传递给它的属性初始化标签处理程序。
    标签处理程序实现了 生存周期 方法。生成的 servlet 用这些方法通知标签处理程序应当启动、停止或者重复自定义

    标签操作。生成的 servlet 调用这些生存周期方法执行标签的功能。

4. TLD 文件

     TLD文件的根元素是 taglib。

     taglib 描述了一个 标签库 —— 即一组标签/标签处理程序对。
     因为使用的是 JSP 版本 1.2,所以在这个例子中需要 tlib-version 和 short-name 元素。
     tlib-version 元素对应于标签库版本。
     jsp-version 对应于标签库所依赖的 JSP 技术的版本。
     short-name 元素定义了 IDE 和其他开发工具可以使用的标签库的简单名。
     taglib 元素包含许多 tag 元素,标签库中每一个标签有一个 tag 元素。

5. 案例实战

     (1) TLD文件:utilTag.tld

     <?xml version="1.0" encoding="UTF-8"?>
     <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
             "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

            <taglib>
                  <tlib-version>1.0.0</tlib-version>
                  <jsp-version>1.2</jsp-version>
                  <short-name>util</short-name>
                  <uri>http://com.zskx.pem/tag/util-1.0</uri>

                 <tag>
                       <name>domainUrl</name>
                       <tag-class>com.dmwdp.network.biz.commons.taglib.DomainUrlTag</tag-class>
                       <body-content>empty</body-content>
                       <attribute>
                           <name>imgUrl</name>
                           <required>true</required>
                           <rtexprvalue>true</rtexprvalue>
                      </attribute>
                 </tag>   
            </taglib>

    (2) web.xml配置

    ......

    <jsp-config>
        <taglib>
            <taglib-uri>util</taglib-uri>
            <taglib-location>/WEB-INF/taglib/utilTag.tld</taglib-location>
        </taglib>
    </jsp-config>

   ......

   (3) 标签处理类

   public class DomainUrlTag extends TagSupport {

             private static final Logger LOGGER = Logger.getLogger(DomainUrlTag.class);
             private static final long serialVersionUID = 8662373418251060423L;

             private String imgUrl;

             public void setImgUrl(String imgUrl) {
                    this.imgUrl = imgUrl;
             }

             public DomainUrlTag() {
             }

             @Override
             public int doStartTag() throws JspTagException {
                 //表示在现有的输出流对象中处理标签体,但绕过setBodyContent()和doInitBody()方法
                 return EVAL_BODY_INCLUDE;
             }

             @Override
             public int doEndTag() throws JspException {
                     if (StringUtils.isBlank(imgUrl)) {
                          return EVAL_PAGE;
             }

             String[] imgServers = ImagePropertiesReader.getImageServerURLs();
             int imgUrlCount = imgServers.length;

             int serverNum = Math.abs((imgUrl.hashCode() % imgUrlCount));

             String resultUrl = null;
             for (int i = 0; i < imgUrlCount; i++) {
                  if (serverNum == i) {
                         resultUrl = imgServers[i];
                         break;
                   }
             }
             outPutResultUrl(resultUrl);

             return EVAL_PAGE;
          }

          private void outPutResultUrl(String resultUrl) {
                  if (StringUtils.isBlank(resultUrl)) {
                       return;
           }

           try {
                    pageContext.getOut().write(resultUrl);
           } catch (IOException e) {
                  if (LOGGER.isDebugEnabled()) {
                       LOGGER.debug("Customize Tag error", e);
                  }
           }
       }
   }

   (4) 页面使用

   <%@ taglib prefix="util" uri="http://com.zskx.pem/tag/util-1.0" %>

   <link rel="shortcut icon" href="<util:domainUrl imgUrl='/pem.ico'/>/dmwdp.ico" />

   (5) ImagePropertiesReader.java

   public class ImagePropertiesReader {
        private static final Logger LOGGER = Logger.getLogger(ImagePropertiesReader.class);
        private static Properties props = new Properties();

        private ImagePropertiesReader() {

        }

        static {
               try {
                      final InputStream tempIn = ImagePropertiesReader.class.getResourceAsStream("/image.properties");
                      props.load(tempIn);
               } catch (Exception e) {
                      if (LOGGER.isDebugEnabled()) {
                          LOGGER.debug("ImagePropertiesReader error", e);
                      }
               }
         }

         public static String[] getImageServerURLs() {
                 String imgUrlStr = props.getProperty(Constant.DMWDP_IMAGE_SERVER_URLS);
                 return imgUrlStr.split(",");
         }

   }

分享到:
评论

相关推荐

    jsp自定义带属性的标签

    自定义标签可以带有属性,这些属性在标签被调用时可以传递特定的值,使得标签的使用更加灵活和强大。 #### 二、创建自定义带属性的标签步骤 1. **编写自定义标签类**:首先,你需要创建一个继承自`javax.servlet....

    JSP自定义标签学习笔记

    对于带有标记体的标签,需要继承`javax.servlet.jsp.tagext.BodyTagSupport`,并在处理类中使用`doStartTag()`、`doAfterBody()`和`doEndTag()`方法来处理标签体内容。 5.3 一个简单的带标记体的标签(二) 在实际...

    jsp自定义带标签体的标签

    在JSP中,`BodyTagSupport`接口提供了一组方法,用于处理带有体内容的标签。这些方法包括: - `doStartTag()`:此方法在标签的开始执行,它决定了是否需要评估标签体内的内容。 - `setBodyContent()`:此方法由容器...

    jsp自定义标签入门实例

    本实例将带你深入理解JSP自定义标签的创建和使用。 首先,我们要了解自定义标签的结构。自定义标签通常由三部分组成:标签库描述文件(TLD)、标签处理类(Tag Handler)和JSP页面。TLD是XML格式的文件,用于定义...

    JSP自定义标签1

    可以像这样使用带有标签体的自定义标签:`内容&lt;/my:fargment&gt;`。 通过以上步骤,你就能创建并使用自定义的JSP标签了。这增强了JSP的可扩展性和复用性,使得开发更加灵活,代码更易于管理和维护。

    一个用于分页的自定义标签

    一个“自定义标签”是开发者为了扩展JSP(JavaServer Pages)功能而创建的,它允许我们封装复杂逻辑并将其作为可重用的组件。本项目提供了一个用于分页的自定义标签,适用于那些需要在网页上进行数据分页展示的应用...

    JSP自定义标签.ppt

    3. 带标签体的标签:标签之间可以包含其他JSP标签、HTML或自定义标签的内容。 4. 可以被Scriptlet使用的标签:通过定义id和type属性,可以在标签后面的Scriptlet中引用。 在JSP技术中,自定义标签的处理类需要实现...

    JSP自定义标签开发使用

    - **带有标签体**:标签内可以包含其他内容,如`&lt;mt:iterate&gt;Hello&lt;/mt:iterate&gt;`。 - **嵌套使用**:一个自定义标签可以包含另一个自定义标签,如`&lt;map:mapdefine&gt;`中的`&lt;map:mapEntry&gt;`。 3. **标签处理程序** ...

    JSP自定义标签入门实例

    自定义标签是JSP的高级特性,它允许我们创建自己的标签库,这些标签可以有自己的行为逻辑,与内置的JSP标签(如`&lt;jsp:include&gt;`或`&lt;c:forEach&gt;`)类似。通过定义标签处理程序类和XML格式的TLD(Tag Library ...

    带有参数的taglib(自定义标签)

    “带有参数的taglib(自定义标签)”是Java Web开发中的一个重要概念,它允许我们在JSP页面中定义和使用具有参数的自定义标签,从而提高代码质量,简化开发流程。了解并熟练掌握自定义标签的创建和使用,对于提升...

    自定义标签小练习----一个简单的分页标签

    在Java Web开发中,自定义标签(Custom Tags)是一种扩展JSP功能的有效方式,它可以将复杂的业务逻辑封装起来,使得视图层代码更加简洁、易读。本篇内容主要介绍了一个简单的分页标签的实现过程,这是一个很好的学习...

    自定义标签学习笔记

    - **有属性的标签**:通过设置属性值来调用标签。 ```jsp ``` - **带体内容的标签**:可以在标签内嵌入其他内容。 ```jsp // 标签体内容 ``` #### 四、标签库文件(TLD) 1. **标签库文件的定义**:...

    jsp标签大全

    Tag标签有多种类型,包括带属性的Tag、带Body的Tag、定义了脚本变量的Tag,以及具有协作关系的Tag。例如,带属性的Tag可以通过属性传递参数,带Body的Tag可以包含其他HTML或JSP代码,定义脚本变量的Tag可以在Tag内部...

    原创-制作一个带参数的自定义标签

    本文将基于一篇技术笔记——《自定义标签库制作(二)》,详细阐述如何创建并应用带有参数的自定义标签。 **一、自定义标签的概念与意义** 自定义标签允许开发者封装复杂的业务逻辑和UI组件,以标签的形式在JSP...

    jsp自定义标签

    - **BodyTag接口**(JSP1.2):处理带有体内容的标签,增加了`doAfterBody()`和`doBeforeBody()`方法。 - **IterationTag接口**(JSP1.2):处理迭代标签,通常与BodyTag一起使用。 - **SimpleTag接口**(JSP2.0):...

    Java自定义标签 教程

    2. 带有属性的空标签,如`&lt;max num1="13" num2="32" /&gt;` 3. 带有内容的标签,如`&lt;greeting&gt;Welcome you!&lt;/greeting&gt;` 4. 带有内容和属性的标签,如`&lt;greeting name="zhou"&gt;Welcome you!&lt;/greeting&gt;` 5. 嵌套标签,如...

    jsp自定义标签之ifelse与遍历自定义标签示例.docx

    对于带有条件判断的自定义标签,如`if-else`,通常需要在`doTag()`方法中进行逻辑判断。由于示例中这部分内容较多,建议直接查看提供的资源文件。但基本思路是,在`doTag()`方法内根据属性值或表达式的计算结果来...

    自定义标签库

    自定义标签库 自定义标签库是 JSP 页面...为自定义标签定义属性时,每个属性都必须按照 JavaBean 的属性命名方式,在标签处理器中定义属性名对象的 setter 方法,用来接收 JSP 页面调用自定义标签时传递进来的属性值。

    自定义标签的使用

    通过这种方式,可以在JSP页面中动态地渲染出带有预设值的下拉列表。 #### 其他自定义标签概述 除了`options`标签之外,根据提供的文件内容,还有其他几种自定义标签可用于不同的用途: - **header**标签: 用于...

    JSP应用开发-自定义标签的使用.pptx

    **JSP自定义标签的使用**是JSP应用开发中的一种高级特性,它允许开发者创建自己的标签库,以更简洁、可复用的方式编写代码,提高程序的可读性和维护性。下面我们将深入探讨自定义标签的相关概念和创建步骤。 **1. ...

Global site tag (gtag.js) - Google Analytics