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("&lt;");
14                             break;
15                     case '>':
16                             result.append("&gt;");
17                             break;
18                     case '&':
19                             result.append("&amp;");
20                             break;
21                     case '"':
22                             result.append("&quot;");
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目录下的除了classeslib目录之外的任意子目录中。 

 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>

 

 

 

 

posted @ 2013-04-14 10:17  hacket520  阅读(163)  评论(0编辑  收藏  举报