JSP自定义标签的(生命周期与开发if,foreach,out)

2023-10-29

自定义标签定义:是用户定义的JSP语言元素。扩展名为tld的文件(tag标签的配置文件),通常放在WEB-INF下面。

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

思路

1.1 创建一个标签助手类(继承BodyTagSupport)
标签属性必须助手类的属性对应、且要提供对应get/set方法 rtexprvalue
1.2 创建标签库描述文件(tld),添加自定义标签的配置
注:tld文件必须保存到WEB-INF目录或其子目录
1.3 在JSP通过taglib指令导入标签库,并通过指定后缀
访问自定义标签

标签生命周期

生命周期图如下(首先先了解别人写的c标签库)
在这里插入图片描述
1.准备自定义标签库助手DemoTag.Java

package com.wxm.jsp.tag; import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.BodyTagSupport; 
public class DemoTag extends BodyTagSupport { 	
/**	 * 序列号的作用:方便对象序列化	 * 序列化:对象按照特定的规则持久的存储到硬盘中	 */	
private static final long serialVersionUID = -8850550555242137344L;	
private String test;		   
 public String getTest() {		
 return test;	
 }	
 public void setTest(String test) {		t
 his.test = test;	
 }
 @Override
 public int doStartTag() throws JspException {	
 System.out.println(test);	
 System.out.println("doStartTag----------");
 	return super.doStartTag();
 	}
 	@Override
 	public int doAfterBody() throws JspException {	
 	System.out.println("doAfterBody----------");	
 	return super.doAfterBody();
 	}
 	@Override
 	public int doEndTag() throws JspException {	
 	System.out.println("doEndTag----------");	
 	return super.doStartTag();
 	}
 	 }

2.创建标签库描述文件(tld),添加自定义标签的配置
.准备在web-inf下新建file文件(后缀名为tld)我这里是wxm.tld
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?> 
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"    version="2.0">     
 <description>wxm 1.1 core library</description>  
 <display-name>wxm core</display-name>  
 <tlib-version>1.1</tlib-version><!-- 标签库的版本号 --> 
  <short-name>c</short-name><!-- 标签库的简称 -->  
  <uri>/wxm</uri><!--你标签库引用的uri  -->
</taglib>

3.Demo1.jsp来调用显示

注意:在JSP通过taglib指令导入标签库,并通过指定后缀     

访问自定义标签
在这里插入图片描述

 <wxm:demo test="xxx"></wxm:demo> 

运行到服务器的效果是

在这里插入图片描述
可以看出生命周期走势为
在这里插入图片描述
当定义了标签体,代码

<wxm:demo test="xxx">标签体内容</wxm:demo>

效果为
在这里插入图片描述可见 ,生命周期走势为
在这里插入图片描述

还是之前的DemoTag.Java把对应的代码改为

@Overridepublic int doAfterBody() throws JspException {	
System.out.println("doAfterBody----------");	
return EVAL_BODY_AGAIN;
}
@Override
public int doEndTag() throws JspException {	
System.out.println("doEndTag----------");	
return super.doEndTag();
}

在这里插入图片描述
在这里插入图片描述
这演示了生命周期的第三条路 就是循环 最常见的标签就是foreach
在这里插入图片描述
敲重点来了!!!
SKIP_BODY:跳过主体
EVAL_BODY_INCLUDE:计算标签主体内容并[输出] EVAL_BODY_BUFFERED:计算标签主体内容并[缓存]
EVAL_PAGE:计算页面的后续部分
SKIP_PAGE:跳过页面的后续部分
EVAL_BODY_AGAIN:再计算主体一次

练习:开发出c:out/c:foreach/c:if/

我这里通过别人写好的c标签库和自己写的标签分别对比

在这里插入图片描述

  1. 上面已经建好的WEB-INF下的wxm.tld2. 新建DemoTagOut.jsp
  2. 新建DemoTagOut.jsp
package com.wxm.jsp.tag; 
import java.io.IOException;
 import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.tagext.BodyTagSupport;
 /** * 自定义out标签处理类 BodyTagSupport(TagSupport) 
 * @author 2019071003 * */
 public class DemoTagOut extends BodyTagSupport {	
 /**	 * 序列号的作用:方便对象序列化	 * 序列化:对象按照特定的规则持久的存储到硬盘中	 */	
 private static final long serialVersionUID = 221407492247778768L;		
 private String value;	
 public String getValue() {		
 return value;	
 }	
 public void setValue(String value) {		
 this.value = value;	
 }		
 @Override	public int doStartTag() throws JspException {		//输出value值		try {			
 pageContext.getOut().println(value);		
 } catch (IOException e) {			
 // TODO Auto-generated catch block			
 e.printStackTrace();		
 }		
 // EVAL_BODY_INCLUDE显示文本内容       
  // SKIP_BODY不显示标签中(文本)的内容		
  return EVAL_BODY_INCLUDE;	
  } 	
  @Override	
  public int doEndTag() throws JspException {		
  // EVAL_PAGE继续显示标签下面的内容       
  // SKIP_PAGE 显示完该标签内容后,不再显示后面的标签内容,直接跳转到</html>		return EVAL_PAGE;	
  } 
  }
  1. 新建DemoTagIf.jsp
package com.wxm.jsp.tag; 
import java.io.IOException; 
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/** * 自定义if标签处理类 BodyTagSupport(TagSupport) * @author 2019071003 * */
public class DemoTagIf extends BodyTagSupport {	
/**	 * 序列号的作用:方便对象序列化	 * 序列化:对象按照特定的规则持久的存储到硬盘中	 */	
private static final long serialVersionUID = -4319841194548962012L;	
private Boolean test;	
public Boolean getTest() {		
return test;
	}	
	public void setTest(Boolean test) {		
	this.test = test;	
	}	
	@Override	public int doStartTag() throws JspException {		
	//如果为true则显示文本中的内容,否则不显示		
	if(test) {			
	return EVAL_BODY_INCLUDE;		
	}else {			
	return SKIP_BODY;		
	}	
	}	
	@Override	
	public int doEndTag() throws JspException {		
	//继续显示标签下的内容		
	return EVAL_PAGE;	
	}	
	 } 
  1. 新建DemoTagForeach.jsp
 package com.wxm.jsp.tag;
  import java.io.IOException;
  import java.util.ArrayList;
  import java.util.Iterator;
  import java.util.List;
   import javax.servlet.jsp.JspException;
   import javax.servlet.jsp.tagext.BodyTagSupport;
   /** * 自定义foreach标签处理类 BodyTagSupport(TagSupport)
    * @author 2019071003 * */
    * public class DemoTagForeach extends BodyTagSupport {	/**	 * 序列号的作用:方便对象序列化	 * 序列化:对象按照特定的规则持久的存储到硬盘中	 */	
    * private static final long serialVersionUID = 221407492247778768L;	/** * items属性 */
    private  List<Object> items=new ArrayList<>(); 
    /** * var属性 */
     private String var; public List<Object> getItems() {	
    return items;
 }
  public void setItems(List<Object> items) {	
  this.items = items;
  }
   public String getVar() {	
   return var;
   }
    public void setVar(String var) {	
    this.var = var;
    }
    @Override
    public int doStartTag() throws JspException {	
    //如果集合没有值则跳过,否则进行输出    
    if(items==null||items.size()==0) {	  
    return SKIP_BODY;	
    }else {		
    //得到集合信息		
    Iterator<Object> it=items.iterator();		
    //放入到请求域中		
    pageContext.setAttribute("it", it);		
    Object v=it.next();		
    pageContext.setAttribute(var, v);		
    //显示文本内容		
    return EVAL_BODY_INCLUDE;	
    }	
    }	
    @Override	
    public int doAfterBody() throws JspException {		
    // 得到请求域中的值		
    Iterator<Object> it=(Iterator<Object>) 
    pageContext.getAttribute("it");		
    if(it.hasNext()) {			
    Object v=it.next();			
    pageContext.setAttribute(var, v);			
    //循环			
    return EVAL_BODY_AGAIN;		
    }else {		
    //否则 跳过,不输出		
    return SKIP_BODY;		
    }
    	} @
    	Override
    	public int doEndTag() throws JspException {	
    	//继续读取标签的值	
    	return EVAL_PAGE;
    	}
    	}
  1. 最后用上之前建的显示类Demo1.jsp
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=utf-8"    pageEncoding="utf-8"%>
<%@taglib uri="/wxm" prefix="wxm"%>    
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!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>
<%--  <c:set value="zs" var="name">
</c:set><c:out value="${name}">
</c:out><c:if test="true">ls</c:if><
c:if test="false">ww</c:if> --%> 
 </head>
 <!--1.demoTag  -->
 <%--  <wxm:demo test="xxx">标签体内容</wxm:demo> --%>
 <body>
  <!-- 自定义out的使用 --> 
  <ul><wxm:out value="这是自定义out">
  </wxm:out><c:out value="c里面的标签out">
  </c:out>
  </ul> 
   <!-- 自定义标签if的使用 -->
   <ul><wxm:if test="true">--wxm:true--</wxm:if>
   <wxm:if test="false">wxm:false</wxm:if>
   <c:if test="true">ls</c:if>
   <c:if test="false">ww</c:if>
   </ul> 
   <!-- 自定义标签Foreach的使用 -->
   <%  List<Object> list=new ArrayList<>();
     for(int i=1;i<11;i++){	 
      list.add("wxm"+i);
       }
         request.setAttribute("list", list);
         %>
         <ul>   
         <wxm:foreach items="${list}" var="i">     
          <li>${i}</li>   
          </wxm:foreach>
          </ul>
          </body>
          </html>

最后效果,到现在已经完成啦
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSP自定义标签的(生命周期与开发if,foreach,out) 的相关文章

随机推荐

  • kubeadm init三个master节点遇到的问题

    要创建三个master节点 就不能使用其中一台主机的IP 所以申请了一个VIP地址 kubeadm init apiserver advertise address 0 0 0 0 image repository k8s gcr io c
  • qmake 乱乱乱谈(四)

    继续qmake 本文主题 低调的 TEMPLATE subdirs 非常非常常用的一个东西 可是manual中却介绍的很少 太低调了 在编写包含多可执行文件 库 插件 的程序时 一直不敢相信subdirs的能力 以至于曾一度想转到cmake
  • python三级考什么_什么是计算机三级考试?计算机三级考什么?

    什么是计算机三级考试 计算机三级考什么 2020 04 1118 04 03 来源 上学吧 作者 dengyangjie 全国计算机等级考试 National Computer Rank Examination 简称NCRE 是经原国家教育
  • HTTP POST GET 本质区别详解

    一 原理区别 一般在浏览器中输入网址访问资源都是通过GET方式 在FORM提交中 可以通过Method指定提交方式为GET或者POST 默认为GET提交 Http定义了与服务器交互的不同方法 最基本的方法有4种 分别是GET POST PU
  • 硬件工程师修炼的几层境界

    分享一篇文章 觉得写的很好 mark一下 第零层 1 对基础技术有认知 2 模电 数电 电路分析 信号与系统 物理学之电磁学基础 3 基本掌握焊接 电路设计软件 示波器使用 万用表等基础仪器仪表的使用 第一层 1 精力主要花在学习原理图工具
  • Windows 7 下 vs2010内存泄漏检测工具VLD的使用

    1 环境和软件 Windows7 32位系统 Visual Studio 2012 旗舰版 vld 2 2 3 setup exe 大小1 04M 2 步骤 1 下载安装 下载好 vld 2 2 3 setup exe 大小1 04M 并安
  • CentOS 7.9 使用rpm包安装MySQL-5.7.43

    参考 refman 5 7 pdf 2 5 5 Installing MySQL on Linux Using RPM Packages from Oracle 前期准备 1 防火墙端口检查与设置 检查防火墙状态 systemctl sta
  • 买服务器做网站 镜像选什么,云服务器做网站镜像类型选啥

    云服务器做网站镜像类型选啥 内容精选 换一换 创建一台或多台云服务器 V1 1版本创建云服务器的接口兼容了V1版本创建云服务器 按需 的功能 同时合入新功能 支持创建包年 包月的弹性云服务器 本接口为异步接口 当前创建云服务器请求下发成功后
  • 【Golang

    环境准备 GoLang go1 15 7 windows amd64 Docker 1 13 1 MySQL 8 0 28 一 利用容器部署mysql 1 首先通过docker pull mysql拉取mysql镜像 root k8s ma
  • Jetty篇一之初识Jetty

    前言 最近公司项目中用到了Jetty来作为项目的web容器 借此机会来分享一下我的学习心得 在学习Jetty之前 一定要了解一些Jetty的基本概念以及优缺点 这样才方便做更深入的学习 现在让我来慢慢揭开它的神秘面纱吧 基础 什么是Jett
  • 大数据模型案例库-涵盖多行业,超百个实战项目案例

    平台目前积累了大量的人工智能应用模型 不仅包括多年来人工智能企业服务方面的沉淀 还包括大量其他企业的真实项目应用模型 以及高校智能工作室成果模型 覆盖教育 医疗 交通 金融 科技 农业等18个行业 平台面向高校 企业 个人等广大用户群体 所
  • Candence原理图误删图页并保存退出后的恢复方法

    一早打开Candence准备工作 发现原理图少了几页 心里很慌 昨晚在画PCB的时候设置按了几次Delete键 没有反应 可能删了原理图 关闭的时候也没有看 直接保存退出了 看了之前拷贝备份的文件 时间有点久 那只能靠软件的自动备份功能了
  • C语言进阶(九)—— 函数指针和回调函数、预处理、动态库和静态库的使用、递归函数

    1 函数指针 1 1 函数类型 通过什么来区分两个不同的函数 一个函数在编译时被分配一个入口地址 这个地址就称为函数的指针 函数名代表函数的入口地址 函数三要素 名称 参数 返回值 C语言中的函数有自己特定的类型 c语言中通过typedef
  • 学习笔记-选择排序

    选择排序 将一个一维数组从小到大排序 思路 选择排序的思路是 首先认为数组的第一个数是最小的 保留它然后遍历它后面的数 跟它作比较 选择出最小的数和位置 遍历结束后 让这个最小的数和数组的第一位数交换 这样确定了第一个最小的数 之后重复这个
  • Unity AR阴影投射透明地面 仅渲染模型实时阴影 Shader实现

    亲测可用 上面就是实现的效果 仅仅渲染阴影 地面透明 也可以换成AR中的虚拟物体 AR中为的虚拟物体添加阴影 只用unity的光照投影是没办法实现的 或者需求是 角色需要投射阴影在墙上 但是墙不能显示 只渲染出阴影 相当于接受阴影的地面墙体
  • 吊打 CLIP 平均10个点,Meta 多模态通用模型 FLAVA真香啊

    厉害了 作者将单一模型运用于三个不同领域的不同任务 结构简单且训练直观 还能有着出色的表现 自Transformer横空出世 从NLP到CV 再到今天的多模态 无数基于Transformer的模型被应用于各类任务 似乎真的印证了当年文章的标
  • ldd not a dynamic executable

    在开发环境编译运行很ok的程序 到了客户的生产环境一直有问题 编译找不到库 类似这个样子 usr bin ld skipping incompatible lib libasound so when searching for lasoun
  • EXCEL-VBA:Workbooks.Open 参数 (打开文件)

    打开一个工作簿 语法 表达式 Open FileName UpdateLinks ReadOnly Format Password WriteResPassword IgnoreReadOnlyRecommended Origin Deli
  • UE5导入倾斜摄影

    前言 虚幻引擎是全球最先进的实时3D创作工具 可制作照片级逼真的视觉效果和沉浸式体验 2022年4月5号虚幻引擎发布了颠覆性的UE5 倾斜摄影是城市实景的基础 通过无人机采集实际照片再进行三维重建 常见的数据格式为osgb 本文主要介绍UE
  • JSP自定义标签的(生命周期与开发if,foreach,out)

    自定义标签定义 是用户定义的JSP语言元素 扩展名为tld的文件 tag标签的配置文件 通常放在WEB INF下面 自定义标签的开发及使用步骤 思路 1 1 创建一个标签助手类 继承BodyTagSupport 标签属性必须助手类的属性对应