J2EE基础——自定义JSP标签

目录

1、认识JSP标签

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

3、标签生命周期

4、案例实现:z:if标签

5、案例实现:z:set标签   z:out标签


一、认识JSP标签

        (1)形式:

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

        (2)分类:

                                ①空标签        例如:br,hr

                                ②ui标签         例如:input,table

                                ③控制标签        例如:if.foreach (没有标签体但是有输出作用的标签)

                                ④数据标签        例如:out标签


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

        (1)认识.tld文件:

                点击c标签我们可以链接跳转到c.tld文件中,而.tld文件就是c标签库的定义配置文件。

                所以我们要想自定义标签,首先我们需要自定义该标签的定义配置文件.tld

        (2)自定义.tld配置文件方法:

                ①:创建后缀为.tld的文件:

                   ②:修改uri标签:修改为你要加载的uri例如:http://www/zq/com             

        

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

                        在这时候我们导入标签库即可找到uri为:

                        <%@ taglib uri="http://www/zq/com" prefix="z" %>

 这时候如果我们,我们便可以使用自己定义的模仿标签库啦,

例如这是我们使用<z:if test="true">true</z:if>结果如下:

但是距离自定义标签还需要一些操作。

         (4):创建助手类

                        ①必须继承bodytagSupport

                        ②实现三个方法:

                                三个方法分别对应着:开始标签、标签体、结束标签,即执行到对应的部分时调用对应的方法。

package com.zq.tag;

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

public class DemoTag1 extends BodyTagSupport{
	//开始标签
		@Override
		public int doStartTag() throws JspException {
			System.out.println("================doStartTag=============");
			/*return super.doStartTag();*/
			//SKIP_BODY跳过
			//return SKIP_BODY;
			//EVAL_BODY_INCLUDE  相当于调用默认方法
			return EVAL_BODY_INCLUDE;
		}
		
		@Override
		public int doAfterBody() throws JspException {
			System.out.println("================JspException========");
			return super.doAfterBody();
			//会进入死循环
			//return EVAL_BODY_AGAIN;
		}
		
		//结束标签
		@Override
		public int doEndTag() throws JspException {
			System.out.println("============doEndTag===========");
			return super.doEndTag();
			//跳过结束标签以后的表示值
			//return SKIP_PAGE;
		}
}

         (5):修改<tag>标签

                        我们使用的标准标签例如 if、foreach……都和.tdl文件中的<tag>标签有关

<tag>
  	<!-- 代表标签库的名字 -->
    <name>demo2</name>
    <!-- 改标签对应的助手类的全路径名 -->
    <tag-class>com.zq.tag.DemoTag1</tag-class>
  	<!-- 代表一个JSP标签(不能省) -->
    <body-content>JSP</body-content>
    <!-- 该自定义JSP标签的属性名称 -->
    <!-- <attribute> -->
		<!-- 该自定义JSP标签的属性名称 -->
        <!-- <name>var</name> -->
    	<!-- 该属性是否必填 -->
        <!-- <required>false</required> -->
		<!-- 该属性值是否支持表达式 -->
        <!-- <rtexprvalue>false</rtexprvalue> -->
    <!-- </attribute> -->
  </tag>

三、标签生命周期

SKIP_BODY:跳过主体
EVAL_BODY_INCLUDE:计算标签主体内容并(输出)
EVAL_BODY_AGAIN:在计算主体一次
EVAL_PAGE:计算页面的后续部分
SKIP_PAGE:跳过页面后续部分


四、案例实现:z:if标签

案例1:我们使用上面的zq.tdl文件以及Demo2实现Z:if标签

助手类:

package com.zq.tag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
 * if标签:
 * 分析
 	* 如果满足条件,就打印标签体--->doStartTag的返回值:EVAL_BODY_INCLUDE
 	* 如果不满足条件,就不输出标签体--->doStartTag的返回值:SKIP_BODY
 * 需要获取到是否满足条件的结果值,那么该标签就有一个属性,属性值是boolean
 */
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 {
//		如果不满足条件,就不输出标签体->dostarttag的返回值skip_body
//		需要获取到是否满足条件的结果集,那么该标签就有一个属性,属性值是boolean
		return test?EVAL_BODY_INCLUDE:SKIP_BODY;
	}

}

zq.tld文件:

  <tag>
    <name>if</name>
    <tag-class>com.zq.tag.IfTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>test</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute> 
  </tag>

Demo2:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://www/zq/com" prefix="z" %>
<!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>
	<z:if test="true">aaa</z:if>
</body>
</html>

结果:

 

五、案例实现:z:set标签   z:out标签

助手类:
        set:

package com.zq.tag;

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

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 {
//		要存储数据,一键值对的方式存储,分析得来,该标签有2个属性
		pageContext.setAttribute(var, value);
		return super.doStartTag();
	}
}

        out:

package com.zq.tag;

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 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 (IOException e) {
			e.printStackTrace();
		}
		return super.doStartTag();
	}
	

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃头没秃头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值