• 自定义标签


    一.自定义标签语言的特点

    <开始标签 属性="属性值">标签体</结束标签>

    空标签

    <br/><hr/>

    <开始标签></结束标签>

    <开始标签/>

    ui标签                         控制标签                  数据标签(数据标签就是用来存储数据的)

    z:out 1                            m:if          2                    m:set    4
    m:select 5                       m:forEach     3

                      

    二.JSP自定义标签生命周期图

    SKIP_BODY:跳过主体          EVAL_BODY_INCLUDE:计算标签主体内容并[输出]         EVAL_BODY_BUFFERED:计算标签主体内容并[缓存]     

      EVAL_PAGE:计算页面的后续部分      SKIP_PAGE:跳过页面的后续部分      EVAL_BODY_AGAIN:再计算主体一次

    三. 自定义标签的开发及使用步骤

    1.创建标签库类(继承BodyTagSupport)
    标签属性必须与助手类的属性对应、并且要提供对应get/set方法 2.创建标签库文件(在WEB-INF)下面,以tld为后缀,添加自定义标签的配置 3.页面引入 在JSP通过taglib指令导入标签库,并通过指定后缀自定义标签


    四.自定义标签案例

    ui标签                       控制标签                        数据标签(数据标签就是用来存储数据的)

    z:out 1                       m:if          2                    m:set    4
    m:select 5                  m:forEach     3

    助手类(set  out  if )

    SetTag 
     1 package com.JavaCustomLabel.day;
     2 
     3 import javax.servlet.jsp.JspException;
     4 import javax.servlet.jsp.tagext.BodyTagSupport;
     5 
     6 public class SetTag extends BodyTagSupport{
     7 
     8     /**
     9      * 
    10      */
    11     private static final long serialVersionUID = 4392633628405470426L;
    12 
    13     private String var;
    14     private String value;
    15     public String getVar() {
    16         return var;
    17     }
    18     public void setVar(String var) {
    19         this.var = var;
    20     }
    21     public String getValue() {
    22         return value;
    23     }
    24     public void setValue(String value) {
    25         this.value = value;
    26     }
    27     @Override
    28     public int doStartTag() throws JspException {
    29         // TODO Auto-generated method stub
    30         pageContext.setAttribute(var, value);
    31         
    32         return SKIP_BODY;
    33     }
    34 }

    OutTag 

    package com.JavaCustomLabel.day;

    import java.io.IOException;

    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.JspWriter;
    import javax.servlet.jsp.tagext.BodyTagSupport;

    public class OutTag extends BodyTagSupport{

    /**
    *
    */
    private static final long serialVersionUID = 3372012340573875946L;

    private String value;

    public String getValue() {
    return value;
    }

    public void setValue(String value) {
    this.value = value;
    }
    @Override
    public int doStartTag() throws JspException {
    // TODO Auto-generated method stub
    JspWriter out = pageContext.getOut();
    try {
    out.print(value);
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return SKIP_BODY;
    }
    }

    IfTag

    package com.JavaCustomLabel.day;
    
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.tagext.BodyTagSupport;
    
    public class IfTag extends BodyTagSupport{
    
        /**
         * 
         */
        private static final long serialVersionUID = -1792746228632351099L;
    
        private Boolean test;
    
        public Boolean getTest() {
            return test;
        }
    
        public void setTest(Boolean test) {
            this.test = test;
        }
        @Override
        public int doStartTag() throws JspException {
            // TODO Auto-generated method stub
            return test ? EVAL_BODY_INCLUDE :SKIP_BODY;
        }
    }

    x.tld文件

    <?xml version="1.0" encoding="UTF-8"?>
    <taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
    
    
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>
      <short-name>Simple Tags</short-name>
      <uri>/XuFanQi</uri>
    
     
    <!-- set标签 --> 
      <tag>
        <!-- 标签库中的标签  (类似c:set c:out的定义) -->
        <name>set</name>
        <!-- 是标签运行具体代码,也就是助手类,下面填写的助手类的全路径名 -->
        <tag-class>com.JavaCustomLabel.day.SetTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <!-- 该标签的属性 -->
            <name>var</name>
            <!-- 该属性是否必填 -->
            <required>true</required>
            <!-- 是否支持表达式 -->
            <rtexprvalue>false</rtexprvalue>
        </attribute>
         <attribute>
            <!-- 该标签的属性 -->
            <name>value</name>
            <!-- 该属性是否必填 -->
            <required>true</required>
            <!-- 是否支持表达式 -->
            <rtexprvalue>true</rtexprvalue>
        </attribute>
      </tag>
    
    <!-- out标签 --> 
      <tag>
        <name>out</name>
        <tag-class>com.JavaCustomLabel.day.OutTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <name>value</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
      </tag>
     <!-- IF标签 -->
      <tag>
        <name>if</name>
        <tag-class>com.JavaCustomLabel.day.IfTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <name>test</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
      </tag>
    </taglib>
    jsp页面引入
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        <%@taglib uri="/XuFanQi" prefix="x" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <x:Set var="name" value="李四"></x:Set>
    <x:Out value="${name }"></x:Out>
    <br>
    ---------------------
    <br>
    <x:if test="true">张三</x:if>
    <x:if test="false">王五</x:if>
    </body>
    </html>
    页面引入显示

     

    Foreach标签
    ForeachTag(助手类)
     1 package com.JavaCustomLabel.day;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Iterator;
     5 import java.util.List;
     6 
     7 import javax.servlet.jsp.JspException;
     8 import javax.servlet.jsp.tagext.BodyTagSupport;
     9 
    10 /**
    11  * c:forech
    12  * 
    13  * var 指针
    14  * items  指的是需要遍历的集合对象
    15  * <c:forech var="stu" items="stus">
    16  *  ${stu.sid}
    17  *  ......
    18  * </c:forech>
    19  * @author Administrator
    20  *
    21  */
    22 public class ForeachTag extends BodyTagSupport {
    23 
    24     
    25     private static final long serialVersionUID = 3755053789995595493L;26 
    27     private String var;
    28     private List<Object> items = new  ArrayList<>();
    29     public String getVar() {
    30         return var;
    31     }
    32     public void setVar(String var) {
    33         this.var = var;
    34     }
    35     public List<Object> getItems() {
    36         return items;
    37     }
    38     public void setItems(List<Object> items) {
    39         this.items = items;
    40     }
    41     
    42     @Override
    43     public int doStartTag() throws JspException {
    44         
    45         Iterator it = items.iterator();
    46 //        默认指针存放的位置是没有指向对象的,现在需要指向对象。那么需要指针下移
    47         pageContext.setAttribute(var, it.next());
    48 //        英文集合中元素较多,那么指针需要循环的向下移动,那么需要我们将迭代器保存,用于下一次指针下移所用
    49         pageContext.setAttribute("it", it);
    50         return EVAL_BODY_INCLUDE;
    51     }
    52     
    53     @Override
    54     public int doAfterBody() throws JspException {
    55 //        获取以保存的迭代器
    56         Iterator it = (Iterator) pageContext.getAttribute("it");
    57         if(it.hasNext()) {
    58 //            指针下移指向新的元素
    59             pageContext.setAttribute(var, it.next());
    60 //            再保存正在使用的迭代器
    61             pageContext.setAttribute("it", it);
    62             return EVAL_BODY_AGAIN;
    63         }else {
    64             return EVAL_PAGE;
    65         }
    66     }
    67 }
    
    

    x.tld文件

     1 <!-- Foreach标签 -->
     2 <tag>
     3     <name>foreach</name>
     4     <tag-class>com.JavaCustomLabel.day.ForeachTag</tag-class>
     5     <body-content>JSP</body-content>
     6     <attribute>
     7         <name>var</name>
     8         <required>true</required>
     9         <rtexprvalue>false</rtexprvalue>
    10     </attribute>
    11      <attribute>
    12         <name>items</name>
    13         <required>true</required>
    14         <rtexprvalue>true</rtexprvalue>
    15     </attribute>
    16   </tag>
    jsp页面引入
     1 <%
     2       List<Student> list = new ArrayList<Student>();
     3       list.add(new Student("s001","zs"));
     4       list.add(new Student("s002","li"));
     5       list.add(new Student("s003","zz"));
     6       request.setAttribute("stus", list);
     7    %>
     8    <br>
     9    <ul>
    10    <x:foreach items="${stus }" var="s">
    11        ${s.sid }
    12        ${s.sname }<br>
    13    </z:foreach>
    14    </ul>
    15    <br>
    select标签
    SelectTag(助手类)
      1 package com.JavaCustomLabel.day;
      2 
      3 import java.io.IOException;
      4 import java.lang.reflect.Field;
      5 import java.lang.reflect.InvocationTargetException;
      6 import java.util.ArrayList;
      7 import java.util.List;
      8 
      9 import javax.servlet.jsp.JspException;
     10 import javax.servlet.jsp.JspWriter;
     11 import javax.servlet.jsp.tagext.BodyTagSupport;
     12 
     13 import org.apache.commons.beanutils.BeanUtils;
     14 
     15 /**
     16  * <select id='' name=''>
     17  *    <option value='-1' selected >---请选择---</option>
     18  * </select>
     19  * 
     20  * 
     21  * --->
     22  *    <z:select ....></select>
     23  *    查询维度:  下拉列表
     24  *    修改页面:   下拉列表        数据回显
     25  *    
     26  *    1.id name
     27  *    2.数据源,存入数据库中的值 textKey、展示列textVal
     28  *    3.加入属性(默认的头部属性值headTextKey、默认的展示列值headTextVal)
     29  *    4.加入属性,能够实现数据回显的功能selectedVal
     30  *    
     31  * @author Administrator
     32  *
     33  */
     34 public class SelectTag extends BodyTagSupport {
     35 
     36     
     37     private static final long serialVersionUID = -8499199884457216397L; 38 
     39     private String id;
     40     private String name;
     41     private List<Object> items = new ArrayList<>();
     42     private String textKey;
     43     private String textVal;
     44     private String headTextKey;
     45     private String headTextVal;
     46     private String selectedVal;
     47     public String getId() {
     48         return id;
     49     }
     50     public void setId(String id) {
     51         this.id = id;
     52     }
     53     public String getName() {
     54         return name;
     55     }
     56     public void setName(String name) {
     57         this.name = name;
     58     }
     59     public List<Object> getItems() {
     60         return items;
     61     }
     62     public void setItems(List<Object> items) {
     63         this.items = items;
     64     }
     65     public String getTextKey() {
     66         return textKey;
     67     }
     68     public void setTextKey(String textKey) {
     69         this.textKey = textKey;
     70     }
     71     public String getTextVal() {
     72         return textVal;
     73     }
     74     public void setTextVal(String textVal) {
     75         this.textVal = textVal;
     76     }
     77     public String getHeadTextKey() {
     78         return headTextKey;
     79     }
     80     public void setHeadTextKey(String headTextKey) {
     81         this.headTextKey = headTextKey;
     82     }
     83     public String getHeadTextVal() {
     84         return headTextVal;
     85     }
     86     public void setHeadTextVal(String headTextVal) {
     87         this.headTextVal = headTextVal;
     88     }
     89     public String getSelectedVal() {
     90         return selectedVal;
     91     }
     92     public void setSelectedVal(String selectedVal) {
     93         this.selectedVal = selectedVal;
     94     }
     95     
     96     @Override
     97     public int doStartTag() throws JspException {
     98         JspWriter out = pageContext.getOut();
     99         try {
    100             out.write(toHTML());
    101         } catch (IOException | NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
    102             // TODO Auto-generated catch block
    103             e.printStackTrace();
    104         }
    105         
    106         return super.doStartTag();
    107     }
    108     
    109     /**
    110      * 拼接出下拉 列表所对应的selecte的HTML代码
    111      * <select id='' name=''>
    112             <option value='-1' selected >---请选择---</option>
    113        </select>
    114      * @return
    115      * @throws SecurityException 
    116      * @throws NoSuchFieldException 
    117      * @throws IllegalAccessException 
    118      * @throws IllegalArgumentException 
    119      * @throws NoSuchMethodException 
    120      * @throws InvocationTargetException 
    121      */
    122     private String toHTML() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    123         StringBuilder sb = new StringBuilder();
    124         sb.append("<select id='"+id+"' name='"+name+"' >");
    125         if(!(headTextKey == null || "".equals(headTextKey) || headTextVal == null || "".equals(headTextVal))) {
    126             sb.append("<option value='"+headTextKey+"' selected >"+headTextVal+"</option>");
    127         }
    128         String val;
    129         String html;
    130         for (Object obj : items) {
    131 //            让学生的id存入数据库,让学生的名字展示在jsp页面
    132 //            <option value='s001'>zs</option>
    133 //            obj sid sname
    134 //            第一种方式
    135             Field textKeyField = obj.getClass().getDeclaredField(textKey);
    136             textKeyField.setAccessible(true);
    137             val = (String) textKeyField.get(obj);
    138 //            第二种方式(需要架包) 
    139             html = BeanUtils.getProperty(obj, textVal);
    140             if(val.equals(selectedVal)) {
    141                 sb.append("<option value='"+val+"' selected>"+html+"</option>");
    142             }else {
    143                 sb.append("<option value='"+val+"' >"+html+"</option>");
    144             }
    145         }
    146         sb.append("</select>");
    147         return sb.toString();
    148     }
    149 }

    x.tld文件

    
    
     1 <tag>
     2     <name>select</name>
     3     <tag-class>com.JavaCustomLabel.day.SelectTag</tag-class>
     4     <body-content>JSP</body-content>
     5     <attribute>
     6         <name>id</name>
     7         <required>false</required>
     8         <rtexprvalue>false</rtexprvalue>
     9     </attribute>
    10      <attribute>
    11         <name>name</name>
    12         <required>false</required>
    13         <rtexprvalue>false</rtexprvalue>
    14     </attribute>
    15     <attribute>
    16         <name>items</name>
    17         <required>true</required>
    18         <rtexprvalue>true</rtexprvalue>
    19     </attribute>
    20     <attribute>
    21         <name>textKey</name>
    22         <required>true</required>
    23         <rtexprvalue>false</rtexprvalue>
    24     </attribute>
    25     <attribute>
    26         <name>textVal</name>
    27         <required>true</required>
    28         <rtexprvalue>false</rtexprvalue>
    29     </attribute>
    30     <attribute>
    31         <name>headTextKey</name>
    32         <required>false</required>
    33         <rtexprvalue>false</rtexprvalue>
    34     </attribute>
    35     <attribute>
    36         <name>headTextVal</name>
    37         <required>false</required>
    38         <rtexprvalue>false</rtexprvalue>
    39     </attribute>
    40     <attribute>
    41         <name>selectedVal</name>
    42         <required>false</required>
    43         <rtexprvalue>true</rtexprvalue>
    44     </attribute>
    45   </tag>
    jsp页面引入
     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3     <%@taglib uri="/XuFanQi" prefix="x" %>
     4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     5 <html>
     6 <head>
     7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     8 <title>Insert title here</title>
     9 </head>
    10 <body>
    11 
    12 <x:select headTextKey="-1" headTextVal="---请选择---" selectedVal="s003" textVal="sname" items="${stus }" textKey="sid"></z:select>
    13 
    14 </body>
    15 </html>
     
     
     
     

       

     
  • 相关阅读:
    使用MetaLogo对不等长序列绘制Sequence logo
    RocketMQ源码 索引文件/indexFile 和 消费队列/ConsumeQueue
    看了两篇教程,我的博客炸了
    BCD注册表找不到怎么办?
    扫一扫PC版 V0.3
    java_Lambda表达式
    Java_多线程
    java_静态方法和非静态方法的区别
    idea_快捷键
    Java_稀疏数组
  • 原文地址:https://www.cnblogs.com/xcn123/p/11042328.html
Copyright © 2020-2023  润新知