1 EL表达式简介
EL 全名为Expression Language。EL主要作用:
1、获取数据
EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
2、执行运算
利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
3、获取web开发常用对象
EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
4、调用Java方法
EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。
2 EL表达式使用
2.1 获取数据
使用EL表达式获取数据语法:"${标识符}"
EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。
EL表达式可以很轻松获取JavaBean的属性,或获取数组、Collection、Map类型集合的数据
示例:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 3 <!DOCTYPE HTML> 4 <html> 5 <head> 6 <title>el表达式获取数据</title> 7 </head> 8 9 <body> 10 <% 11 request.setAttribute("name", "小李"); 12 %> 13 <%--${name}等同于pageContext.findAttribute("name") --%> 14 使用EL表达式获取数据:${name} 15 <hr> 16 17 18 19 <!-- 在jsp页面中,使用el表达式可以获取bean的属性 --> 20 <%!public class Person { 21 22 private String age; 23 24 private String home; 25 26 private String name; 27 28 private String sex; 29 30 public String getAge() { 31 return age; 32 } 33 34 public String getHome() { 35 return home; 36 } 37 38 public String getName() { 39 return name; 40 } 41 42 public String getSex() { 43 return sex; 44 } 45 46 public void setAge(String age) { 47 this.age = age; 48 } 49 50 public void setHome(String home) { 51 this.home = home; 52 } 53 54 public void setName(String name) { 55 this.name = name; 56 } 57 58 public void setSex(String sex) { 59 this.sex = sex; 60 } 61 }%> 62 <% 63 Person p = new Person(); 64 p.setAge("22"); 65 request.setAttribute("person", p); 66 %> 67 使用el表达式可以获取bean的属性:${person.age} 68 <hr> 69 70 71 72 <!-- 在jsp页面中,使用el表达式获取list集合中指定位置的数据 --> 73 <% 74 Person p1 = new Person(); 75 p1.setName("user1"); 76 77 Person p2 = new Person(); 78 p2.setName("user2"); 79 80 List<Person> list = new ArrayList<Person>(); 81 list.add(p1); 82 list.add(p2); 83 84 request.setAttribute("list", list); 85 %> 86 <!-- 取list指定位置的数据 --> 87 ${list[1].name} 88 89 90 91 92 <!-- 迭代List集合 --> 93 <c:forEach var="person" items="${list}"> 94 ${person.name} 95 </c:forEach> 96 <hr> 97 98 99 100 <!-- 在jsp页面中,使用el表达式获取map集合的数据 --> 101 <% 102 Map<String, String> map = new LinkedHashMap<String, String>(); 103 map.put("a", "aaaaxxx"); 104 map.put("b", "bbbb"); 105 map.put("c", "cccc"); 106 map.put("1", "aaaa1111"); 107 request.setAttribute("map", map); 108 %> 109 <!-- 根据关键字取map集合的数据 --> 110 ${map.c} ${map["1"]} 111 <hr> 112 <!-- 迭代Map集合 --> 113 <c:forEach var="me" items="${map}"> 114 ${me.key}=${me.value}<br /> 115 </c:forEach> 116 <hr> 117 </body> 118 </html>
2.2 执行计算
语法:${运算表达式},EL表达式支持如下运算符:
1、关系运算符
2、逻辑运算符:
3、empty运算符:检查对象是否为null(空)
4、二元表达式:${user!=null?user.name :""}
5、[ ] 和 . 号运算符
示例:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 3 <%!public class Person { 4 5 private String age; 6 7 private String home; 8 9 private String name; 10 11 private String sex; 12 13 public Person(String name) { 14 this.name = name; 15 } 16 17 public String getAge() { 18 return age; 19 } 20 21 public String getHome() { 22 return home; 23 } 24 25 public String getName() { 26 return name; 27 } 28 29 public String getSex() { 30 return sex; 31 } 32 33 public void setAge(String age) { 34 this.age = age; 35 } 36 37 public void setHome(String home) { 38 this.home = home; 39 } 40 41 public void setName(String name) { 42 this.name = name; 43 } 44 45 public void setSex(String sex) { 46 this.sex = sex; 47 } 48 }%> 49 <!DOCTYPE HTML> 50 <html> 51 <head> 52 <title>el表达式运算符</title> 53 </head> 54 55 <body> 56 <h3>el表达式进行四则运算:</h3> 57 加法运算:${365+24} 58 <br /> 减法运算:${365-24} 59 <br /> 乘法运算:${365*24} 60 <br /> 除法运算:${365/24} 61 <br /> 62 63 <h3>el表达式进行关系运算:</h3> 64 <%--${user == null}和 ${user eq null}两种写法等价--%> 65 ${user == null} 66 <br /> ${user eq null} 67 <br /> 68 69 <h3>el表达式使用empty运算符检查对象是否为null(空)</h3> 70 <% 71 List<String> list = new ArrayList<String>(); 72 list.add("夜阑卧听风吹雨"); 73 list.add("铁马冰河入梦来"); 74 request.setAttribute("list", list); 75 %> 76 <%--使用empty运算符检查对象是否为null(空),也可以通过判断对象==null实现--%> 77 <c:if test="${!empty(list)}"> 78 <c:forEach var="str" items="${list}"> 79 ${str}<br /> 80 </c:forEach> 81 </c:if> 82 <br /> 83 <% 84 List<String> emptyList = null; 85 %> 86 <%--判断对象==null --%> 87 <c:if test="${emptyList==null}"> 88 对不起,没有您想看的数据 89 </c:if> 90 91 <br /> 92 93 <h3>EL表达式中使用二元表达式</h3> 94 <% 95 session.setAttribute("user", new Person("小明")); 96 %> 97 ${user==null? "对不起,您没有登陆 " : user.name} 98 99 <br /> 100 101 <h3>EL表达式数据回显</h3> 102 <% 103 Person user = new Person("小李"); 104 user.setSex("female"); 105 //数据回显 106 request.setAttribute("user", user); 107 %> 108 <input type="radio" name="sex" value="male" 109 ${user.sex=='male'?'checked':''}>男 110 <input type="radio" name="sex" value="female" 111 ${user.sex=='female'?'checked':''}>女 112 <br />65 113 114 </body> 115 </html>
2.3 访问隐式对象
EL表达式语言中定义了11个隐含对象,使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据。
语法:${隐式对象名称}:获得对象的引用
序号 | 隐含对象名称 | 描 述 |
1 | pageContext | 对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。) |
2 | pageScope | 代表page域中用于保存属性的Map对象 |
3 | requestScope | 代表request域中用于保存属性的Map对象 |
4 | sessionScope | 代表session域中用于保存属性的Map对象 |
5 | applicationScope | 代表application域中用于保存属性的Map对象 |
6 | param | 表示一个保存了所有请求参数的Map对象 |
7 | paramValues | 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[] |
8 | header | 表示一个保存了所有http请求头字段的Map对象,注意:如果头里面有“-” ,例Accept-Encoding,则要header[“Accept-Encoding”] |
9 | headerValues | 表示一个保存了所有http请求头字段的Map对象,它对于某个请求参数,返回的是一个string[]数组。注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”] |
10 | cookie | 表示一个保存了所有cookie的Map对象 |
11 | initParam | 表示一个保存了所有web应用初始化参数的map对象 |
注意:
测试header和headerValues时,如果头里面有“-” ,例Accept-Encoding,则要header["Accept-Encoding"]、headerValues["Accept-Encoding"]
测试cookie时,例${cookie.key}取的是cookie对象,如访问cookie的名称和值,须${cookie.key.name}或${cookie.key.value}
使用示例:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <!DOCTYPE HTML> 3 <html> 4 <head> 5 <title>获取el隐式对象</title> 6 </head> 7 8 <body> 9 <br />---------------1、pageContext对象:获取JSP页面中的pageContext对象------------------------ 10 <br /> ${pageContext} 11 <br /> 12 13 14 15 16 <br />---------------2、pageScope对象:从page域(pageScope)中查找数据------------------------ 17 <br /> 18 <% 19 pageContext.setAttribute("name", "僵卧孤村不自哀"); //map 20 %> 21 ${pageScope.name} 22 <br /> 23 24 25 26 27 <br />---------------3、requestScope对象:从request域(requestScope)中获取数据------------------------ 28 <br /> 29 <% 30 request.setAttribute("name", "尚思为国戍轮台"); //map 31 %> 32 ${requestScope.name} 33 <br /> 34 35 36 37 38 <br />---------------4、sessionScope对象:从session域(sessionScope)中获取数据------------------------ 39 <br /> 40 <% 41 session.setAttribute("user", "夜阑卧听风吹雨"); //map 42 %> 43 ${sessionScope.user} 44 <br /> 45 46 47 48 49 <br />---------------5、applicationScope对象:从application域(applicationScope)中获取数据------------------------ 50 <br /> 51 <% 52 application.setAttribute("user", "铁马冰河入梦来"); //map 53 %> 54 ${applicationScope.user} 55 <br /> 56 57 58 59 60 <br />--------------6、param对象:获得用于保存请求参数map,并从map中获取数据------------------------ 61 <br /> 62 <!-- http://localhost:8080/JavaWeb_EL_Study_20140826/ELDemo03.jsp?name=dd&name=aaa&age=21 --> 63 ${param.name} 64 <!-- 显示第一个name值 --> 65 <br /> 66 <!-- 此表达式会经常用在数据回显上 --> 67 <form 68 action="${pageContext.request.contextPath}/servlet/RegisterServlet" 69 method="post"> 70 <input type="text" name="username" value="${param.name}"> <input 71 type="submit" value="注册"> 72 </form> 73 <br /> --------------7、paramValues对象:paramValues获得请求参数 74 //map{"",String[]}------------------------ 75 <br /> 76 <!-- http://localhost:8080/JavaWeb_EL_Study_20140826/ELDemo03.jsp?name=dd&name=aaa&age=21 --> 77 ${paramValues.name[0]} ${paramValues.name[1]} 78 <br /> 79 80 81 82 83 <br />--------------8、header对象:header获得请求头------------------------ 84 <br /> ${header.Accept} 85 <br /> 86 <%--${header.Accept-Encoding} 这样写会报错 87 测试headerValues时,如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”] 88 --%> 89 ${header["Accept-Encoding"]} 90 <br /> 91 92 93 94 95 <br />--------------9、headerValues对象:headerValues获得请求头的值------------------------ 96 <br /> 97 <%--headerValues表示一个保存了所有http请求头字段的Map对象,它对于某个请求参数,返回的是一个string[]数组 98 例如:headerValues.Accept返回的是一个string[]数组 ,headerValues.Accept[0]取出数组中的第一个值 99 --%> 100 ${headerValues.Accept[0]} 101 <br /> 102 <br /> 103 <%--${headerValues.Accept-Encoding} 这样写会报错 104 测试headerValues时,如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”] 105 headerValues["Accept-Encoding"]返回的是一个string[]数组,headerValues["Accept-Encoding"][0]取出数组中的第一个值 106 --%> 107 ${headerValues["Accept-Encoding"][0]} 108 <br /> 109 110 111 112 113 <br />--------------10、cookie对象:cookie对象获取客户机提交的cookie------------------------ 114 <br /> 115 <!-- 从cookie隐式对象中根据名称获取到的是cookie对象,要想获取值,还需要.value --> 116 ${cookie.JSESSIONID.value} //保存所有cookie的map 117 <br /> 118 119 120 121 122 <br />--------------11、initParam对象:initParam对象获取在web.xml文件中配置的初始化参数------------------------ 123 <br /> 124 <%-- 125 <!-- web.xml文件中配置初始化参数 --> 126 <context-param> 127 <param-name>xxx</param-name> 128 <param-value>yyyy</param-value> 129 </context-param> 130 <context-param> 131 <param-name>root</param-name> 132 <param-value>/JavaWeb_EL_Study_20140826</param-value> 133 </context-param> 134 --%> 135 <%--获取servletContext中用于保存初始化参数的map --%> 136 ${initParam.xxx} 137 <br /> ${initParam.root} 138 </body> 139 </html>
2.4 调用Java方法
EL表达式语法允许开发人员开发自定义函数,以调用Java类的方法。语法:${prefix:method(params)}
在EL表达式中调用的只能是Java类的静态方法,这个Java类的静态方法需要在TLD文件中描述,才可以被EL表达式调用。
EL自定义函数用于扩展EL表达式的功能,可以让EL表达式完成普通Java程序代码所能完成的功能。
一般来说, EL自定义函数开发与应用包括以下三个步骤:
1、编写一个Java类的静态方法
2、编写标签库描述符(tld)文件,在tld文件中描述自定义函数。
3、在JSP页面中导入和使用自定义函数
下面以将html标签不解析直接输出的例子为例,如下:
2.4.1 java文件:HtmlFilter.java
1 package com.zsm.util; 2 3 //此类用于将html标签不解析原样输出,只有el/4callJavaMethod.jsp用到 4 public class HtmlFilter { 5 6 public static String filter(String message) { 7 8 if (message == null) 9 return (null); 10 11 char content[] = new char[message.length()]; 12 message.getChars(0, message.length(), content, 0); 13 StringBuffer result = new StringBuffer(content.length + 50); 14 for (int i = 0; i < content.length; i++) { 15 switch (content[i]) { 16 case '<': 17 result.append("<"); 18 break; 19 case '>': 20 result.append(">"); 21 break; 22 case '&': 23 result.append("&"); 24 break; 25 case '"': 26 result.append("""); 27 break; 28 default: 29 result.append(content[i]); 30 } 31 } 32 return (result.toString()); 33 } 34 }
2.4.2 tld文件:elFunction.tld
1 <?xml version="1.0" encoding="UTF-8"?> 2 <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"> 4 <tlib-version>1.0</tlib-version> 5 <short-name>EL Function</short-name> 6 <!--此文件只有el/4callJavaMethod.jsp用到--> 7 <uri>/ELFunction</uri> 8 9 <!--<function>元素用于描述一个EL自定义函数 --> 10 <function> 11 <description>html标签转义处理方法</description> 12 <!--<name>子元素用于指定EL自定义函数的名称--> 13 <name>filter</name> 14 <!--<function-class>子元素用于指定完整的Java类名--> 15 <function-class>com.zsm.util.HtmlFilter</function-class> 16 <!--<function-signature>子元素用于指定Java类中的静态方法的签名, 17 方法签名必须指明方法的返回值类型及各个参数的类型,各个参数之间用逗号分隔。--> 18 <function-signature>java.lang.String filter(java.lang.String)</function-signature> 19 </function> 20 </taglib> 21 22 <!-- 23 编写完标签库描述文件后,需要将它放置到<web应用>\WEB-INF目录中或WEB-INF目录下的除了classes和lib目录之外的任意子目录中。 24 TLD文件中的<uri> 元素用指定该TLD文件的URI,在JSP文件中需要通过这个URI来引入该标签库描述文件。 25 <function>元素用于描述一个EL自定义函数,其中: 26 <name>子元素用于指定EL自定义函数的名称。 27 <function-class>子元素用于指定完整的Java类名, 28 <function-signature>子元素用于指定Java类中的静态方法的签名,方法签名必须指明方法的返回值类型及各个参数的类型,各个参数之间用逗号分隔。 29 -->
2.4.3 jsp文件
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%--引入EL自定义函数库 --%> 3 <%--<%@taglib uri="/ELFunction" prefix="fn"%> --%> 4 <%--也可以使用这种方式导入标签库,直接把uri设置成标签库的tld文件所在目录 --%> 5 <%@taglib uri="/WEB-INF/elFunction.tld" prefix="fn"%> 6 <!DOCTYPE HTML> 7 <html> 8 <head> 9 <title>使用EL调用Java方法</title> 10 </head> 11 12 <body> 13 <%--使用EL调用filter方法--%> 14 ${fn:filter("<a href=''>点点</a>")} 15 </body> 16 </html>
3 参考资料
http://www.cnblogs.com/xdp-gacl/p/3938361.html
其他:EL库函数的使用
来源:https://www.cnblogs.com/z-sm/p/5630624.html