EL表达式
EL(Expression Language):EL是一种表达式语言(访问作用域对象、获取对象属性的值,执行简单的运算)
JSP2.0后作为JSP规范的一部分(早期包含在JSTL中)
语法: expr。如: e x p r 。 如 : {user.name}、 user[′name′]、 u s e r [ ′ n a m e ′ ] 、 {2+3}。不能调用对象的方法。
除了用.方式获得对象的属性,也可以用[ ]方式,当然遇到键值名字中有-的,如mike-abc,或者key值为数字开头,则只能用[ ]方式。
保留字
and、or、not
eq(等于)、ne(不等)、gt(大于)、ge(大于等于)、lt(小于)、le(小于等于)
true、false
instanceof、empty、null
mod、div
EL中的运算符
算术运算符
加(+)减(-)乘(*)除(/)、取模(mod)
关系运算符
eq(==)、ne(!=)、gt(>)、ge(>=)、lt(<)、le(<=)
逻辑运算符
not(!)、and(&&)、or(||)
empty判断为null或者为空(A不存在则${empty A}为true)
EL中的函数
函数的定义和使用分为以下3个步骤:
(1)编写一个Java类,并在该类中编写公用(public)的静态(static)方法,用于实现自定义EL函数的具体功能。
(2)编写标签库描述文件,对函数进行声明。该文件的扩展名为.tld,被保存到Web应用的WEB-INF文件夹下。
(3)在JSP页面中引用标签库,并调用定义的EL函数,实现相应的功能。
示例
定义
编写一个Java类,名称为StringDeal,将其保存在com.el包中,在该类中添加一个公用的静态方法shiftEnter(),在该方法中替换输入字符串中的回车换行符
,空格符为 ;,最后返回新替换后的字符串。StringDeal类的完整代码如下:package com.el; public class StringDeal { public static String shiftEnter(String str){ //定义公用的静态方法 String newStr = str.replaceAll("\r\n", "<br>"); //替换回车换行符 newStr = str.replaceAll(" ", " "); //替换空格符 return newStr; } }
编写标签
编写标签库描述文件,名称为stringDeal.tld,并将其保存到WEB-INF文件夹下。关键代码如下:
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2<jsp-version> <uri>http://com.el/myfun</uri> <function> <name>shiftEnter</name> <function-class> com.el.StringDeal </function-class> <function-signature> java.lang.String shiftEnter(java.lang.String) </function-signature> </function> </taglib>
参数说明:
< uri >标记:用于指定tld文件的映射路径。在应用EL函数时,需要使用该标记指定的内容。
< name >标记:用于指定EL函数说对应方法的方法名,通常与Java文件中方法名相同。
< function-class >标记:用于指定EL函数所对应的Java文件,这里需要包括包名和类名,例如,上面的的代码中,包名为com.el,类名为StringDeal。
< function-signature >标记:用于指定EL函数所对应的静态方法,这里包括返回值的类型和入口参数的类型。在指定这些类型时,需要使用完整的类型名。
调用
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="f" uri="http://com.el/myfun" %> <%request.setCharacterEncoding("UTF-8"); %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>显示结果</title> </head> <body> 内容为:<br> ${f:shiftEnter("一个简单的EL测试")} </body> </html>
访问隐式对象
pageContext
通过pageContext来获取ServletContext、request、response、session等对象。
格式:${pageContext.request.locale}
<%-- 此种方式不能访问 --%> ${request }<br/> <%-- 可以访问,输出当前设置的地区zh_CN或en等 --%> ${pageContext.request.locale }</br> <%-- 获取当页面的上下文的路径 --%> ${pageContext.servletContext.contextPath }
- 获取request中用户请求的值:${param.name}
例如通过URL传参或者表单提交,在JSP页面获取参数,这种参数不是通过request.setAttribute()方法设置的。
${param.name }<br/> ${param['user-pwd'] }
- 获取请求头信息:${headers[‘Content-Type’]}
user-agent: <%=request.getHeader("user-agent") %><br/> user-agent: ${header['user.agent'] }
- 获取cookie的值:${cookie.cookieName.value}
<% Cookie cookie=new Cookie("cookietest", "123456"); response.addCookie(cookie); %> <%-- 获取cookie --%> JSESSIONID: ${cookie.JSESSIONID.value }<br/> cookie: ${cookie.cookietest.value }
- 获取context-param:${initParam.name},获取为整个web应用配置的初始化参数
/*在web.xml中配置*/ <context-param> <param-name>test</param-name> <param-value>Context Param!</param-value> </context-param> <%-- 获取 --%> Context-param: ${initParam.test }
获取隐式作用域对象中的属性
属性名称(下面的user)都是通过setAttribute方法设置
${user.name}:按照pageScope、requestScope、sessionScope、applicationScope的顺序查找。
其中user是通过隐式对象的setAttribute方法添加的属性,可以是一个类,而name可以是这个类的一个属性,并不是必须的,实际上,获取name属性时调用的是user类的一个getName()方法,即我们要取的属性名(name)将其首字母大写再在前面加get单词,user里需要有这个方法,具体可参考JavaBean。或者可以直接使用user类的方法来调用属性(${user.getName() })。
${pageScope.uesr.name}:只在pageContext中查找
如果没有查找到,则都返回空