自定义标签总汇

自定义标签总汇自定义标签总汇自定义标签标签语言简介标签开发及使用标签开发实例一 自定义 set amp out 标签 1 定义 set 标签 2 定义 out 标签二 自定义 foreach amp select 标签 1 定义 foreach 标签 2 定义 select 标签自定义标签标签语言简介标签语言特点 开始标签属性 属性值 标签体空标签 amp l 开始标签属性 属性值

自定义标签

生命周期

标签语言特点: 
  <开始标签 属性="属性值">
    标签体 空标签 
   

<开始标签> <开始标签 />

标签具体分为以下几类:

  • ui标签(没有标签体,也能展示内容的标签)
  • 控制标签(可控制标签内容展示的标签)
  • 数据标签(数据标签就是用来存储数据的)

标签开发及使用步骤

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

  • 1、创建一个标签助手类(继承BodyTagSupport) 标签属性必须助手类的属性对应、且要提供对应get/set方法
  • 2、创建标签库描述文件(tld),添加自定义标签的配置
    注意:tld文件必须保存到WEB-INF目录或其子目录

  • 3、在JSP通过taglib指令导入标签库,并通过指定后缀,访问自定义标签

调用doStartTag、doAfterBody、doEndTag三种方法的情况:

  • 1、默认情况,如果jsp里面有标签体,三个方法都执行 顺序:doStartTag、doAfterBody、doEndTag
  • 2、如果没有标签体,doAfterBody方法不会执行 顺序:doStartTag、doEndTag
  • 3、人为改变默认设置 return的值:

    ① 若jsp上有标签体,将doStartTag的返回值改为SKIP_BODY,则doAfterBody不执行,jsp页面主体内容显示

    ② 若改变doAfterBody返回值为EVAL_BODY_AGAIN,则doAfterBody会反复执行

标签的生命周期:

  • 1、实例化标签助手类->doStartTag()——(SKIP_BODY)——->doEndTag() —主要用开发简单标签
  • 2、实例化标签助手类->doStartTag()——(EVAL_BODY_INCLUDE)——->doAfterBody–
    ——(SKIP_BODY/EVAL_BODY_AGAIN)——–>doEndTag()…

jsp自定义标签生命周期图
补充:

 SKIP_BODY: 跳过主体 EVAL_BODY_INCLUDE: 计算标签主体内容并[输出] EVAL_BODY_BUFFERED: 计算标签主体内容并[缓存] EVAL_PAGE: 计算页面的后续部分 SKIP_PAGE: 跳过页面的后续部分 EVAL_BODY_AGAIN: 再计算主体一次 

自定义标签开发实例

一、UI标签

1、定义 out 标签

思路:

在标签属性中的数据,通过JspWriter对象输出

核心代码如下:

out标签助手类:

 private Object value; public int doStartTag() throws JspException { 
      JspWriter out = pageContext.getOut();//输出流 try { 
      out.print(value.toString()); } catch (IOException e) { 
      e.printStackTrace(); } return SKIP_BODY;//跳过主体 } } 

2、定义 select 标签

思路:

自定义select标签加入数据源自动加载数据源,生成select、option标签代码

核心代码如下:

select 标签助手类:

/ * 1、值的传递 id/name * 2、数据源 items * 3、展示列与数据存储列与实体类的对应关系 textKey/textVal; * 4、数据回显 selectedVal * 5、可能设置下拉框默认值(头标签) headerTextKey/headerTextVal * @author 86182 */ private String id;// select的id private String name;// select的name private List<Object> items = new ArrayList<>();// 数据源 private String textKey;// option中的value private String textVal;// option中的text文本 private String selectedVal;// 目前选中值 private String headerTextKey;// 默认的option值 private String headerTextVal;// 默认的option的文本 private String toHTML() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { 
       StringBuffer sb = new StringBuffer(); sb.append("); if(!(headerTextKey == null || "".equals(headerTextVal) || headerTextKey == null || "".equals(headerTextVal))) { 
       sb.append("+headerTextVal+""); } String value;
		String html; for (Object o : items) { 
       Field f = o.getClass().getDeclaredField(textKey); f.setAccessible(true); value = (String) f.get(o);
			html = (String) PropertyUtils.getProperty(o, textVal); if(value.equals(selectedVal)) { 
       sb.append("+html+""); }else { 
       sb.append("+html+""); } } sb.append(""); return sb.toString(); } 

3、定义 checkbox 标签

代码如下:

checkbox标签助手类:

 private String[] items; private String name; StringBuffer sb = new StringBuffer(); for (String it : items){ 
        sb.append("+it+"" name=""+name+"">"+it+" "); } 

二、控制标签

1、定义 if 标签

思路:

得到标签属性值做判断,页面上的标签主体部分视情况输出

核心代码如下:

if标签助手类:

private boolean test; public int doStartTag() throws JspException { 
         return test ? EVAL_BODY_INCLUDE : SKIP_BODY; } 
2、定义 foreach 标签

思路

得到标签属性,将集合遍历,遍历出的对象反复保存到page作用域中输出

核心代码如下:

foreach标签助手类:

 private String var;//保存当前元素到page作用域的一个key(键) private List<Object> items = new ArrayList<>();//数据源 / * 执行完该方法的时候,var所代表的指针一定要向下移一位 * @return * @throws JspException */ public int doStartTag() throws JspException { 
         if(items.size() == 0) { 
         return SKIP_BODY;//跳过主体 }else { 
         Iterator<Object> it = items.iterator(); pageContext.setAttribute(var, it.next()); pageContext.setAttribute("it", it);//移动 return EVAL_BODY_INCLUDE;//计算标签主体内容并[输出] } } public int doAfterBody() throws JspException { 
         Iterator<Object> it = (Iterator<Object>)pageContext.getAttribute("it");//获取迭代器 if(it.hasNext()) { 
         pageContext.setAttribute(var, it.next()); pageContext.setAttribute("it", it);//移动 return EVAL_BODY_AGAIN;//再计算主体一次 } return EVAL_PAGE;//计算页面的后续部分 } } 

三、数据标签

1、定义 set 标签

代码如下:

set标签助手类:

 private String var; private Object value; public int doStartTag() throws JspException { 
          pageContext.setAttribute(var, value); return SKIP_BODY;//跳过主体 } public int doEndTag() throws JspException { 
          return super.doEndTag(); } 

补充:

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

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

(0)
上一篇 2026年3月18日 下午5:58
下一篇 2026年3月18日 下午5:58


相关推荐

  • 拼多多买手机可靠不_官网买手机可靠吗

    拼多多买手机可靠不_官网买手机可靠吗拼多多,经过短短几年的发展,现如今一跃成为国内排名前三的网店,但因为开店门槛较低,所以导致假冒伪劣商品层出不穷,前些年还被人们戏称为山寨品集中营,因此拼多多给人们留下的印象并不好,那么在拼多多买手机靠谱吗?笔者2019年曾在拼多多帮朋友买过一部iPhoneXSMax,过程如下:9月22号晚上,在拼多多某店铺下单(当时正好有百亿补贴活动)9月23号下午,显示手机已经出单,到了晚上的时候就能看到物流信息了,发的是顺丰9月24号中午,快递送达,取回家以后就进行了拆机,查验三码合一,全.

    2025年6月25日
    6
  • 心灵鸡汤【5】

    心灵鸡汤【5】

    2021年8月20日
    58
  • ip addr 和 ifconfig「建议收藏」

    ip addr 和 ifconfig「建议收藏」你知道怎么查看IP地址吗?当面试听到这个问题的时候,面试者常常会觉得走错了房间。我面试的是技术岗位啊,怎么问这么简单的问题?的确,即便没有专业学过计算机的人,只要倒腾过电脑,重装过系统,大多也会知道这个问题的答案:在Windows上是ipconfig,在Linux上是ifconfig。那你知道在Linux上还有什么其他命令可以查看IP地址吗?答案是ipad…

    2022年7月28日
    22
  • Vue组件封装的过程[通俗易懂]

    Vue组件封装的过程[通俗易懂]Vue组件封装的过程vue组件的定义组件(Component)是Vue.js最强大的功能之一 组件可以扩展HTML元素,封装可重用代码在较高层面上,组件是自定义元素,Vue.js的编译器为他添加特殊功能某些情况下,组件也可以表现用`js`特性进行了扩展的原生的HTML元素 所有的Vue组件同时也都是Vue实例,所以可以接受相同的选项对象(除了一些根级特有的选项),并提供相同的生命周期钩子函数vue组件的功能能够把页面抽象成多个相对独立的模块实现代码重用,提高开发效率和代码

    2026年3月2日
    5
  • C语言中的转义字符

    C语言中的转义字符C 语言中的转义字符简介在字符集中 有一类字符具有这样的特性 当从键盘上输入这个字符时 显示器上就可以显示这个字符 即输入什么就显示什么 这类字符称为可显示字符 如 a b c 和空格符等都是可显示字符 另一类字符却没有这种特性 它们或者在键盘上找不到对应的一个键 当然可

    2026年3月19日
    2
  • 秒杀系统设计的 5 个要点:前端三板斧+后端两条路!(建议收藏)

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 秒杀系统涉及到的知识点: 高并发,cache,锁机制 基于缓存架构redis,Memcached的先进先出队列。 稍…

    2021年6月23日
    112

发表回复

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

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