`
KuangYeYaZi
  • 浏览: 55798 次
文章分类
社区版块
存档分类
最新评论

SimpleTagSupport 类别(<jsp:attribute>)

 
阅读更多

SimpleTagSupport类别顾名思义,就是可以处理一些简单的自订标签需求,它是在JSP 2.0之后新增的类别,对于一些简单的自订标签页求,您可以继承它来实作标签处理类别,而不用为了处理一些TagSupport、 BodyTagSuppourt类别中回传值的问题。

为了使用上的简单而降低了复杂性,另一方面就是SimpleTagSupport类别所处理的功能受了些限制,它只处理标签与本体,要不要显示本体文字取决于您,对于标签之后的页面则不在SimpleTagSupport处理的范围之内(虽然您还是可以使用forward之类的方式来决定要不要显示之后的页面,但直接实作TagSupport会更方便一些),另外SimpleTagSupport类别的本体文字不能设定为JSP,这也是使用 SimpleTagSupport上的一些限制。

尽管有了一些限制,对于简单的自订标签需求,使用SimpleTagSupport还是比较容易的,它实作了SimpleTag介面,您只要重新定义 doTag()方法就可以实作自订标签的处理,先来看一个简单的范例:

    * SimpleHelloTag.java

import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
 
public class SimpleHelloTag extends SimpleTagSupport {
    public void doTag() throws JspException, IOException {
        JspWriter out = getJspContext().getOut();
        out.println("Hello!World!");
    }
}

 

假设在tld档中设定是这样的:

    * hello.tld

...
   

 <tag>
        <description>Simple Tag</description>
        <name>hello</name>
 
    <tag-class>onlyfun.caterpillar.SimpleHelloTag</tag-class>
        <body-content>empty</body-content>
    </tag>

 
...


则我们就可以在JSP网页中这么使用以显示一段Hello!World!文字:
<caterpillar:hello/>
 
当然要真正显示字串,别忘了web.xml中的设定与taglib的设定,前面已经说过好多次,不再重复了。

SimpleTagSupport预设不显示本体文字,如果您想要自订可以显示本体文字的标签,则可以这么撰写:

    * SimpleTextTag.java
 

import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
 
public class SimpleHelloTag extends SimpleTagSupport {
    public void doTag() throws JspException, IOException {
        JspFragment frag = getJspBody();

        frag.invoke(null);
    }
}

 

getJspBody()方法传回JspFragment物件,它包括了标签本体的相关讯息,使用invoke()方法可以将这些讯息写入指定的 Writer中,如果设定为null,则预设写入getJspContext().getOut()取得的Writer,假设 tld档是这样设定:

    * text.tld

...
    

<tag>
        <description>Simple Tag</description>
        <name>showbody</name>
        <tag-class>demo.tags.SimpleTagText</tag-class>
        <body-content>tagdependent</body-content>
    </tag>

 
...


则可以在JSP网页中这么使用它,作用只是将本体文字再显示出来:
<caterpillar:showbody>
    显示这段文字。。。。
</caterpillar:showbody>
 
除了使用上面的方式来包装本体文字至JspFragment中之外,您还可以< jsp:attribute>动作元素,将指定的文字包装为JspFragment,例如先撰写以下的标签处理类别:

    * SimpleFragTag.java
 
import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
 
public class SimpleFragTag extends SimpleTagSupport {
    private JspFragment fragment1;
    private JspFragment fragment2;
 
    public void setFragment1(JspFragment fragment1) {
        this.fragment1 = fragment1;
    }
 
    public void setFragment2(JspFragment fragment2) {
        this.fragment2 = fragment2;
    }
 
    public void doTag() throws JspException, IOException {
        fragment2.invoke(null);
        fragment1.invoke(null);
    }
}


这个处理类别将接受两个JspFragment,为了要能包装JspFragment,必须在tld档中指定:

    * frag.tld

 ...
    <tag>
        <description>Simple Tag</description>
        <name>fragtest</name>
        <tag-class>onlyfun.caterpillar.SimpleFragTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>fragment1</name>
            <required>true</required>
            <fragment>true</fragment>
        </attribute>
        <attribute>
            <name>fragment2</name>
            <required>true</required>
            <fragment>true</fragment>
        </attribute>
    </tag>
 ...


这次在设定属性时,指定<fragment>为true,表示属性将接受JspFragment物件,接下来这样测试:

    * test.jsp

<%@taglib prefix="caterpillar"
           uri="http://caterpillar.onlyfun.net/"%>
<html>
<body>

<caterpillar:fragtest>
 <jsp:attribute name="fragment1">
    Frag1 Test ..... <br>
 </jsp:attribute>
 <jsp:attribute name="fragment2">
    Frag2 Test .... <br>
 </jsp:attribute>
</caterpillar:fragtest>

</body>
</html>


这个JSP网页的传回结果如下:
<html>
<body>
 Frag2 Test .... <br>Frag1 Test ..... <br>
</body>
</html>
 
如果您想要处理标签的本体文字内容的话该怎么办呢?invoke()方法可以将文字写入指定的Writer中,可以使用StringWriter,将文字写入当中,然后再取得String物件就可以进行处理了,例如:

    * SimpleDemoTag.java

package onlyfun.caterpillar;
 
import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
 
public class SimpleDemoTag extends SimpleTagSupport {
    public void doTag() throws JspException, IOException {
        JspFragment frag = getJspBody();
        JspWriter out = getJspContext().getOut();
        StringWriter writer = new StringWriter();
 
        frag.invoke(writer);
        String str = writer.toString();
        out.println(str.replaceAll("<%","&lt;%"));
    }
}


上面的程式示范了如何处理本体文字,这个标签处理类别将所有的 <% 置换 &lt;。

 

 

http://blog.sina.com.cn/s/blog_3ff3946a01009nol.html

分享到:
评论

相关推荐

    简单的自定义标签入门例子

    &lt;jsp-version&gt;2.0&lt;/jsp-version&gt; &lt;short-name&gt;mytags&lt;/short-name&gt; &lt;uri&gt;http://example.com/mytags&lt;/uri&gt; &lt;tag&gt; &lt;name&gt;customTag&lt;/name&gt; &lt;tag-class&gt;com.example.MyCustomTag&lt;/tag-class&gt; &lt;body-content&gt;...

    JSP/Servlet

    SimpleTagSupport 類別(&lt;jsp:attribute&gt;) Scripting Variable Tag File Tag File是從JSP 2.0開始新增的功能,主要的目的是讓撰寫JSP網頁的網頁設計人員即使在不懂Java語法的情況下,也可以使用JSP語法來自訂...

    动态属性自定义标签

    3. **在JSP页面中使用自定义标签**:在JSP页面中,可以通过`&lt;jsp:attribute&gt;`或`&lt;c:set&gt;`标签设置动态属性,然后使用自定义标签。动态属性以`name="..." value="..."`的形式传递。 例如,一个简单的动态属性自定义...

    JAVA自定义标签例子

    &lt;p&gt;格式化后:&lt;my:decimalFormat number="${someNumber}" decimals="2" /&gt;&lt;/p&gt; &lt;p&gt;截取后:&lt;my:trimDecimal number="${someOtherNumber}" /&gt;&lt;/p&gt; ``` 这里的`/WEB-INF/mytags.tld`应替换为实际的TLD文件路径。 总结...

    jsp tag标签的使用

    &lt;jsp-version&gt;2.0&lt;/jsp-version&gt; &lt;short-name&gt;myTags&lt;/short-name&gt; &lt;uri&gt;http://example.com/myTags&lt;/uri&gt; &lt;tag&gt; &lt;name&gt;helloWorld&lt;/name&gt; &lt;tag-class&gt;com.example.HelloWorldTag&lt;/tag-class&gt; &lt;body-content&gt;...

    jsp 自定义标签

    在JSP中,有一些标准标签(如 `&lt;c:if&gt;`、`&lt;c:forEach&gt;` 等)用于执行基本的控制结构和数据操作。但当遇到更为复杂的业务逻辑时,这些标准标签往往显得力不从心。这时,自定义标签的优势就体现出来了。它们不仅可以...

    掌握自定义jsp标签

    在传统的JSP页面中,我们常常使用内置标签如`&lt;jsp:include&gt;`、`&lt;jsp:forward&gt;`等来实现页面间的交互。然而,当业务逻辑变得复杂时,这些内置标签往往不足以满足需求。自定义JSP标签应运而生,它允许开发者创建自己的...

    自定义标签

    Hello, &lt;span&gt;&lt;jsp:getProperty name="name" /&gt;&lt;/span&gt;! &lt;/div&gt; ``` 4. **在JSP页面中使用自定义标签** 在JSP页面中,我们通过`&lt;%@ taglib %&gt;`指令引入标签库,然后像使用内置标签一样使用自定义标签: ```jsp...

    自定义jsp标签

    在JSP中,有两种类型的标签:标准动作标签(如`&lt;jsp:include&gt;`、`&lt;jsp:forward&gt;`等)和自定义标签。自定义标签是通过JSP标签库(Tag Library)来实现的,通常包含一个`.tld`(Tag Library Descriptor)文件和对应的...

    Jsp自定义标签打包成Jar简单实例(含代码)

    &lt;jsp-version&gt;2.0&lt;/jsp-version&gt; &lt;short-name&gt;mytags&lt;/short-name&gt; &lt;uri&gt;http://example.com/mytags&lt;/uri&gt; &lt;tag&gt; &lt;name&gt;myTag&lt;/name&gt; &lt;tag-class&gt;com.example.MyTag&lt;/tag-class&gt; &lt;!-- 可选的属性定义 --&gt; ...

    JSP简单标签

    在JSP页面中,通过`&lt;taglib&gt;`指令引入标签库,然后使用`&lt;jsp:doTag&gt;`元素调用简单标签,例如: ```jsp &lt;jsp:doTag name="myTag" bodyContent="scriptless" /&gt; ``` 这里的`name`属性指定标签库中的标签名称,`body...

    jsp 自定义标签 供自学时用

    &lt;body-content&gt;JSP&lt;/body-content&gt; &lt;attribute&gt; &lt;name&gt;items&lt;/name&gt; &lt;required&gt;true&lt;/required&gt; &lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt; &lt;/attribute&gt; &lt;/tag&gt; ``` 2. **实现 Tag Handler**: ```java public ...

    jsp简单自定义标签的forEach遍历及转义字符示例.docx

    Map&lt;String, String&gt; map = new HashMap&lt;&gt;(); map.put("aa", "aaaa"); map.put("bb", "bbbb"); map.put("cc", "cccc"); map.put("dd", "dddd"); map.put("ee", "eeee"); request.setAttribute("map", map); ...

    simpletagsupport实例

    &lt;jsp-version&gt;2.0&lt;/jsp-version&gt; &lt;short-name&gt;myTags&lt;/short-name&gt; &lt;uri&gt;http://example.com/myTags&lt;/uri&gt; &lt;tag&gt; &lt;name&gt;sayHello&lt;/name&gt; &lt;tag-class&gt;com.example.SayHelloTag&lt;/tag-class&gt; &lt;body-content&gt;...

    jsp自定义标签开发+TLD文件元素详解+实例

    - `&lt;attribute&gt;`:描述标签的属性。 4. **标签和属性定义**: - `&lt;description&gt;`:为标签或属性提供描述信息。 - `&lt;name&gt;`:属性的名称。 - `&lt;required&gt;`:指示属性是否必须。 - `&lt;rtexprvalue&gt;`:表明属性...

    java标签库

    &lt;jsp-version&gt;2.0&lt;/jsp-version&gt; &lt;short-name&gt;mytags&lt;/short-name&gt; &lt;uri&gt;http://www.example.com/mytags&lt;/uri&gt; &lt;tag&gt; &lt;name&gt;greeting&lt;/name&gt; &lt;tag-class&gt;com.example.GreetingTag&lt;/tag-class&gt; &lt;body-content...

    JSP自定义标签-标签属性_动力节点Java学院整理

    1. 自定义标签的必要性:在JSP中,原生的标签(如&lt;% %&gt;, &lt;%= %&gt;, &lt;jsp:include&gt;, &lt;jsp:forward&gt; 等)对于许多常见的任务来说已经足够,但在需要高度可定制化的场景下,自定义标签提供了一种方式来扩展JSP的功能。...

    自定义JSP分页标签

    最后,在JSP页面中使用`&lt;%@ taglib uri="/WEB-INF/tlds/PaginationTagLib.tld" prefix="pag" %&gt; `导入标签库,并使用`&lt;pag:pagination ... /&gt;`调用标签。 ```jsp &lt;%@ taglib uri="/WEB-INF/tlds/PaginationTagLib....

Global site tag (gtag.js) - Google Analytics