自定义标签总汇

自定义标签

生命周期

标签语言特点:

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

标签具体分为以下几类:

  • ui标签(没有标签体,也能展示内容的标签)
  • 控制标签(可控制标签内容展示的标签)
  • 数据标签(数据标签就是用来存储数据的)

标签开发及使用步骤

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

  • 1、创建一个标签助手类(继承BodyTagSupport) 标签属性必须助手类的属性对应、且要提供对应get/set方法

  • 2、创建标签库描述文件(tld),添加自定义标签的配置
    注意:tld文件必须保存到WEB-INF目录或其子目录

  • 3、在JSP通过taglib指令导入标签库,并通过指定后缀,访问自定义标签

调用doStartTag、doAfterBody、doEndTag三种方法的情况:

  • 1、默认情况,如果jsp里面有标签体,三个方法都执行 顺序:doStartTag、doAfterBody、doEndTag

  • 2、如果没有标签体,doAfterBody方法不会执行 顺序:doStartTag、doEndTag

  • 3、人为改变默认设置 return的值:

    ① 若jsp上有标签体,将doStartTag的返回值改为SKIP_BODY,则doAfterBody不执行,jsp页面主体内容显示

    ② 若改变doAfterBody返回值为EVAL_BODY_AGAIN,则doAfterBody会反复执行

标签的生命周期:

  • 1、实例化标签助手类->doStartTag()------(SKIP_BODY)------->doEndTag() —主要用开发简单标签

  • 2、实例化标签助手类->doStartTag()------(EVAL_BODY_INCLUDE)------->doAfterBody–
    ------(SKIP_BODY/EVAL_BODY_AGAIN)-------->doEndTag()…

jsp自定义标签生命周期图
补充:

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

自定义标签开发实例

一、UI标签

1、定义 out 标签

思路:

在标签属性中的数据,通过JspWriter对象输出

核心代码如下:

out标签助手类:

	private Object value;

	public int doStartTag() throws JspException {
		JspWriter out = pageContext.getOut();//输出流
		try {
			out.print(value.toString());
		} catch (IOException e) {
			e.printStackTrace();
		}
		return SKIP_BODY;//跳过主体
	}
}

2、定义 select 标签

思路:

自定义select标签加入数据源自动加载数据源,生成select、option标签代码

核心代码如下:

select 标签助手类:

/**
 * 1、值的传递 id/name
 * 2、数据源 items
 * 3、展示列与数据存储列与实体类的对应关系 textKey/textVal;
 * 4、数据回显 selectedVal
 * 5、可能设置下拉框默认值(头标签) headerTextKey/headerTextVal
 * @author 86182
 */

	private String id;// select的id
	private String name;// select的name
	private List<Object> items = new ArrayList<>();// 数据源
	private String textKey;// option中的value
	private String textVal;// option中的text文本
	private String selectedVal;// 目前选中值
	private String headerTextKey;// 默认的option值
	private String headerTextVal;// 默认的option的文本
	
	private String toHTML() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		StringBuffer sb = new StringBuffer();
		sb.append("<select id='' name=''>");
		if(!(headerTextKey == null || "".equals(headerTextVal) || headerTextKey == null || "".equals(headerTextVal))) {
			sb.append("<option selected value='"+headerTextKey+"'>"+headerTextVal+"</option>");
		}
		
		String value;
		String html;
		
		for (Object o : items) {
			Field f = o.getClass().getDeclaredField(textKey);
			f.setAccessible(true);
			value = (String) f.get(o);
			html = (String) PropertyUtils.getProperty(o, textVal);
			if(value.equals(selectedVal)) {
				sb.append("<option selected value='"+value+"'>"+html+"</option>");
			}else {
				sb.append("<option value='"+value+"'>"+html+"</option>");
			}
		}
		
		sb.append("</select>");
		return sb.toString();
	}

3、定义 checkbox 标签

代码如下:

checkbox标签助手类:

    private String[] items;
	private String name;
	
	StringBuffer sb = new StringBuffer();
	for (String it : items){
		sb.append("<input type='checkbox' value='"+it+"' name='"+name+"' >"+it+"&nbsp;");
	}


二、控制标签

1、定义 if 标签

思路:

得到标签属性值做判断,页面上的标签主体部分视情况输出

核心代码如下:

if标签助手类:

private boolean test;

public int doStartTag() throws JspException {

return test ? EVAL_BODY_INCLUDE :  SKIP_BODY;

}
2、定义 foreach 标签

思路

得到标签属性,将集合遍历,遍历出的对象反复保存到page作用域中输出

核心代码如下:

foreach标签助手类:

	private String var;//保存当前元素到page作用域的一个key(键)
	private List<Object> items = new ArrayList<>();//数据源
	
	/**
	 * 执行完该方法的时候,var所代表的指针一定要向下移一位
	 * @return
	 * @throws JspException
	 */
	public int doStartTag() throws JspException {
		if(items.size() == 0) {
			return SKIP_BODY;//跳过主体
		}else {
			Iterator<Object> it = items.iterator();
			pageContext.setAttribute(var, it.next());
			pageContext.setAttribute("it", it);//移动
			return EVAL_BODY_INCLUDE;//计算标签主体内容并[输出]
		}
	}
	
	public int doAfterBody() throws JspException {
		Iterator<Object> it = (Iterator<Object>)pageContext.getAttribute("it");//获取迭代器
		if(it.hasNext()) {
			pageContext.setAttribute(var, it.next());
			pageContext.setAttribute("it", it);//移动
			return EVAL_BODY_AGAIN;//再计算主体一次
		}
		return EVAL_PAGE;//计算页面的后续部分
	}

}


三、数据标签

1、定义 set 标签

代码如下:

set标签助手类:

	private String var;
	private Object value;
	
	public int doStartTag() throws JspException {
		pageContext.setAttribute(var, value);
		return SKIP_BODY;//跳过主体
	}
	
	public int doEndTag() throws JspException {
		return super.doEndTag();
	}

补充:

    PropertyUtils.getProperty(bean, name);返回Object
    
    BeanUtils.getProperty(bean, name);返回String
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值