EL表达式语言2
使用EL调用Java方法-自定义方法
EL表达式语法允许开发人员开发自定义函数,以调用Java类的方法。
•示例:${prefix:method(params)}
•在EL表达式中调用的只能是Java类的静态方法。
•这个Java类的静态方法需要在TLD文件中描述,才可以被EL表达式调用。
•EL自定义函数用于扩展EL表达式的功能,可以让EL表达式完成普通Java程序代码所能完成的功能。
•EL函数只能访问与WEB无关的需求,与WEB有关的需求还是需要使用自定义标签来解决。
EL Function开发步骤:
一般来说, EL自定义函数开发与应用包括以下三个步骤:
•编写一个Java类的静态方法。
•编写标签库描述符(tld)文件,在tld文件中描述自定义函数,在WEB-INF/目录下。
•在JSP页面中导入和使用自定义函数。
示例:开发对html标签进行转义的el function
1.处理类
1 package cn.zengfansheng.el; 2 public class Filter { 3 4 public static String filter(String message) { 5 if (message == null) 6 return (null); 7 char content[] = new char[message.length()]; 8 message.getChars(0, message.length(), content, 0); 9 StringBuffer result = new StringBuffer(content.length + 50); 10 for (int i = 0; i < content.length; i++) { 11 switch (content[i]) { 12 case '<': 13 result.append("<"); 14 break; 15 case '>': 16 result.append(">"); 17 break; 18 case '&': 19 result.append("&"); 20 break; 21 case '"': 22 result.append("""); 23 break; 24 default: 25 result.append(content[i]); 26 } 27 } 28 29 return (result.toString()); 30 31 } 32 33 }
2.编写完标签库描述文件后,需要将它放置到<web应用>\WEB-INF目录中或WEB-INF目录下的除了classes和lib目录之外的任意子目录中。
TLD文件中的<uri> 元素用指定该TLD文件的URI,在JSP文件中需要通过这个URI来引入该标签库描述文件
<function>元素用于描述一个EL自定义函数,其中:
•<name>子元素用于指定EL自定义函数的名称。
•<function-class>子元素用于指定完整的Java类名。
•<function-signature>子元素用于指定Java类中的静态方法的签名,方法签名必须指明方法的返回值类型及各个参数的完整类型,基本数据类型除外,各个参数之间用逗号分隔。
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <taglib xmlns="http://java.sun.com/xml/ns/j2ee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" 5 version="2.0"> 6 <tlib-version>1.0</tlib-version> 7 <short-name>el</short-name> 8 <uri>http://java.sun.com/jsp/jstl/el</uri> 9 10 <function> 11 <name>filter</name> 12 <function-class>cn.zengfansheng.el.Filter</function-class> 13 <function-signature>java.lang.String filter(java.lang.String)</function-signature> 14 </function> 15 </taglib>
3.jsp页面中引用
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <%@ taglib uri="http://java.sun.com/jsp/jstl/el" prefix="el" %> 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 4 <html> 5 6 <body> 7 ${el:filter("<script type='text/javascript'>while(true){window.alert('haha');}</script>") } 8 </body> 9 </html>
EL注意事项
EL表达式是JSP 2.0规范中的一门技术 。因此,若想正确解析EL表达式,需使用支持Servlet2.4/JSP2.0技术的WEB服务器。
注意:有些Tomcat服务器如不能使用EL表达式
(1)升级成tomcat6/7
(2 ) 升级JSTL的JAR包
(3)在JSP中加入<%@ page isELIgnored="false" %>
即,告诉JSP引擎不忽略EL表达式语言。
EL表达式保留关键字
所谓保留字的意思是指变量在命名时,应该避开上述的名字,以免程序编译时发生错误
练习:密码校验
1.处理类
1 //${el:checkPassword()}普通类 2 public class Check { 3 public static boolean checkPassword(String pw1,String pw2){ 4 boolean flag = false; 5 //密码必填 6 if(isRequired(pw1) && isRequired(pw2)){ 7 //密码数字6位 8 if(isNumberSix(pw1) && isNumberSix(pw2)){ 9 //二次密码一致 10 if(equalsBoth(pw1,pw2)){ 11 flag = true; 12 } 13 }else{ 14 15 } 16 }else{ 17 18 } 19 return flag; 20 } 21 private static boolean isRequired(String message){ 22 boolean flag = false; 23 if(message!=null && message.trim().length()>0){ 24 flag = true; 25 } 26 return flag; 27 } 28 private static boolean isNumberSix(String message){ 29 boolean flag = false; 30 if(message.matches("[0-9]{6}")){ 31 flag = true; 32 } 33 return flag; 34 } 35 private static boolean equalsBoth(String message1,String message2){ 36 return message1.equals(message2); 37 } 38 }
2.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"> <tlib-version>1.0</tlib-version> <short-name>el</short-name> <uri>http://java.sun.com/jsp/jstl/el</uri> <function> <name>checkPassword</name> <function-class>cn.itcast.web.jsp.el.Check</function-class> <function-signature>boolean checkPassword(java.lang.String,java.lang.String)</function-signature> </function> </taglib>
3.jsp页面
1 <%@ page language="java" pageEncoding="UTF-8"%> 2 <%@ taglib uri="http://java.sun.com/jsp/jstl/el" prefix="el" %> 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 4 <html> 5 <body> 6 结果是:${el:checkPassword("123456","123456")} 7 </body> 8 </html>
by hacket