tld文件和上面是一样的,下面是测试代码:
<% /*list集合*/ List list = new ArrayList(); list.add("zhongfucneng"); list.add("1"); list.add("2"); list.add("3"); request.setAttribute("list",list); /*基本数据类型数组*/ int[] ints = new int[]{1, 2, 3, 4, 5}; request.setAttribute("ints", ints); /*对象数组*/ Object[] objects = new Object[]{2, 3, 4, 5, 6}; request.setAttribute("objects", objects); /*map集合*/ Map map = new HashMap(); map.put("aa", "aa"); map.put("bb", "bb"); map.put("cc", "cc"); request.setAttribute("map",map); %> List集合: <zhongfucheng:forEach items="${list}" var="str"> ${str} </zhongfucheng:forEach> <hr> <hr> 基本数据类型数组: <zhongfucheng:forEach items="${ints}" var="i"> ${i} </zhongfucheng:forEach> <hr> <hr> 对象数组: <zhongfucheng:forEach items="${objects}" var="o"> ${o} </zhongfucheng:forEach> <hr> <hr> map集合: <zhongfucheng:forEach items="${map}" var="me"> ${me.key} = ${me.value} </zhongfucheng:forEach>
效果:
HTML转义标签
要开发这个标签就很简单了,只要获取到标签体的内容,再通过经过方法转义下标签体内容,输出给浏览器即可!
- 标签处理器代码:
public class Demo1 extends SimpleTagSupport { @Override public void doTag() throws JspException, IOException { //获取到标签体的内容再修改 StringWriter stringWriter = new StringWriter(); JspFragment jspFragment = this.getJspBody(); jspFragment.invoke(stringWriter); String content = stringWriter.toString(); //经过filter()转义,该方法在Tomcat可以找到 content = filter(content); //再把转义后的内容输出给浏览器 this.getJspContext().getOut().write(content); } private String filter(String message) { if (message == null) return (null); char content[] = new char[message.length()]; message.getChars(0, message.length(), content, 0); StringBuffer result = new StringBuffer(content.length + 50); for (int i = 0; i < content.length; i++) { switch (content[i]) { case '<': result.append("<"); break; case '>': result.append(">"); break; case '&': result.append("&"); break; case '"': result.append("""); break; default: result.append(content[i]); } } return (result.toString()); } }
测试代码:
<zhongfucheng:filter><a href="2.jsp">你好啊</a> </zhongfucheng:filter> <br> <a href="2.jsp">你好啊
效果:
if else标签
在JSTL中并没有if else的标签,JSTL给予我们的是choose,when,otherwise标签,现在我们模仿choose,when,otherwise开发标签
思路:when标签有个test属性,但otherwise怎么判断标签体是执行还是不执行呢?这时就需要choose标签的支持了!choose标签默认定义一个Boolean值为false,。当when标签体被执行了,就把Boolean值变成true,只要Boolean值为false就执行otherwise标签体的内容。
看程序就容易理解上面那句话了:!
- choose标签处理器
public class Choose extends SimpleTagSupport { private boolean flag; @Override public void doTag() throws JspException, IOException { this.getJspBody().invoke(null); } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } }
When标签处理器
public class When extends SimpleTagSupport { private boolean test ; @Override public void doTag() throws JspException, IOException { Choose choose = (Choose) this.getParent(); //如果test为true和flag为false,那么执行该标签体 if (test == true && choose.isFlag() == false) { this.getJspBody().invoke(null); //修改父标签的flag choose.setFlag(true); } } public void setTest(boolean test) { this.test = test; } }
OtherWise标签处理器
public class OtherWise extends SimpleTagSupport { @Override public void doTag() throws JspException, IOException { Choose choose = (Choose) this.getParent(); //如果父标签的flag为false,就执行标签体(如果when标签没执行,flag值就不会被修改!when标签没执行,就应该执行otherwise标签!) if (choose.isFlag() == false) { getJspBody().invoke(null); //改父标签的flag为false choose.setFlag(true); } } }
测试代码:
<zhongfucheng:choose> <zhongfucheng:when test="${user!=null}"> user为空 </zhongfucheng:when> <zhongfucheng:otherwise> user不为空 </zhongfucheng:otherwise> </zhongfucheng:choose>
效果:
DynamicAttribute接口
此接口的主要功能是用于完成动态属性的设置!前面我们讲解属性标签的时候,属性都是写多少个,用多少个的。现在如果我希望属性可以动态的增加,只需要在标签处理器类中实现DynamicAttribute接口即可!
现在我要开发一个动态加法的标签:
- 标签处理器:
public class Demo1 extends SimpleTagSupport implements DynamicAttributes { //既然有动态属性和动态的值,那么我们就用一个Map集合存储(1-1对应的关系),做的加法运算,值为Double类型的。 Map<String, Double> map = new HashMap<>(); @Override public void doTag() throws JspException, IOException { //定义一个sum变量用于计算总值 double sum = 0.0; //获取到Map集合的数据 Iterator iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, Double> entry = (Map.Entry<String, Double>) iterator.next(); sum += entry.getValue(); } //向浏览器输出总和是多少 this.getJspContext().getOut().write(String.valueOf(sum)); } //对于这个要实现的方法,我们只要关注第2个参数和第3个参数即可 //第二个参数表示的是动态属性的名称,第三个参数表示的是动态属性的值 @Override public void setDynamicAttribute(String s, String localName, Object value) throws JspException { //将动态属性的名字和值加到Map集合中 map.put(localName, Double.valueOf(Float.valueOf(value.toString()))); } }
tld文件,注意要把dynamic-attribute设置为true
<tag> <name>dynamicAttribute</name> <tag-class> tag.Demo1</tag-class> <body-content> empty</body-content> <!--这个必须要设置为true--> <dynamic-attributes>true</dynamic-attributes> </tag>
- 测试代码:
<zhongfucheng:dynamicAttributenum="1.1"num2="2.2"num3="1"/>
- 效果,double在运算的时候会丢失精度的,现在只是测验下动态属性,这里就不详细说了!
开发自定义函数
至于怎么开发自定义函数,在EL表达式的博客中有!
如果文章有错的地方欢迎指正,大家互相交流。