自定义标签(TagSupport )

自定义标签(TagSupport )定义最简单的标签自定义标签采用Default Adapter模式(缺省适配模式)Java代码配置文件Xml代码JSP页面Html代码TagSupport的流程图SKIP_BO

大家好,又见面了,我是你们的朋友全栈君。

定义最简单的标签    
自定义标签采用Default Adapter模式(缺省适配模式) 

Java代码

 1  //最简单的标签     
 2  public class LangHuaTag extends TagSupport {     
 3      private long startTime;     
 4      private long endTime;     
 5           
 6      public int doStartTag() throws JspException {     
 7          startTime = System.currentTimeMillis();     
 8          //表示定制标记里面有所包括的JSP页面     
 9          return TagSupport.EVAL_BODY_INCLUDE;     
10      }     
11      public int doEndTag() throws JspException {     
12          endTime = System.currentTimeMillis();     
13          long elapsed = endTime - startTime;          
14          try {     
15              JspWriter out = pageContext.getOut();     
16              out.println("runtime is "+ elapsed);     
17          } catch (IOException e) {     
18              e.printStackTrace();     
19          }     
20          //表示JSP页面继续运行     
21          return TagSupport.EVAL_PAGE;     
22      }     
23           
24  }     
25  //代属性的标签     
26  public class DateTag extends TagSupport {     
27      private String pattern = "yyyy-MM-dd hh:mm:ss";     
28      private Date date;     
29      //必须要有Set方法,因为是属性可以设值     
30      public void setPattern(String pattern) {     
31          this.pattern = pattern;     
32      }     
33           
34      public void setDate(Date date) {     
35          this.date = date;     
36      }     
37      
38      public int doEndTag() throws JspException {     
39          SimpleDateFormat sdf = new SimpleDateFormat(pattern);     
40          //如果没有就是当前时间     
41          if(date==null){     
42              date = new Date();     
43          }            
44          JspWriter out = pageContext.getOut();     
45          try {     
46              out.print(sdf.format(date));     
47          } catch (IOException e) {     
48              e.printStackTrace();     
49          }     
50          return TagSupport.EVAL_PAGE;     
51      }     
52  }     
53      
54  /**   
55   * 循环输出   
56   * @author Administrator   
57   *   
58   */    
59  public class LoopTag extends TagSupport {     
60      private int times =0;     
61      //Set方法设值     
62      public void setTimes(int times) {     
63          this.times = times;     
64      }     
65           
66      public int doStartTag() throws JspException {     
67          //表示定制标记里面有所包括的JSP页面     
68          return TagSupport.EVAL_BODY_INCLUDE;     
69      }     
70           
71      public int doAfterBody() throws JspException {     
72          if(times>0){     
73              times--;     
74              //表示双从标签开始输入     
75              return TagSupport.EVAL_BODY_AGAIN;     
76          }        
77          //表示结束,忽略标签内部的内容     
78          return TagSupport.SKIP_BODY;     
79      }     
80           
81  }    

配置文件    
Xml代码

 1  <?xml version="1.0" encoding="UTF-8" ?>    
 2  <taglib xmlns="http://java.sun.com/xml/ns/j2ee"    
 3      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
 4      xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"    
 5      version="2.0">    
 6      <tlib-version>1.0</tlib-version>    
 7      <short-name>util</short-name>    
 8      <uri>http://langhua.com/taglib/util</uri>    
 9      <tag>    
10          <name>timer</name>    
11          <tag-class>com.langhua.tagsupport.LangHuaTag</tag-class>    
12          <body-content>JSP</body-content>    
13          <!-- JSP,empty表示能能包函内容的,scriptless,tagdependent -->    
14      </tag>    
15           
16      <tag>    
17          <name>date</name>    
18          <tag-class>com.langhua.tagsupport.DateTag</tag-class>    
19          <body-content>empty</body-content>           
20          <!-- JSP,empty表示不能包函内容的,scriptless,tagdependent -->    
21          <attribute>    
22              <!-- 标签名 -->    
23              <name>time</name>    
24              <!-- 是否为可选属性 -->    
25              <required>false</required>    
26              <!-- 是否接受JSP表达示计算结果 -->    
27              <rtexprvalue>true</rtexprvalue>    
28          </attribute>    
29          <attribute>    
30              <name>pattern</name>    
31              <required>true</required>    
32              <rtexprvalue>false</rtexprvalue>    
33          </attribute>    
34      </tag>    
35           
36      <tag>    
37          <name>loop</name>    
38          <tag-class>com.langhua.tagsupport.LoopTag</tag-class>    
39          <body-content>JSP</body-content>             
40          <!-- JSP,empty表示不能包函内容的,scriptless,tagdependent -->    
41          <attribute>    
42              <!-- 标签名 -->    
43              <name>times</name>    
44              <!-- 是否为可选属性 -->    
45              <required>true</required>    
46              <!-- 是否接受JSP表达示计算结果 -->    
47              <rtexprvalue>true</rtexprvalue>    
48          </attribute>           
49      </tag>    
50  </taglib>    

JSP页面    
Html代码  

 1  <%@ taglib prefix="util" uri="http://langhua.com/taglib/util"%>    
 2      
 3  <util:timer></util:timer>    
 4  <util:loop times="3">    
 5      <util:date pattern="yyyy-MM-dd" /><br/>    
 6  </util:loop>    
 7    
 8  <%@ taglib prefix="util" uri="http://langhua.com/taglib/util"%>  
 9    
10  <util:timer></util:timer>  
11  <util:loop times="3">  
12      <util:date pattern="yyyy-MM-dd" /><br/>  
13  </util:loop>

 

TagSupport的流程图

      SKIP_BODY 表示不用处理标签体,直接调用doEndTag()方法。
   
    SKIP_PAGE 忽略标签后面的JSP内容。
   
  EVAL_PAGE 处理标签后,继续处理JSP后面的内容。
   
  EVAL_BODY_BUFFERED 表示需要处理标签体。
   
  EVAL_BODY_INCLUDE 表示需要处理标签体,但绕过setBodyContent()和doInitBody()方法
   
  EVAL_BODY_AGAIN 对标签体循环处理。

 

 

<span role="heading" aria-level="2">自定义标签(TagSupport )

 

上面转自http://zhuhuide2004.iteye.com/blog/555737

下面是项目中的应用。

在做权限的时候,不同角色用户看到不同的权限,比如:一个页面上的添加按钮,有的角色看的到,有的角色看不到,必须判断角色是否有这个权限。

 1 public class MenuTLD extends TagSupport {
 2 
 3     
 4     private String menuStr;
 5     
 6     @Override
 7     public int doStartTag() throws JspException {
 8         // TODO Auto-generated method stub
 9         HttpSession session = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getSession();
10         List<SysMenuBean> userMenus = (List<SysMenuBean>) session.getAttribute("sysMenuBeans");
11         for (SysMenuBean sysMenuBean : userMenus) {
12             try {
13                 if(sysMenuBean.getUrl()!=null&&sysMenuBean.getUrl().contains(menuStr))
14                 {
15                     
16                     return TagSupport.EVAL_BODY_INCLUDE;
17                 }
18             } catch (Exception e) {
19                 // TODO Auto-generated catch block
20                 return TagSupport.SKIP_BODY;        
21             } 
22         }
23         return TagSupport.SKIP_BODY;        
24     }
25 
26     public String getMenuStr() {
27         return menuStr;
28     }
29 
30     public void setMenuStr(String menuStr) {
31         this.menuStr = menuStr;
32     }
33 
34 }

<span role="heading" aria-level="2">自定义标签(TagSupport )

其内容是:

<?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</tlib-version>
 <jsp-version>1.2</jsp-version>
 <short-name>menu</short-name>
 <uri>http://www.dsdl.com/dev/jsp/menu</uri>
 <description>DSDL menu 1.1 core library</description>
 <tag>    
    <name>menu</name>
    <tag-class>com.dsdl.common.menutld.MenuTLD</tag-class>
    <body-content>JSP</body-content>
    <description>menu</description>
    <attribute>       
        <name>menuStr</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
        <type>type</type>
        <description>MenuId</description>
    </attribute>
  </tag>
</taglib>

在页面中的应用:

<span role="heading" aria-level="2">自定义标签(TagSupport )

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155019.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 随机森林回归算法_随机森林算法的优缺点

    随机森林回归算法_随机森林算法的优缺点随机森林回归算法原理随机森林回归模型由多棵回归树构成,且森林中的每一棵决策树之间没有关联,模型的最终输出由森林中的每一棵决策树共同决定。随机森林的随机性体现在两个方面:1、样本的随机性,从训练集中随机抽取一定数量的样本,作为每颗回归树的根节点样本;2、特征的随机性,在建立每颗回归树时,随机抽取一定数量的候选特征,从中选择最合适的特征作为分裂节点。算法原理如下:(a)从训练样本集S中随机…

    2022年8月21日
    22
  • pycharm2020.3.2激活码_在线激活

    (pycharm2020.3.2激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月29日
    418
  • springEL表达式_第二强度理论表达式

    springEL表达式_第二强度理论表达式本文带你玩转spring中强大的spel表达式!Spel概述Spring表达式语言全称为“SpringExpressionLanguage”,缩写为“SpEL”,类似于Struts2…

    2025年10月26日
    3
  • tfs安装教程_2008安装教程

    tfs安装教程_2008安装教程TFS2010安装配置一、安装过程注意:1、服务器内存要求2、需要SQLSERVER2005以上;3、选择“基础安”。二、TFS配置1、Server端配置。      (1)新建“团队项目集合”      (2)新建用户      注意:TFS的用户主要与windows用户结合2、Client端      注意:TFS与Client端与VS紧密整合,没有VSS那样的单独客户端(1)打开VS,连接到TFS      (2)创建“团队项目(3)将解决方案添加到TFS,右击解决方案,“添加到源代码

    2022年9月23日
    2
  • vue-router 多级路由redirect 重定向的问题

    vue-router 多级路由redirect 重定向的问题在做多级路由的时候遇到很多问题,虽然不难,但是如果没有经验,往往要花一整天时间才能解决(可能我笨),况且网上资料也很少。项目需要是这样的:登录页面跳到后台页面重定向,登录页是一级路由对应页面登录后:同时重定向二级和三级页面,这样登录就会重定向了,此时url但又有一个问题:当再次点击底部“堂食”的时候,url变成这样,并且三级页面没有出来解决办法是:在这个“堂食”按键添加一个方法记住,也只…

    2022年7月11日
    88
  • 零基础如何学习PLC

    零基础如何学习PLC很多人在学习PLC之前都做过推销员、维修工、电工或出租车司机。很多新手转PLC的时候肯定会问这个问题:学习PLC的基础是什么?如何学习PLC编程入门?这个社会基础教育问题问的好,说明你对于学生学习这件事我们还是有常识的,基础发展起到一个铺垫、承前启后的作用,把这方面可以搞定了,你会比那些不在乎这些基础而直接进行强攻PLC的人要事半功倍的多。下面就来说说正事学习plc,首先必须有电工基础,了解一些低压电器及其控制技术,这是学习plc必备的基础知识。.原因:面对新机器,首先要了解硬件结

    2022年10月18日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号