一、开拓带标签体的标签
我们可以利用标签体来简化我们上一个案例中的标签处理类。
<%@ page contentType=\"大众text/html;charset=UTF-8\"大众 language=\"大众java\"大众 %><%@taglib uri=\"大众mytid\公众 prefix=\"大众mytag\"大众%><html>
<tag>
public void doTag() throws JspException, IOException { HashMap<String,Integer> maps = (HashMap<String,Integer>)(getJspContext().getAttribute(map)); for (String str : maps.keySet()){
有些并没有改动的代码没有列出,只展示了关键的代码块。首先看jsp页面,有标签体的标签利用的时候是须要有开始标签和结束标签的,这一点是和html很像的。至于td元素中的内容,这是一个EL表达式,不知道的朋友可以快速百度下,这里的意思便是在当前页面探求共享数据名为name和age的数据,找到就获取其值,否则为“”,非null。tld文件中的改动不多,便是将body-content的值改动成scriptless,这表示标签体可以是静态的html,但是不能是jsp脚本。而我们之前一贯是empty,它指定该标签是没有标签体的。
接下来看看我们标签处理类的改动,原来冗长的输出代码,被更换成以下三条语句:
getJspContext().setAttribute(\"大众name\"大众,str);getJspContext().setAttribute(\"大众age\"大众,maps.get(str));getJspBody().invoke(null);
前面两条语句很大略,在jsp页面设置page范围内的共享数据,紧张是供应我们的标签中EL表达式利用。getJspBody()表示获取全体标签体的所有内容,返回的是一个fragment工具,这个工具的一个方法invoke便是用于输出全体内容到jsp页面,如果参数为null表示直接输出,还可以利用Writer作为参数传入,意思是将标签体的内容全部输入到这个字符流中,然后你可以通过一些操作,再次利用write方法输出到jsp页面。也便是说,如果对付标签体中的数据内容须要做一些判断操作的话,可以通报一个writer流,处理完成之后可以再次输出到页面上。
二、开拓以页面片段为属性的标签
我们的attribute可以上八种数据类型,由于jsp引擎是可以为我们自动转换并自动赋值到我们标签处理类的私有属性中,但是对付之外的类型都是不可以直接操作的,我们首先看如何以页面片段作为属性,通报。
<%@ page contentType=\公众text/html;charset=UTF-8\公众 language=\"大众java\"大众 %><%@taglib uri=\公众mytid\"大众 prefix=\"大众mytag\公众%><html>
我们利用jsp:attribute这个动作指令来完成给属性赋值上页面片段,name的值对应于tld中的属性name值。
<tag>
对付jsp页面以页面片段作为属性传入的参数,我们在标签处理类中是须要定义私有属性来接管的,在jsp中将页面片段定义为jspfregment类型,于是我们定义私有属性。
public class MyTag extends SimpleTagSupport { private JspFragment map; public JspFragment getMap(){ return this.map;
调用JspFragment 的invoke方法可以直接输出个中的内容。结果如下:
稍眇小结一下,之前我们通报属性值的时候是在标署名的后面添加属性名和属性值,但那时的属性值只限于字符串,你不能通报别的类型的内容。此处我们为了能够通报页面片段,通过jsp:attribute动作指令来给我们的属性赋值,而这个值的内容便是一个页面片段。上文中我们在先容自定义标签体的时候,我们说可以利用getJspBody可以得到标签体的内容,实在这个方法返回的也是一个fregment,以是我们可以调用invoke方法输出标签体内容。
三、开拓动态属性标签
在我们之前先容的内容中,通报的属性个数都是固定的,但是在实际开拓中每每又会碰着有些参数必须传入有些选择性的传入,这样每个人通报的属性的个数都是不一样的,做事器端该如何处理呢?我们可以利用动态属性标签,利用此标签之前,我们的标签处理类就必须要继续接口DynamicAttributes,这个接口中就只有一个方法,setDynamicAttribute这个方法便是来完成动态的给我们通报的属性赋值。这是第一点,第二点便是须要在tld文件中配置一条语句,表名这个tag是支持动态属性的。下面是demo:
<%@ page contentType=\"大众text/html;charset=UTF-8\"大众 language=\"大众java\公众 %><%@taglib uri=\"大众mytid\"大众 prefix=\"大众mytag\公众%><html>
<tag>
public class MyTag extends SimpleTagSupport implements DynamicAttributes{ private ArrayList<String> keys = new ArrayList<String>(); private ArrayList<Object> values = new ArrayList<Object>();
做一点阐明,setDynamicAttribute这个方法中有三个参数,我们常日只利用后面两个参数,一个代表属性名,一个代表属性值。那么第一个参数表示什么意思呢?官方阐明是:
uri - -the namespace of the attribute, or null if in the default namespace.
这是该属性的命名空间,如果没有显式指定便是null。我们暂时可以不用关心。
末了还是要强调一点,属性的的只能使基本的数据类型,对付一些繁芜的类型 ,例如Date,等,建议将该工具置于本页共享范围,然后标签处理类可以直接获取并做相应的处理。
自定义标签先容完了,如有缺点,望指出!
本文作者Walker_YAM