EL表达式
EL的基本语法
EL的基本语法很简单,它以“${”开头,以“}”结束,中间为合法的表达式。其语法格式如下:
1 | ${expression} |
expression指定要输出的内容,可以是字符串或EL运算符组成的表达式。
由于EL表达式的语法以“${”开头,所以如果在JSP网页中要显示“${”字符串,必须在前面加上\符号。即${,或者写成${‘ ${‘ },就是用表达式来输出“${”符号串。
在EL中要输出一个字符串,可以将其放在一对单引号或双引号内。
EL的特点
EL除了具有语法简单和使用方便的特点之外,还具有以下特点。
(1)可以与JSTL及JavaScript语句结合使用。
(2)自动执行类型转换。如果想通过EL输入两个字符串型数值(如number1和number2)的和,可以通过+号连接(如${number1+number2})。
(3)不仅可以访问一般变量,而且还可以访问JavaBean中的属性,以及嵌套属性和集合对象。
(4)可以执行算术运算、逻辑运算、关系运算和条件运算等。
(5)可以获得命名空间(PageContext对象,它是页面中所有其他内置对象的最大范围的集成对象,通过它可以访问其他内置对象)。
(6)在执行除法运算时,如果0作为除数,则返回无穷大Infinity,而不返回错误。
(7)可以访问JSP的作用域(request、session、application及page)。
(8)扩展函数可以与Java类的静态方法执行映射。
禁用EL
使用斜杠“\”符号
该方法只需在EL的开始标记“${”前加上“\”符号,其语法格式如下:
1 | \${expression} |
该方法仅适合禁用页面中一个或多个EL表达式的情况。
使用page指令
使用JSP的page指令也可以禁用EL,其语法格式如下:
1 | <%@ page isELIgnored="布尔值" %> |
isELIgnored属性指定是否禁用页面中的EL,如果为true,则忽略页面中的EL;否则将解析页面中的EL。
该方法适合禁用一个JSP页面中的EL。
在web.xml文件中配置元素
在web.xml文件中配置
1 | <jsp-config> |
该方法适用于禁用Web应用中所有JSP页面中的EL。
保留关键字
EL有保留关键字,在为变量命名时应该避免使用这些关键字,包括在使用EL输出已经保存在作用域范围内的变量。如果已经定义,那么需要将其修改为其他变量名。EL的保留关键字如表1所示。
EL运算符及其优先级
EL提供了访问数据运算符、算术运算符、关系运算符、逻辑运算符、条件运算符及empty运算符等,其优先级如图所示。
运算符的优先级决定了在多个运算符同时存在时各个运算符的求值顺序,同级运算符采用从左向右计算的原则。
使用括号“()”可以改变优先级,如${5/(9-6)}改变了先乘除且后加减的基本规则,这是因为括号内的优先级高于绝大部分的运算符。在复杂的表达式中使用括号可以使表达式更容易阅读且避免出错。
通过EL访问数据
通过EL提供的 [] 和 . 运算符可以访问数据,通常情况下二者是等价的,可以相互代替。例如,要访问JavaBean对象userInfo的id属性,可以写成以下两种形式:
1 | ${UserInfo.id} |
但在有些情况下不可相互替代,如当对象的属性名中包括一些特殊符号(-或.)时,只能使用[]运算符来访问对象的属性。例如,${userInfo[user-id]}是正确的,而${userInfo.user-name}则是错误的;另外,EL的[]运算符还可以用来读取数组或是List集合中的数据。
应用[]运算符可以获取数组的指定元素,但是 . 运算符则不能。例如,要获取request范围中的数组arrBook中的第1个元素,可以使用以下EL表达式:由于数组的索引值从0开始,所以要获取第1个元素,需要使用索引值0。
1 | ${arrBook[0]} |
在EL中执行算术运算
EL提供了加、减、乘、除和求余5种算术运算符,如表2所示。
EL的+运算符不能连接两个字符串,如果用其连接两个不可以转换为数值型的字符串,将抛出异常;如果连接两个可以转换为数值型的字符串,则自动将这两个字符串转换为数值型后执行加法运算。
在EL中判断对象是否为空
在EL中判断对象是否为空可以使用empty运算符,该运算符是一个前缀(prefix)运算符。即其位于操作数前,用来确定一个对象或变量是否为null或空。该运算符的语法格式如下:
1 | ${empty expression} |
expression用于指定要判断的变量或对象。
另外,empty运算符也可以与not运算符结合使用,用于判断一个对象或变量是否为非空。
1 | ${not empty expression} |
在EL中执行逻辑关系运算
(1)关系运算符
在EL中提供了6种关系运算符,不仅可以用来比较整数和浮点数,还可以用来比较字符串。其使用格式如下:
1 | ${表达式1 关系运算符 表达式2} |
这些关系运算符如表3所示。
(2)逻辑运算符
在执行比较运算时,如果涉及两个或两个以上的条件判断(例如,要判断变量a是否大于等于60,并且小于等于80),则需要应用逻辑运算符。其条件表达式的值必须是boolean型或可以转换为boolean型的字符串,并且返回的结果也是boolean型。
EL的逻辑运算符如表4所示。
在执行逻辑运算时,只要表达式的值可以确定,则停止执行。例如,在表达式A and B and C中,如果A为true且B为false,则只计算A and B并返回false;在表达式A or B or C中,如果A为true且B为false,则只计算A or B,并返回ture。
在EL中执行条件运算
在EL中执行简单的条件运算可以通过条件运算符实现它的惟一优点是简单和方便,其语法格式如下:
1 | ${条件表达式?表达式1:表达式2} |
(1)条件表达式:用于指定一个条件表达式,其值为boolean型,可以由关系运算符、逻辑运算符和empty运算符组成。
(2)表达式1:用于指定当条件表达式的值为true时,将要返回的值。
(3)表达式2:用于指定当条件表达式的值为false时,将要返回的值。
在上面的语法格式中,如果条件表达式为true,则返回表达式1的值;否则返回表达式2的值。
EL的隐含对象
为了能够获得Web应用程序中的相关数据,EL提供了11个隐含对象。这些对象类似JSP的内置对象,直接通过对象名操作。在EL的隐含对象中,除PageContext是JavaBean对象,对应于javax.servlet.jsp.PageContext类型,其他隐含对象均对应于java.util.Map类型。这些隐含对象可以分为页面上下文对象、访问作用域范围的隐含对象和访问环境信息的隐含对象。
页面上下文对象
页面上下文对象为pageContext,用于访问JSP内置对象(如request、response、out、session、exception和page等,但不能用于获取application、config和pageContext对象)和servletContext。在获取这些内置对象后,即可获取其属性值。这些属性与对象的getXXX()方法相对应,在使用时去掉方法名中的get,并将首字母改为小写即可。
(1)访问request对象
通过pageContext获取JSP内置对象中的request对象,可以使用下面的语句:
1 | ${pageContext.request} |
获取request对象后,即可通过该对象获取与客户端相关的信息。例如,HTTP报头信息、客户信息提交方式、客户端主机IP地址和端口号等。
不可通过pageContext对象获取保存在request范围内的变量。
(2)访问response对象
通过pageContext获取JSP内置对象中的response对象可以使用下面的代码:
1 | ${pageContext.response} |
获取response对象后,即可通过该对象获取与响应相关的信息。例如,响应的内容类型。要获取响应的内容类型,可以使用下面的代码:
1 | ${pageContext.response.contentType} |
(3)访问out对象
通过pageContext获取JSP内置对象中的out对象可以使用下面的代码:
1 | ${pageContext.out} |
获取out对象后,即可通过该对象获取与输出相关的信息。例如,输出缓冲区的大小可以使用下面的代码:
1 | ${pageContext.out.bufferSize} |
(4)访问session对象通过pageContext获取JSP内置对象中的session对象可以使用下面的代码:
1 | ${pageContext.session} |
获取session对象后,即可通过该对象获取与session相关的信息。例如,要获取session的有效时间可以使用下面的代码:
1 | ${pageContext.session.maxInactiveInterval} |
(5)访问exception对象通过pageContext获取JSP内置对象中的exception对象可以使用下面的代码:
1 | ${pageContext.exception} |
获取exception对象后,即可通过该对象获取JSP页面的异常信息。例如,获取异常信息字符串,可以使用下面的代码:
1 | ${pageContext.exception.message} |
在使用该对象时,也需要在可能出现错误的页面中指定错误处理页。并且在其中指定page指令的isErrorPage属性值为true,然后使用上面的EL输出异常信息。
(6)访问page对象
通过pageContext获取JSP内置对象中的page对象可以使用下面的代码:
1 | ${pageContext.page} |
获取page对象后,即可通过该对象获取当前页面的类文件,代码如下:
1 | ${pageContext.page.class} |
(7)访问servletContext对象
通过pageContext获取servletContext对象可以使用下面的代码:
1 | ${pageContext.servletContext} |
获取servletContext对象后,即可通过该对象获取servlet上下文信息。例如,获取servlet上下文路径的代码如下:
1 | ${pageContext.servletContext.contextPath} |
访问作用域范围的隐含对象
在EL中提供了4个用于访问作用域范围的隐含对象,即pageScope、requestScope、sessionScope和applicationScope。应用这4个隐含对象指定要查找标识符的作用域后,系统将不再按照默认的顺序(page、request、session及application)来查找相应的标识符。它们与JSP中的page、request、session及application内置对象类似,只不过这4个隐含对象只能用来取得指定范围内的属性值,而不能取得其他相关信息。
在EL中可以访问作用域范围中的如下隐含对象。
(1)requestScope隐含对象
requestScope隐含对象用于返回包含request(请求)范围内的属性值的集合,返回值为java.util.Map对象。例如,要获取保存在request范围内的userName变量可以使用下面的代码:
1 | <% request.setAttribute("userName","mr") %> |
(2)sessionScope隐含对象
sessionScope隐含对象用于返回包含session(会话)范围内的属性值的集合,返回值为java.util.Map对象。例如,要获取保存在session范围内的manager变量可以使用下面的代码:
1 | <% session.setAttribute("manager","mr") %> |
3)applicationScope隐含对象
applicationScope隐含对象用于返回包含application(应用)范围内的属性值的集合,返回值为java.util.Map对象。例如,要获取保存在application范围内的message变量可以使用下面的代码:
1 | <% application.setAttribute("message","欢迎光临") %> |
访问环境信息的隐含对象
在EL中提供了如下6个访问环境信息的隐含对象。
(1)param对象
param对象用于获取请求参数的值,应用在参数值只有一个的情况。该对象的返回结果为字符串。例如,在JSP页面中放置一个名为“user”的文本框,关键代码如下:
1 | <input name="name" type="text"> |
当提交表单后要获取name文本框的值,可以使用下面的代码:
1 | ${param.name} |
(2)paramValues对象
如果一个请求参数名对应多个值时,则需要使用paramValues对象获取请求参数的值,该对象的返回结果为数组。例如,在JSP页面中放置一个名为“affect”的复选框组,关键代码如下:
1 | <input name="affect" type="checkbox" id="affect" value="慢跑"> |
当提交表单后,要获取affect的值可以使用下面的代码:在应用param和paramValues对象时,如果指定的参数不存在,则返回空的字符串,而不是null。
1 | <% request.setCharacterEncoding("GB18030"); %> |
(3)header和headerValues对象
header对象用于获取HTTP请求的一个具体header值,在有些情况下可能存在同一个header拥有多个不同值,这时必须使用headerValues对象。
例如,要获取HTTP请求的header的connection(是否需要持久连接)属性可以使用以下代码:
1 | ${header.connection}或${header["connection"]} |
(4)initParam对象
initParam对象用于获取Web应用初始化参数的值,如在Web应用的web.xml文件中设置一个初始化参数author用于指定作者,代码如下:
1 | <context-param> |
应用EL获取参数author的代码如下:
1 | ${initParam.author} |
(5)cookie对象
虽然在EL中并没有提供在cookie中保存值的方法,但是它提供了访问由请求设置的cookie的方法,可以通过cookie隐含对象实现。如果在cookie中已经设置一个名为“username”的值,那么可以使用${cookie.username}来获取该cookie对象。如果要获取cookie中的值,则需要使用该对象的value属性。
例如,使用response对象设置一个请求有效的cookie对象。然后使用EL获取该cookie对象的值,代码如下:
1 | <%Cookie cookie=new Cookie("user","asd"); |
定义和使用EL函数
定义和使用函数
定义和使用函数包括以下3个步骤。
(1)编写一个Java类,并在其中编写公用的静态方法,用于实现自定义EL函数的具体功能。
(2)编写标签库描述文件声明函数,该文件的扩展名为“.tld”,保存在Web应用的WEB-INF文件夹下。
(3)在JSP页面中引用标签库,并调用定义的EL函数实现相应的功能。