EL自定义函数
EL自定义函数用于扩展EL表达式的功能,可以让EL表达式完成普通Java程序代码所能完成的功能
- 开发HTML转义的EL函数
- 我们有时候想在JSP页面中输出JSP代码,但是JSP引擎会自动把HTML代码解析,输出给浏览器。此时我们就要对HTML代码转义。
步骤:
- 编写一个包含静态方法的类(EL表达式只能调用静态方法),该方法很常用,Tomcat都有此方法,可在\webapps\examples\WEB-INF\classes\util中找到
public static String filter(String message) { if (message == null) return (null); char content[] = new char[message.length()]; message.getChars(0, message.length(), content, 0); StringBuilder result = new StringBuilder(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()); }
在WEB/INF下创建tld(taglib description)文件,在tld文件中描述自定义函数
<?xml version="1.0" encoding="ISO-8859-1"?> <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <tlib-version>1.0</tlib-version> <short-name>myshortname</short-name> <uri>/zhongfucheng</uri> <!--函数的描述--> <function> <!--函数的名字--> <name>filter</name> <!--函数位置--> <function-class>utils.HTMLFilter</function-class> <!--函数的方法声明--> <function-signature>java.lang.String filter(java.lang.String)</function-signature> </function> </taglib>
在JSP页面中导入和使用自定义函数,EL自定义的函数一般前缀为"fn",uri是"/WEB-INF/tld文件名称"
<%@ page language="java" contentType="text/html" pageEncoding="UTF-8" %> <%@taglib prefix="fn" uri="/WEB-INF/zhongfucheng.tld" %> <html> <head> <title></title> </head> <body> //完成了HTML转义的功能 ${fn:filter("<a href='#'>点我</a>")} </body> </html>
效果:
EL函数库(fn方法库)
- 由于在JSP页面中显示数据时,经常需要对显示的字符串进行处理,SUN公司针对于一些常见处理定义了一套EL函数库供开发者使用。
- 其实EL函数库就是fn方法库,是JSTL标签库中的一个库,也有人称之为fn标签库,但是该库长得不像是标签,所以称之为fn方法库
- 既然作为JSTL标签库中的一个库,要使用fn方法库就需要导入JSTL标签!要想使用JSTL标签库就要导入jstl.jar和standard.jar包!
- 所以,要对fn方法库做测试,首先导入开发包(jstl.jar、standard.jar)
- 在JSP页面中指明使用标签库
<%@taglibprefix="fn"uri="http://java.sun.com/jsp/jstl/functions"%>
- fn方法库全都是跟字符串有关的(可以把它想成是String的方法)
- fn:toLowerCase
- fn:toUpperCase
- fn:trim
- fn:length
- fn:split
- fn:join 【接收字符数组,拼接字符串】
- fn:indexOf
- fn:contains
- fn:startsWith
- fn:replace
- fn:substring
- fn:substringAfter
- fn:endsWith
- fn:escapeXml【忽略XML标记字符】
- fn:substringBefore
- 测试代码:
contains:${fn:contains("zhongfucheng",zhong )}<br> containsIgnoreCase:${fn:containsIgnoreCase("zhongfucheng",ZHONG )}<br> endsWith:${fn:endsWith("zhongfucheng","eng" )}<br> escapeXml:${fn:escapeXml("<zhongfucheng>你是谁呀</zhongfucheng>")}<br> indexOf:${fn:indexOf("zhongfucheng","g" )}<br> length:${fn:length("zhongfucheng")}<br> replace:${fn:replace("zhongfucheng","zhong" ,"ou" )}<br> split:${fn:split("zhong,fu,cheng","," )}<br> startsWith:${fn:startsWith("zhongfucheng","zho" )}<br> substring:${fn:substring("zhongfucheng","2" , fn:length("zhongfucheng"))}<br> substringAfter:${fn:substringAfter("zhongfucheng","zhong" )}<br> substringBefore:${fn:substringBefore("zhongfucheng","fu" )}<br> toLowerCase:${fn:toLowerCase("zhonGFUcheng")}<br> toUpperCase:${fn:toUpperCase("zhongFUcheng")}<br> trim:${fn:trim(" zhong fucheng ")}<br> <%--将分割成的字符数组用"."拼接成一个字符串--%> join:${fn:join(fn:split("zhong,fu,cheng","," ),"." )}<br>
效果:
使用fn方法库数据回显
<% User user = new User(); String likes[] = {"sing"}; user.setLikes(likes); //数据回显 request.setAttribute("user",user); %> <%--java的字符数组以","号分割开,首先拼接成一个字符串,再判读该字符串有没有包含关键字,如果有就checked--%> <input type="checkbox"${ fn:contains(fn:join(user.likes,","),"sing")?'checked':'' }>唱歌 <input type="checkbox"${ fn:contains(fn:join(user.likes,","),"dance")?'checked':'' }>跳舞
效果:
如果文章有错的地方欢迎指正,大家互相交流。