首页 > 代码库 > EL表达式
EL表达式
EL 全名为Expression Language。EL主要作用:
获取数据:
EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
执行运算:
利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
获取web开发常用对象:11个隐含对象
EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
调用Java方法
EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。
EL表达式里不支持+ 字符串连接
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@page import="cn.itcast.domain.Person"%><%@page import="cn.itcast.domain.Address"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>el表达式获取数据</title> </head> <body> <br/>----------------获取域中存的数据-------------------------<br/> <% String data = "abcd"; request.setAttribute("data",data); %> ${data } 等价于 <%--pageContext.findAttribute("data") ""--%> 会依次从四个域中查询,如果四个域中都找不到,返回空字符串“” 不是返回null <br/>----------------获取域中存的javabean的数据-------------------------<br/> <% Person p = new Person(); p.setName("aaaa"); request.setAttribute("person",p); %> ${person.name } <br/>----------------获取域中存的javabean中的javabean的数据-------------------------<br/> <% Person p1 = new Person(); Address a = new Address(); a.setCity("上海"); p1.setAddress(a); request.setAttribute("p1",p1); %> ${p1.address.city } <br/>----------------获取域中存的list集合中的数据-------------------------<br/> <% List list = new ArrayList(); list.add(new Person("aaa")); list.add(new Person("bbb")); request.setAttribute("list",list); %> ${list[‘1‘].name } <br/>----------------获取域中map集合中的数据-------------------------<br/> <% Map map = new HashMap(); map.put("aa",new Person("aaaaa")); map.put("bb",new Person("bbbbb")); map.put("cc",new Person("ccccc")); map.put("dd",new Person("ddddd")); map.put("111",new Person("eeeee")); request.setAttribute("map111",map); %> ${map111.cc.name } <br/>----------------其它几个常用的el表达式-------------------------<br/> ${pageContext.request.contextPath } <a href="${pageContext.request.contextPath }/index.jsp">点点</a> </body></html>
<html> <head> <title>运算符示例</title> </head> <body> <% request.setAttribute("username","aaa"); request.setAttribute("password","124"); %> ${username==‘aaa‘ && password==‘123‘ } <br/>----------------empty运算符-------------------------<br/> <% //request.setAttribute("list",null); request.setAttribute("list",new ArrayList()); %> ${empty(list) } empty运算符:检查对象是否为null或“空” <br/>----------------二元运算符-------------------------<br/> ${user!=null ? user.username : ‘‘ } EL表达式不支持+ 字符串连接 <br/>----------------二元运算符(数据回显)-------------------------<br/> <% request.setAttribute("gender","male"); %> <input type="radio" name="gender" value="male" ${gender==‘male‘?‘checked‘:‘‘ }>男 <input type="radio" name="gender" vlaue="female" ${gender==‘female‘?‘checked‘:‘‘ }>女 <% request.setAttribute("likes",new String[]{"dance","sing"}); %> <input type="checkbox" name="likes" value="">唱歌 <input type="checkbox" name="likes" value="">跳舞 <input type="checkbox" name="likes" value="">蓝球 <input type="checkbox" name="likes" value="">足球 </body></html>
<html> <head> <title>隐式对象</title> </head> <body> ${pageContext} <br/>----------------使用el隐式对象访问指定的域-------------------------<br/> <% pageContext.setAttribute("aa","123"); %> ${aa } ${pageScope.aa } ${sessionScope.user!=null } <br/>----------------获取保存了所有请求参数的Map对象-------------------------<br/> ${param.name } ${paramValues.name[0] } ${paramValues.name[1] } <br/>----------------获取请求头-------------------------<br/> ${header[‘Accept-Language‘] } <br/>---------------获取cookie-------------------------<br/> ${cookie.JSESSIONID.name }<br/> ${cookie.JSESSIONID.value } ${initParam.xx } </body></html>
EL函数:EL表达式调用java类的方法
EL表达式语法允许开发人员开发自定义函数,以调用Java类的方法。
示例:${prefix:method(params)}
在EL表达式中调用的只能是Java类的静态方法。
这个Java类的静态方法需要在TLD文件中描述,才可以被EL表达式调用。
EL自定义函数用于扩展EL表达式的功能,可以让EL表达式完成普通Java程序代码所能完成的功能。
注意:虽然EL函数与自定义标签一样,都可以移除jsp中的java代码,但是EL函数无法移除与web相关的方法,如request,session等,因为没有pageContext传进来。
一般来说, EL自定义函数开发与应用包括以下三个步骤:
1. 编写一个Java类的静态方法
2. 编写标签库描述符(tld)文件,在tld文件中描述自定义函数。
3. 在JSP页面中导入和使用自定义函数
public class MyEL { //el函数 public static String filter(String message) { if (message == null) return (null); char content[] = new char[message.length()]; message.getChars(0, message.length(), content, 0); StringBuffer result = new StringBuffer(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()); } public static String add(String s1,String s2){ return s1 + s2; }}
xx.tld
<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>A tag library exercising SimpleTag handlers.</description> <tlib-version>1.0</tlib-version> <short-name>SimpleTagLibrary</short-name> <uri>/my</uri> <function> <name>filter</name> <function-class>cn.itcast.demo.MyEL</function-class> <function-signature>java.lang.String filter( java.lang.String )</function-signature> 方法声明 </function> <function> <name>add</name> <function-class>cn.itcast.demo.MyEL</function-class> <function-signature>java.lang.String add( java.lang.String,java.lang.String )</function-signature> </function></taglib>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@taglib uri="/my" prefix="my" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>My JSP ‘4.jsp‘ starting page</title> </head> <body> ${my:filter("<a href=‘‘>点点</a>") } </body></html>
EL函数注意事项:
1. 编写完标签库描述文件后,需要将它放置到<web应用>\WEB-INF目录中或WEB-INF目录下的除了classes和lib目录之外的任意子目录中。
2. TLD文件中的<uri> 元素用指定该TLD文件的URI,在JSP文件中需要通过这个URI来引入该标签库描述文件。
3. <function>元素用于描述一个EL自定义函数,其中:
<name>子元素用于指定EL自定义函数的名称。
<function-class>子元素用于指定完整的Java类名,
<function-signature>子元素用于指定Java类中的静态方法的签名,方法签名必须指明方法的返回值类型及各个参数的类型,各个参数之间用逗号分隔。
EL表达式是JSP 2.0规范中的一门技术 。因此,若想正确解析EL表达式,需使用支持Servlet2.4/JSP2.0技术的WEB服务器。
注意:有些Tomcat服务器如不能使用EL表达式
(1)升级成tomcat6
(2)在JSP中加入<%@ page isELIgnored="false" %>
JSTL中的常用EL函数
由于在JSP页面中显示数据时,经常需要对显示的字符串进行处理,SUN公司针对于一些常见处理定义了一套EL函数库供开发者使用。
这些EL函数在JSTL开发包中进行描述,因此在JSP页面中使用SUN公司的EL函数库,需要导入JSTL开发包,并在页面中导入EL函数库,如下所示:
在页面中使用JSTL定义的EL函数:
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
fn:toLowerCase("Www.IT315.org") 的返回值为字符串“www.it315.org”
fn:toLowerCase("")的返回值为空字符串
fn:toUpperCase("Www.IT315.org") 的返回值为字符串“WWW.IT315.ORG”
fn:toUpperCase("")的返回值为空字符串
fn:trim(" www.it315.org ") 的返回值为字符串“www.it 315.org”。
fn:split("www.it315.org", ".")[1]的返回值为字符串“it315”。
fn:substring("www.it315.org", 4, 9) 的返回值为字符串“it315”
等等。。。。
EL表达式