10.自定义EL函数和自定义标签
需要在JSP页面中进行一些常见逻辑操作(如对字符串进行操作),首先考虑是否可以用到sun公司提供的EL函数库(fn.tld)和JSTL 核心标签库
如果sun公司的EL函数库没有或者无法满足,就需要自己写 自定义标签或者写一个EL函数
自定义EL函数:
1.写这样一个 满足你的逻辑的函数(必须是静态的)
1 public class elDemo { 2 3 public static String demo(String str) { 4 return str; 5 } 6 7 }
2.这个Java类的静态方法需要在TLD文件中描述,才可以被EL表达式调用
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd" 4 version="2.0"> 5 6 7 <tlib-version>1.0</tlib-version> 8 <jsp-version>1.2</jsp-version> 9 <short-name>el</short-name> 10 <uri>/el</uri> 11 12 13 <function> 14 <name>demo</name> 15 <function-class>elDemo</function-class> 16 <function-signature>java.lang.String demo (java.lang.String)</function-signature> 17 </function> 18 19 20 21 </taglib>
3.在jsp页面去使用
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@taglib uri="/el" prefix="el" %> 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 4 <html> 5 <head> 6 <title>My JSP '2.jsp' starting page</title> 7 </head> 8 9 <body> 10 ${el:demo("sss") } 11 </body> 12 </html>
自定义标签
1.传统自定义标签:
1.遇到自定义标签,首先实例化标签对应的标签处理器类
2.调用setPageContext方法,把页面的pageContext对象 传递给标签处理器类
3.看标签是否有父标签,有则把父标签作为一个对象,调用setParent方法调用该对象
//(上面是自动的(服务器做的),但是需要做到:1.在JSP页面中,写好taglib指令,并合理调用自定义标签 2.写好标签处理器类 3.写好tld文件(抄头抄尾))
4.完成以上标签的初始化工作后,服务器就开始执行标签,这时遇到标签的开始标签 ,就调用doStartTag方法
5.如果标签有标签体,这时服务器一般会执行标签体
6.服务器遇到JSP页面结束标签,则调用处理器的doEndTag方法
7.整个标签执行完后,服务器一般会调用release方法释放标签工作时所占用的资源
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@taglib uri="/foreachTag" prefix="c"%> 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 4 <html> 5 <head> 6 <title>My JSP '3.jsp' starting page</title> 7 </head> 8 9 <body> 10 <% 11 List list = new ArrayList(); 12 list.add("aaa"); 13 list.add("bbb"); 14 list.add("ccc"); 15 list.add("dddd"); 16 request.setAttribute("list", list); 17 18 %> 19 <c:foreach var="str" items="${list }"> 20 ${str } 21 </c:foreach> 22 </body> 23 </html>
//标签处理器类 自定义foreach标签 public class foreachTag extends SimpleTagSupport { private Object items; private String var; public void setItems(Object items) { this.items = items; } public void setVar(String var) { this.var = var; } @Override public void doTag() throws JspException, IOException { List list = (List) items; Iterator it = list.iterator(); while(it.hasNext()) { Object value = it.next(); this.getJspContext().setAttribute(var, value); this.getJspBody().invoke(null); } } }
1 <?xml version="1.0" encoding="UTF-8" ?> 2 3 <!DOCTYPE taglib 4 PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" 5 "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd"> 6 7 8 <taglib> 9 <tlib-version>1.0</tlib-version> 10 <jsp-version>1.2</jsp-version> 11 <short-name>simple</short-name> 12 <uri>/foreachTag</uri> 13 14 15 <tag> 16 <name>foreach</name> 17 <tag-class>com.Tag.foreachTag</tag-class> 18 <body-content>scriptless</body-content> 19 20 <attribute> 21 <name>var</name> 22 <required>true</required> 23 <rtexprvalue>true</rtexprvalue> 24 </attribute> 25 <attribute> 26 <name>items</name> 27 <required>true</required> 28 <rtexprvalue>true</rtexprvalue> 29 </attribute> 30 </tag> 31 </taglib>
2.简单自定义标签(及属性的设置)
1.遇到简单标签,同样先实例化标签对应的标签处理器类
2.调用setJspContext,把页面pageContext传递给标签处理器类
3.调用setParent方法,把父标签传递进去,如果没有,则传递null
//(上面是自动的,但是需要做到:1.在JSP页面中,写好taglib指令,并合理调用自定义标签 2.写好标签处理器类 3.写好tld文件(抄头抄尾)
4.调用setJspBody方法,把封装了标签体JspFragment传递给标签处理器类
5.执行页面中的自定义标签,执行标签实际上就是调用doTag方法
1 public class SimpleTag extends SimpleTagSupport { 2 3 private int count; 4 5 public void setCount(int count) { 6 this.count = count; 7 } 8 @Override 9 public void doTag() throws JspException, IOException { 10 11 JspFragment jf = this.getJspBody(); 12 for(int i = 0;i<count;i++) { 13 jf.invoke(null); 14 } 15 } 16 17 }
1 <?xml version="1.0" encoding="UTF-8" ?> 2 3 <!DOCTYPE taglib 4 PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" 5 "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd"> 6 7 8 <taglib> 9 <tlib-version>1.0</tlib-version> 10 <jsp-version>1.2</jsp-version> 11 <short-name>simple</short-name> 12 <uri>/sTag</uri> 13 14 15 <tag> 16 <name>sTag</name> 17 <tag-class>com.Tag.SimpleTag</tag-class> 18 <body-content>scriptless</body-content> 19 20 <attribute> 21 <name>count</name> 22 <required>true</required> 23 <rtexprvalue>true</rtexprvalue> 24 </attribute> 25 </tag> 26 27 28 </taglib>
注意:
1.简单自定义标签在tld文件中 <body-content>srcipt</body-content> 传统自定义标签 <body-content>JSP</body-content>
2.设置带属性的标签的步骤:1.在标签处理器类中编写每个属性对应的setter方法 2.在TLD文件中描述标签的属性
3.在设置带属性的标签时,除了基本的name(属性名)的设置,还有:
<required>true</required> (这个元素设置该属性是否必须)
<rtexprvalue>true</rtexprvalue> (这个元素设置该属性是否支持运行时表达式(这样就支持了el表达式)为属性赋值 一般都设置为true)
4.传统自定义标签的生命周期为创建该自定义标签到工程结束;;简单自定义标签的生命周期为 创建该标签,到完成上面的5步,就自动销毁