首页技术文章正文

JAVA培训之自定义EL函数库

更新时间:2017-04-16 来源:黑马程序员Java培训学院 浏览量:

EL函数库中,我们学习的那些方法都是由JSTL提供的,我们自己也可以定义函数库。自定义EL函数库有以下三个步骤:
  • 写一个类,在该类中定义一个有返回值的静态方法;
  • 编写tld文件;
  • 在页面中添加taglib指令,导入自定义标签库。
下面根据以上步骤,我们来完成自定义EL函数库,点击此处 1554260397032_1492336640063055268.png下载案例源代码,具体如下所示:
(1)新建一个web应用Example9,在src目录下新建一个类,MyFunciton,主要代码如例1-1所示:
例1-1 MyFunction.java
package cn.itcast.fn;
public class MyFunction {
    public static String print(){
        return "创智播客之EL函数库";
    }
}
例1-1中,MyFunction中的print()方法必须是静态的,有返回值的。
(2)因为tld文件我们不希望别人能够直接访问,因此我们将tld文件放在WEB-INF目录下。在该目录下创建一个目录tlds,然后将itcast.tld文件放在tlds目录中,文件内容如例1-2所示:
例1-2 itcast.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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
  version="2.0">
  <description>itcast</description>
  <display-name>itcast-function</display-name>
  <tlib-version>1.0</tlib-version>
  <short-name>it</short-name>
  <uri>http://www.itcast.cn/el/functions</uri>
 
  <function>
    <name>print</name>
    <function-class>cn.itcast.fn.MyFunction</function-class>
    <function-signature>java.lang.String print()</function-signature>
  </function>
</taglib>
例1-2中,文件的头与约束都是从jstl函数库中的fn.tld文件中拷贝过来的,下面对文件中的比较重要的标签进行解析,如下所示:
  • <tlib-version>:当前函数库的版本号;
  • <short-name>:函数库的前缀,例如fn;
  • <uri>:代表当前函数库的地址,在本案例中该标签不起作用;
  • <function>:定义函数的一个标签;
  • <name>:指明函数的名称;
  • <function-class>:指明函数所在的类的名称;
  • <function-signature>:指明函数的名字及返回值类型,如果有参数,也包括参数类型,如:<function-signature>boolean contains(java.lang.String, java.lang.String)</function-signature>。
另外在tld文件中,还存在一个标签,如下:
<function>
    <description>
      Tests if an input string contains the specified substring.
    </description>
    <name>contains</name>
    <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
    <function-signature>boolean contains(java.lang.String, java.lang.String)</function-signature>
    <example>
      &lt;c:if test="${fn:contains(name, searchString)}">
    </example>
  </function>
其中<example>标签表示的是该函数在jsp页面中的示范。
(3)在Example9的WebRoot目录下新建一个fn目录,然后在该目录下新建一个fn.jsp页面,主要代码如例1-3所示:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="it" uri="/WEB-INF/tlds/itcast.tld" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
   <h1>${it:print() }</h1>
</body>
</html>
例1-3中,taglib指令中的uri属性的值为“/WEB-INF/tlds/itcast.tld”,该值正是itcast.tld文件的位置。
(4)将Example9发布到服务器,然后启动服务器,在浏览器端访问:http://localhost:8080/Example9/fn/fn.jsp,浏览器显示的结果如图1-1所示:
1554260402641_1492336640094003686.png图1-1 浏览器显示结果


本文版权归黑马程序员Java培训学院所有,欢迎转载,转载请注明作者出处。谢谢!

作者:黑马程序员Java培训学院

首发:http://www.itheima.com/special/hmjavaeezly/


分享到:
在线咨询 我要报名
和我们在线交谈!