jsp标签

目录

一,标签的语言特点

二,自定义标签的开发一使用步骤

三,标签生命周期

四,z:if标签

五,z:set标签z:out标签


一,标签的语言特点

(1)形式:<开始标签 属性="属性值">标签体</结束标签>

(2)分类

空标签        例如:br,hr

ui标签         例如:input,table

控制标签        例如:if.foreach

数据标签        例如:out标签

二,自定义标签的开发一使用步骤

(1)步骤:助手类(继承BodyTagSupport)

package com.dengxiyan.tag;

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

/**
 * 助手类 必须继承bodytagSupport
 * @author DXY
 *2022年6月17日下午7:41:37
 */
public class DemoTag1 extends BodyTagSupport {

	@Override
	public int doStartTag() throws JspException {
		System.out.println("=================================doStartTag=======================");
		//跳过
		//return SKIP_BODY;
		//return super.doStartTag();
		return EVAL_BODY_INCLUDE;
	}
	
	@Override
	public int doAfterBody() throws JspException {
	System.out.println("=================================doAfterBody=======================");
		return super.doAfterBody();
		//循环
		//return EVAL_BODY_AGAIN;
	}
	
	@Override
	public int doEndTag() throws JspException {
		System.out.println("=================================doEndTag=======================");
		return super.doEndTag();
		//只读取前面的内容
		//return SKIP_PAGE;
	}
}

 

(2)标签库描述文件(tld)

注意:tld文件必须保存在WEB-INF目录或其子目录

 (3)jsp通过taglib指令导入标签库

 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

 (4)实例:将c:if标签换成z:if

<如图所示> 

 

    1. 自定义标签库是与tld文件相关的,也跟tag元素对应的助手类有关
 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib uri="http://jsp.veryedu.cn" prefix="z" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<z:if test="true">true</z:if>
<z:if test="false">false</z:if>
<z:set value="DXY" var="name"></z:set>
<z:out value="${name}"></z:out>
</body>
</html>

《bug图》

    2.标签库中的标签与tld中的Tag元素有关(当标签库里没有if标签数时)

 

三,标签生命周期

《周期图如下》

 《jsp界面》

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib uri="http://jsp.veryedu.cn" prefix="z" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<z:dome1>xxxx</z:dome1>
	<z:if test="true">true</z:if>
	<z:if test="false">false</z:if>
	<z:set var="name" value="laoliu"></z:set>
	<z:out value="${name }"></z:out>
</body>
</html>

 《助手类》

package com.dengxiyan.tag;

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

/**
 * 助手类 必须继承bodytagSupport
 * @author DXY
 *2022年6月17日下午7:41:37
 */
public class DemoTag1 extends BodyTagSupport {

	@Override
	public int doStartTag() throws JspException {
		System.out.println("=================================doStartTag=======================");
		//跳过
		//return SKIP_BODY;
		//return super.doStartTag();
		return EVAL_BODY_INCLUDE;
	}
	
	@Override
	public int doAfterBody() throws JspException {
	System.out.println("=================================doAfterBody=======================");
		return super.doAfterBody();
		//循环
		//return EVAL_BODY_AGAIN;
	}
	
	@Override
	public int doEndTag() throws JspException {
		System.out.println("=================================doEndTag=======================");
		return super.doEndTag();
		//只读取前面的内容
		//return SKIP_PAGE;
	}
}

<代码分析>

只读取前面部分

@Override
	public int doEndTag() throws JspException {
		System.out.println("=================================doEndTag=======================");
		return super.doEndTag();
		//只读取前面的内容
		//return SKIP_PAGE;
	}

 <效果图>

 

1.有标签体的情况下,默认会调用助手类的dostarttag.doafterbody,doendtag方法

	@Override
	public int doStartTag() throws JspException {
		System.out.println("=================================doStartTag=======================");
	    return super.doStartTag();
	
	}

 

2.如果将dostarttag的返回值改为skip_body,那么doafterbody就不会调用执行(线路一)

通俗点:(将方法的返回值改为跳过,在有标签体的情况下也值调用两个方法)

@Override
	public int doStartTag() throws JspException {
		System.out.println("=================================doStartTag=======================");
		//跳过
		return SKIP_BODY;
	}

《效果图 》

3.如果将dostarttag的返回值改为EVAL_BODY_INCLUDE,那么doafterbody就会调用执行(线路2)

	@Override
	public int doStartTag() throws JspException {
		System.out.println("=================================doStartTag=======================");
		return EVAL_BODY_INCLUDE;
	}
	

 《效果图》

 4.如果将doafterbody的返回值改为EVAL_BODY_again,那么一致调用doafterbody,进入循环(路线3)

<代码演示>

@Override
	public int doAfterBody() throws JspException {
	System.out.println("=================================doAfterBody=======================");
		return super.doAfterBody();
		//循环
		//return EVAL_BODY_AGAIN;
	}

 

<效果图>

四,z:if标签

jsp界面同上

<代码演示>

package com.dengxiyan.tag;
/**
 * if标签
 * 如果满足条件,就打印标签体---》dostatag的返回值eval_body_include
 * 如果不满足条件,就不输出标签体---》dostarttag的返回值skip_body
 * 需要获取到是否满足条件的结过值,那么该标签的属性值boolean
 * 
 * @author DXY
 *2022年6月17日下午8:53:07
 */

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

public class ifTag extends BodyTagSupport {

	private boolean test;
	
	public boolean isTest() {
		return test;
	}

	public void setTest(boolean test) {
		this.test = test;
	}

	
	
	@Override
	public int doStartTag() throws JspException {
		 // 如果满足条件,就打印标签体---》dostatag的返回值eval_body_include
		return test ? EVAL_BODY_INCLUDE : SKIP_BODY;
	}
	
}

 <效果图>

 

五,z:set标签z:out标签

jsp界面同上

《代码演示》

z:set标签助手类

package com.dengxiyan.tag;

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

/**
 * 数据标签:存储数据
 * 
 * 要存储数据要以键值对的方式进行存储:得该标签有两个属性
 * @author DXY
 *2022年6月17日下午9:10:31
 */
public class SetTag extends BodyTagSupport {

	private String var;
	private Object value;
	
	
	public String getVar() {
		return var;
	}


	public void setVar(String var) {
		this.var = var;
	}


	public Object getValue() {
		return value;
	}


	public void setValue(Object value) {
		this.value = value;
	}


	@Override
	public int doStartTag() throws JspException {
		//要存储数据要以键值对的方式进行存储:得该标签有两个属性
		pageContext.setAttribute(var, value);
		return super.doStartTag();
	}
	
	
}

z:out标签助手类

1.servlet中后台代码前台输出内容  :out.print
2. 将数据输送到前台:首先拿到输出流

package com.dengxiyan.tag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
 * servlet中后台代码前台输出内容  :out.print
 * 将数据输送到前台:首先拿到输出流
 * @author DXY
 *2022年6月17日下午9:16:09
 */
public class Outtag extends BodyTagSupport {

	private Object value;

	public Object getValue() {
		return value;
	}

	public void setValue(Object value) {
		this.value = value;
	}
	
	@Override
		public int doStartTag() throws JspException {
		JspWriter out = pageContext.getOut();
		try {
			out.print(value);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return super.doStartTag();
		}
}

《效果图》

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值