自定义标签探究(一)

自定义标签探究(一)

  • 标签调用过程
    • tld文件
    • jsp页面调用
      • 引用块
      • 使用标签
      • 定义标签解释
      • 过程
    • 助手类
      • 自定义标签生命周期图
      • 内容
      • 加上上面jsp页面调用的运行结果
  • 自定义r标签
    • set标签
      • tld定义
      • 助手类
    • out标签
      • tld定义
      • 助手类
    • if标签
      • tld定义
      • 助手类
    • 三个标签的jsp代码
    • 三个标签的jsp页面
  • 总结

标签调用过程

tld文件

自定义标签探究(一)_第1张图片

jsp页面调用

引用块

jsp顶部引用
在这里插入图片描述

使用标签

在这里插入图片描述

定义标签解释

<tag>
	<name>set</name>——jsp页面使用的标签名    c:set
    <tag-class>com.rong.tag.SetTag()</tag-class>
    <body-content>JSP</body-content>
    <attribute>——定义标签的属性
        <description>标签描述</description>
        <name>value</name>——属性名
        <required>false</required>——是否必填
        <rtexprvalue>true</rtexprvalue>——是否支持表达式(el表达式,ognl表达式)
	<type>boolean</type>
    </attribute>
    </tag>

过程

1.引用块的prefix是写你在该页面使用时用的标签总名(这里我用的是r)
2.通过引用块的uri找到要调用的标签的tld文件(看上面的tld文件),
3.在tld文件里会找到你使用的标签名助手类:
com.rong.tag.DemoTag
4.之后就运行助手类中的内容了

助手类

自定义标签生命周期图

自定义标签探究(一)_第2张图片

内容

package com.rong.tag;

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

public class DemoTag extends BodyTagSupport{

	@Override
	public int doStartTag() throws JspException {
		System.out.println("doStartTag--------------");
//		return SKIP_BODY;//跳过标签体
		return EVAL_BODY_INCLUDE;//不跳过标签体
	}
	
	@Override
	public int doAfterBody() throws JspException {
		System.out.println("doAfterBody--------------");
//		return EVAL_PAGE;//返回该值退出循环
		return EVAL_BODY_AGAIN;//返回该值继续循环
	}
	
	@Override
	public int doEndTag() throws JspException {
		System.out.println("doEndTag--------------");
		return super.doEndTag();
	}
	
}

加上上面jsp页面调用的运行结果

这个不退出循环有点炸

自定义r标签

set标签

tld定义

<tag>
    <name>set</name>
    <tag-class>com.rong.tag.SetTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>var</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
        <name>value</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
  	</tag>

助手类

package com.rong.tag;

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

public class SetTag extends BodyTagSupport{

	private static final long serialVersionUID = 538697625512657267L;
	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 SKIP_BODY;
	}
	
}

out标签

tld定义

<tag>
    <name>out</name>
    <tag-class>com.rong.tag.OutTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>value</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
  	</tag>

助手类

package com.rong.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 static final long serialVersionUID = 3420962230160108108L;
	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 SKIP_BODY;
	}
	
}

if标签

tld定义

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

助手类

package com.rong.tag;

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

public class IfTag extends BodyTagSupport{

	private static final long serialVersionUID = 6848194088322690923L;
	private boolean test;

	public boolean isTest() {
		return test;
	}
	public void setTest(boolean test) {
		this.test = test;
	}
	
	@Override
	public int doStartTag() throws JspException {
		return test?EVAL_BODY_INCLUDE:SKIP_BODY;
	}
}

三个标签的jsp代码

自定义标签探究(一)_第3张图片

三个标签的jsp页面

自定义标签探究(一)_第4张图片

总结

博主有点炸,看完这个你别炸!

你可能感兴趣的:(自定义标签探究(一))