【自定义标签开发】05-开发带属性的标签

我们之前了解了传统标签开发和简单标签开发,但是我们开发的标签都是没有属性的标签,我们接下来里了解一下带属性的标签的开发。
开发带属性的标签:
自定义标签可以定义一个或多个属性,这样,在JSP页面中应用自定义标签时就可以设置这些属性的值,通过这些属性为标签处理器传递参数信息,从而提高标签的灵活性和复用性。

记得我们之前写的让一段标签体循环5次,那么我们能不能在标签中设置一个属性,动态的设置循环的次数呢?当然是可以的,类似于:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/simpleTag" prefix="zyg2" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>带属性的标签</title>
  </head>
  
  <body> 
      <zyg2:repeat count="8"> 
  	  10Hello !  
      </zyg2:repeat> 
  </body>
  
</html>

想要让一个自定义标签带有属性,通常需要完成两个任务:
(1)在标签处理器中编写每个属性对应的setter方法。
(2)在TLD文件中描述标签的属性。

为自定义标签定义属性时,每个属性都必须按照JavaBean的属性命名方式,在标签处理器中定义属性名对应的setter方法,用来接收JSP页面中调用自定义标签时传递进来的属性值。例如属性url,在标签处理器类中就要定义相应的setUrl(Strung url)方法。

在标签处理器中定义相应的set方法后,JSP引擎在解析执行开始标签之前,也就是调用doStartTag方法前,会调用set属性方法,为标签设置属性。

下面我们来完成<zyg2:repeat count="8">标签的开发,作为例子。
首先创建一个标签处理器类:

然后编写该类,将参数作为类中的参数,并设置set方法:
package org.zyg.web.simpletag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class RepeatWithParSimpleTag extends SimpleTagSupport {
	private int count;
	
	public void setCount(int count) {
		this.count = count;
	}

	@Override
	public void doTag() throws JspException, IOException {
		JspFragment jf=this.getJspBody();
		for (int i = 0; i < count; i++) {
			jf.invoke(this.getJspContext().getOut());
		}
	}
}

然后在zygSimple.tld中注册这个标签(以前的repeat注释掉,以免冲突):
<tag>
    <name>repeat</name><!-- 标签名 -->
	<tag-class>org.zyg.web.simpletag.RepeatWithParSimpleTag</tag-class>
	<body-content>scriptless</body-content><!-- 有无标签体(单标签还是成对标签) -->


	<attribute>
		<name>count</name>
		<required>true</required>
		<!--rtexprvalue设定是否接受运行时表达式(EL表达式或其他代码)  -->
		<rtexprvalue>true</rtexprvalue>
	</attribute>
</tag>

然后前台页面就如刚刚那么写:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/simpleTag" prefix="zyg2" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>带属性的标签</title>
  </head>
  
  <body> 
      <zyg2:repeat count="8"> 
  	  Hello !  
      </zyg2:repeat> 
  </body>
  
</html>

重启Web项目,访问页面测试:


我们将count改为4,结果:

所以我们的带属性的标签开发成功!

我们之前说过,tld配置文件中rtexprvalue设定是否接受运行时表达式,我们来测试一下,我们在repeat中在设置一个属性,里面传输的是date日期:
<zyg2:repeat count="4" date="<%=new Date() %>"> 
  Hello !  
</zyg2:repeat> 
可以看到,我们的date属性中放置的正是运行时语句(在编译时才会体现真正值),这里我们的rtexprvalue设置的是true,所以我们可以得到它:
package org.zyg.web.simpletag;

import java.io.IOException;
import java.util.Date;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class RepeatWithParSimpleTag extends SimpleTagSupport {
	private int count;
	
	public void setCount(int count) {
		this.count = count;
	}
	
	private Date date;
	
	public void setDate(Date date) {
		this.date = date;
	}

	@Override
	public void doTag() throws JspException, IOException {
		JspFragment jf=this.getJspBody();
		this.getJspContext().getOut().write(date.toLocaleString()+"<br/>");
		for (int i = 0; i < count; i++) {
			jf.invoke(this.getJspContext().getOut());
		}
	}
}

然后在tld中设置:
<tag>
    <name>repeat</name><!-- 标签名 -->
	<tag-class>org.zyg.web.simpletag.RepeatWithParSimpleTag</tag-class>
	<body-content>scriptless</body-content><!-- 有无标签体(单标签还是成对标签) -->


	<attribute>
		<name>count</name>
		<required>true</required>
		<rtexprvalue>true</rtexprvalue>
	</attribute>
	
	<attribute>
		<name>date</name>
		<required>true</required>
		<rtexprvalue>true</rtexprvalue>
	</attribute>
</tag>

然后重启Web项目,访问该页面:

发现我们是可以接受运行时语句作为参数的,如果我们的rtexprvalue设置的是false,那么我们上面那种参数设置就会报错。

注:tld配置文件的attribute属性下还有一个type标签,定义的是属性的java类型。

转载请注明出处:http://blog.csdn.net/acmman/article/details/51118897

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

光仔December

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

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

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

打赏作者

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

抵扣说明:

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

余额充值