自定义标签1

自定义标签

    • 1.标签语言特点
    • 2.两个jar包
    • 3.自定义标签的开发及使用步骤
    • 4.标签生命周期
    • 5.自定义out输出标签、if条件标签、forEach循环标签

1.标签语言特点

<开始标签  属性=“实现值”>标签体
空标签

<开始标签>

2.两个jar包

使用两个包	第一个(jstl-1.2.jar)
			第二个(standard-1.1.2.jar)

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

  • 2.1 创建一个标签助手类(继承BodyTagSupport
    标签属性必须与助手类的属性对应,且要提供对应的get/set方法
    rtexprvalue
import javax.servlet.jsp.tagext.BodyTagSupport;

public class TestTag extends BodyTagSupport{
	
	
	//private int count=0;
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
  • 2.2 创建标签库描述文件(tld),添加自定义标签的配置
  • tld文件必须保存到WEB-INF目录或其子目录jstl标签库
//tld文件




	
	1.0
	
	1.2
	
	b
	
	/zking

	
		
		test
		
		
		com.zking.jspTag.test.TestTag
		
		jsp
		
		
			
			name
			
			true
			
			true
		
	
	
  • 2.3 在JSP通过taglib指令导入标签库,并通过指定后缀访问自定义标签
<%@ taglib prefix="b" uri="/zking" %>    

4.标签生命周期

先看图理解

自定义标签1_第1张图片
流程A:

  • 3.1 实例化标签助手类->doStartTag() 开始返回的是(SKIP_BODY)------------->doEndTag()
    //主要用开发简单标签
/**
	 * 在<开始标签>的位置所执行的动作
	 * 例如:
	 * 返回值:
	 * 1.SKIP_BODY:跳出主体内容,并不输出标签体的内容
	 * 2.EVAL_BODY_INCLULDE:计算主体内容并输出
	 * 
	 */
	public int doStartTag() throws JspException {
		System.out.println("在开始标签执行的动作:doStartTag");
		pageContext.setAttribute("count", "0");
		return EVAL_BODY_INCLUDE;
	}

/**
	 * 在<结束标签>的位置所执行的动作
	 * 例如:
	 * 1.EVAL_PAGE:计算页面的后续内容
	 * 2.SKIP_PAGE:跳过页面的后续内容
	 */
	public int doEndTag() throws JspException {
		System.out.println("在结束标签执行的动作:doEndTag");
		return EVAL_PAGE;
	}

流程B:

  • 实例化标签助手类->doStartTag()开始返回(EVAL_BODY_INCLUDE )------------->doAfterBody(如果有值返回 EVAL_BODY_AGAIN)否则返回( SKIP_BODY)---------------->doEndTag()…

	/**
	 * 在<结束标签>的位置所执行的动作
	 * 例如:
	 * 1.EVAL_PAGE:计算页面的后续内容
	 * 2.SKIP_PAGE:跳过页面的后续内容
	 */
	public int doEndTag() throws JspException {
		System.out.println("在结束标签执行的动作:doEndTag");
		return EVAL_PAGE;
	}

	/**
	 * 在<开始标签>的位置所执行的动作
	 * 例如:
	 * 返回值:
	 * 1.SKIP_BODY:跳出主体内容,并不输出标签体的内容
	 * 2.EVAL_BODY_INCLULDE:计算主体内容并输出
	 * 
	 */
	public int doStartTag() throws JspException {
		System.out.println("在开始标签执行的动作:doStartTag");
		pageContext.setAttribute("count", "0");
		return EVAL_BODY_INCLUDE;
	}

/**
	 * 介于123与之间的所执行的动作
	 * 返回值:
	 * 1.SKIP_BODY:跳出主体内容并不输出标签体内容
	 * 2.EVAL_BODY_AGAIN:再次计算主体内容并包含在输出中
	 */
	public int doAfterBody() throws JspException {
		System.out.println("在<开始标签>标签体与<结束标签>之间的位置所执行的动作:doAfterTag");
		
		System.out.println("name="+name);
		
		int count = Integer.parseInt(pageContext.getAttribute("count").toString());
		if(count<3) {
			count++;
			pageContext.setAttribute("count", count);
			return EVAL_BODY_AGAIN;
		}
		return SKIP_BODY;
	}
	

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

5.自定义out输出标签、if条件标签、forEach循环标签

package com.zking.jspTag.test;

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 doEndTag() throws JspException {
		return EVAL_PAGE;
	}

	@Override
	public int doStartTag() throws JspException {
		JspWriter out = pageContext.getOut();
		
		try {
			out.write(value.toString());
		} catch (Exception e) {
			e.printStackTrace();
		}
		return EVAL_BODY_INCLUDE;
	}
}

package com.zking.jspTag.test;

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

public class IfTag extends BodyTagSupport{
		private Boolean test;

		public Boolean getTest() {
			return test;
		}

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

		@Override
		public int doEndTag() throws JspException {
			return EVAL_PAGE;
		}

		@Override
		public int doStartTag() throws JspException {
			if(test) 
				return EVAL_BODY_INCLUDE;
			else
				return SKIP_PAGE;
		}

}
package com.zking.jspTag.test;

import java.util.Iterator;
import java.util.List;

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

public class ForeachTag extends BodyTagSupport{
	//数据源
	private List items;
	//将数据保存到Page作用域并以var来命名
	private String var;
	
	public List getItems() {
		return items;
	}
	public void setItems(List items) {
		this.items = items;
	}
	public String getVar() {
		return var;
	}
	public void setVar(String var) {
		this.var = var;
	}
	@Override
	public int doAfterBody() throws JspException {
		//从page作用域中取出
		Iterator it= (Iterator) pageContext.getAttribute("it");
		if(it.hasNext()) {
			//获取第一个元素
			Object value = it.next();
			//将第一个元素保存到Page作用域中并以var来命名
			pageContext.setAttribute(var, value);
			//将迭代器保存到Page作用域中
			pageContext.setAttribute("it", it);
			return EVAL_BODY_AGAIN;
		}
		return SKIP_PAGE;
	}
	@Override
	public int doEndTag() throws JspException {
		return EVAL_PAGE;
	}
	@Override
	public int doStartTag() throws JspException {
		if(null==items||0==items.size()) {
			return SKIP_PAGE;
		}else {
			//遍历方式:迭代器
			Iterator it = items.iterator();
			//获取集合中的第一个元素
			Object value = it.next();
			//将第一个集合保存到Page作用域中并以var来命名
			pageContext.setAttribute(var, value);
			//将迭代器保存到Page中
			pageContext.setAttribute("it", it);
			return EVAL_BODY_INCLUDE;
		}
			
	}

}

 
  

out/if/forEach标签的tld文件




	
	1.0
	
	1.2
	
	b
	
	/zking

	
		
		test
		
		
		com.zking.jspTag.test.TestTag
		
		jsp
		
		
			
			name
			
			true
			
			true
		
	
	
	
	
		
		out
		
		
		com.zking.jspTag.test.OutTag
		
		empty
		
		
			
			value
			
			true
			
			true
		
	
	
	
	
		
		if
		
		
		com.zking.jspTag.test.IfTag
		
		jsp
		
		
			
			test
			
			true
			
			true
		
	
	
	
	
		
		foreach
		
		
		com.zking.jspTag.test.ForeachTag
		
		jsp
		
		
			
			items
			
			true
			
			true
		
		
			
			var
			
			true
			
			false
		
	
	

jsp页面

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="b" uri="/zking" %>    
<%@ page import="java.util.*" %>




Insert title here


<%
	String [] name ={"zs","ls","ww"};
	request.setAttribute("name", name);
%>


	${name}


 

1.自定义标签

123 asdf

2.out标签

<% request.setAttribute("cla", "T222"); %>

3.if标签

哈罗

4.foreach标签

<% List list = new ArrayList(); list.add("图图"); list.add("hore"); list.add("man"); request.setAttribute("list", list); %> ${l}

你可能感兴趣的:(自定义标签1)