zoukankan      html  css  js  c++  java
  • jsp自定义标签

    要创建自定义的JSP标签,首先必须创建处理标签的Java类

    1.自定义类并继承SimpleTagSupport

    public class ObjToJson extends SimpleTagSupport {
        private Object obj;
    
        @Override
        public void doTag() throws JspException, IOException {
            JspWriter out = getJspContext().getOut();
            if (null != obj) {
                out.write(JSON.toJSONString(obj));
            }
        }
    
        public Object getObj() {
            return obj;
        }
    
        public void setObj(Object obj) {
            this.obj = obj;
        }
    
    }
    public class ForEachList extends SimpleTagSupport {
        private Collection<?> items;
        private String var;
    
        @Override
        public void doTag() throws JspException, IOException {
            for (Object i : items) {
                getJspContext().setAttribute(var, i);
                getJspBody().invoke(null);
            }
    
        }
    }

    2.编写tld文件,并添加到WEB-INF下

    <?xml version="1.0" encoding="UTF-8" ?>
    
    <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
        version="2.1">
    
        <description>cnsdhzzl tagUtils</description>
        <display-name></display-name>
        <tlib-version>1.1</tlib-version>
        <short-name>zl</short-name>
        <uri>http://cn.cnsdhzzl.tag</uri>
    
        <tag>
            <description>object to json string</description>
            <name>objToJson</name>
            <tag-class>cn.cnsdhzzl.utils.ObjToJson</tag-class>
            <body-content>scriptless</body-content>
            <attribute>
                <description>Object</description>
                <name>obj</name>
                <required>false</required>
                <rtexprvalue>true</rtexprvalue>
            </attribute>
        </tag>
    
        <tag>
            <description>foreach list</description>
            <name>forEach</name>
            <tag-class>cn.cnsdhzzl.utils.ForEachList</tag-class>
            <body-content>scriptless</body-content>
            <attribute>
                <name>var</name>
                <required>true</required>
                <rtexprvalue>true</rtexprvalue>
            </attribute>
            <attribute>
                <name>items</name>
                <rtexprvalue>true</rtexprvalue>
                <type>java.lang.Object</type>
            </attribute>
        </tag>
        
    </taglib>

    3.jsp页面引用

    <table border="1px;" style="margin:0px auto;" >
        <tr>
            <c:forEach items="${list }" var="i">
                <td>${i.id }</td>
                <td>${i.name }</td>
                <td>${i.age }</td>
            </c:forEach>
        </tr>
        <tr>
            <td colspan="6">${list }</td>
        </tr>
        <tr>
            <td colspan="6"><zl:objToJson obj="${list }"></zl:objToJson></td>
        </tr>
        <tr>
            <td colspan="6">
            <zl:forEach items="${list }" var="i">
                ${i.id }${i.name }${i.age }
            </zl:forEach>
            </td>
        </tr>
    </table>

    效果图

     

    标签说明

    <short-name>:指明推荐使用的prefix(这个属性会在jsp页面中引入标签的时候出现)。
    <uri>:指明引用这个标签库时使用的uri(注意哦是uri不是url)。
    <tag>:指明要定义标签的信息。

    属性说明

    name        定义属性的名称。每个标签的是属性名称必须是唯一的。
    tag-class    指定映射的Java类。 required    指定属性是否是必须的或者可选的,如果设置为false为可选。 rtexprvalue  声明在运行表达式时,标签属性是否有效。 type     定义该属性的Java类类型 。默认指定为 String description  描述信息 fragment    如果声明了该属性,属性值将被视为一个 JspFragment。
    bodycontent  指明标签体的限定,empty:指定该标签只能作用空标签使用;scriptless:指定该标签的标签体可以是静态HTML元素、表达式语言,但不允许出现JSP脚本。

    SimpleTag接口详解:

    方法

    说明

    doTag()方法

    是核心方法,用于编写标签处理逻辑。

    setParent(JspTag)方法

    将父标签处理器对象传递给标签处理器。

    getParent()方法

    获取当前标签的父标签对象。

    setJspContext(JspContext)方法

    将JSP页面的pageContext对象传递给标签处理器对象。

    setJspBody(JspFragment)方法

    将代表当前标签体的JspFragment对象传递给标签处理器对象。(JspFragment中的invoke(Writer)方法用于执行JspFragment对象所代表的代码段)

    body-content的值共有4种:

      <body-content>tagdependent</body-content>
      <body-content>JSP</body-content>
      <body-content>empty</body-content>
      <body-content>scriptless</body-content>

    tagdependent:标签体内容直接被写入BodyContent,由自定义标签类来进行处理,而不被JSP容器解释,

    如下:

    <test:myList>

    select name,age from users

    </test:myList>

    JSP:接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、JSP指令和动作。如:

    <my:test>

    <%=request.getProtocol()%> // ②

    </my:test>

    具体可参考后面附源码。

    empty:空标记,即起始标记和结束标记之间没有内容。

    下面几种写法都是有效的,

    <test:mytag />

    <test:mytag uname="Tom" />

    <test:mytag></test:mytag>

    scriptless:接受文本、EL和JSP动作。如上述②使用<body-content> scriptless </body-content>则报错,具体可参考后面附源码。

  • 相关阅读:
    高并发、高性能、高可用
    性能优化 = 改改代码?
    高级开发必须理解的Java中SPI机制
    java性能优化的50个细节(珍藏版)
    Java API 设计清单
    QString与QByteArray互相转换的方法
    QT 托盘 hover事件捕捉
    qt捕获全局windows消息
    前端开发树形插件带来的烦恼(一)
    靠谱的div引入任何外链内容
  • 原文地址:https://www.cnblogs.com/cnsdhzzl/p/8934476.html
Copyright © 2011-2022 走看看