对于一些常用的函数,可以将之撰写为一个函数库,之后结合EL中对函数使用的支持即可重复使用该函数,例如您可以这样使用EL函数:
${ math:gcd(10, 20) }
要能够自订EL函数并使用之,我们必须完成四个步骤:
- 撰写函数类
- 撰写标签函数描述(Tag Library Descriptor)
- 在web.xml中说明class与tld的位置信息
- 在JSP网页中指定标签函数位置与前置文字
一个一个来完成,首先编写下面的程序:
package onlyfun.caterpillar; public class MathTools { public static int gcd(int m, int n) { int r = 0; while(n != 0) { r = m % n; m = n; n = r; } return m; } public static double pi() { return Math.PI; } }
注意所有的函数都是公开且静态的,编译完成之后,将之放置在WEB-INF\classes\下即可,然后撰写标签函数描述(Tag Library
Descriptor),这是个XML格式的文件,注意扩展名要是.tld而不是.xml,假设撰写的档名是mathtools.tld:
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd" version="2.0"> <description>Math Tools</description> <tlib-version>1.0</tlib-version> <short-name>SimpleMathTools</short-name> <uri>/SimpleMathTools</uri>
<function> <description>GCD Tool</description> <name>gcd</name> <function-class> onlyfun.caterpillar.MathTools </function-class> <function-signature> int gcd(int,int) </function-signature> </function> <function> <description>PI Tool</description> <name>pi</name> <function-class> onlyfun.caterpillar.MathTools </function-class> <function-signature> double pi() </function-signature> </function> </taglib>
大部分的标签光看标签名就可知道它的作用了(这是XML文件的自描述特性),注意一下<function-
signature>,它与<name>对应,<name>是EL调用函数时所用的名称,而<function-
signature>定义了函数的传入参数与传回值。
接下来在web.xml中添加对.tld与类档的相关描述:
... <jsp-config> <taglib> <taglib-uri> http://caterpillar.onlyfun.net/ </taglib-uri> <taglib-location> /WEB-INF/tlds/mathtools.tld </taglib-location> </taglib> </jsp-config> ...
<taglib-uri>用来设定使用.tld时的名称空间识别,这个信息在JSP网页中是用来指定将使用哪一个位置的tld档,接下来直接看看JSP网页中如何使用定义好的EL函数:
<%@taglib prefix="math" uri="http://www.caterpillar.onlyfun.net/"%> <html> <body> Math Tools GCD Test: ${ math:gcd(100, 14) }<br> Math Tools PI Test: ${ math:pi() } </body> </html>
您使用指令元素taglib来指定tld档的URI位置,并设定使用时的前置文字,前置文字的作用是当有许多同名函数时(例如用了两个位置的函数库,而当中有相同的函数时),可以根据前置文字来识别使用的是哪一个函数。
接下来就是启动Tomcat并执行了,传回的结果是:
<html>
<body>
Math Tools GCD Test: 2<br>
Math Tools PI Test: 3.141592653589793
</body>
</html>
附带一提的是,并不一定要在web.xml中添加对.tld与类档的相关描述,如果没有这个步骤的话,在JSP网页中直接指定.tld的实体位置也是可以的:
<%@taglib prefix="math" uri="/WEB-INF/tlds/mathtools.tld"%>
在web.xml中定义.tld的信息是为了管理的方便,如果不定义,则每次更动.tld文件的位置或名称,则必须修改每一个JSP网页,如果有在 web.xml档中定义,则更动.tld文件的位置或名称后,只要修改web.xml中的定义即可。 |