EL表达式
EL表达式的作用
EL用于在不使用脚本、声明、表达式的情况下,在JSP页面中渲染数据
EL使用位置
不能用在指令中,指令在编译时候执行,EL在页面渲染时执行
如:<%@ include%>、<%@ page%>等
可用在HTML、JSP标签、JS、CSS中
EL语法
1.立即执行->在页面渲染时被JSP引擎解析执行(JSP自上而下执行)
${expr}
2.延迟执行->在JSF中使用,在JSP中合法,但是不推荐使用
#{expr}
EL表达式要在执行后产生某个值,不能在表达式中声明变量、执行赋值语句
保留关键字
true、false、null、instanceof->和Java中的关键字意思一样
empty->空返回真;非空返回假 ${empty x}
括号里是对应的操作符,可以替换使用
div( / )、mod( % )、and( && )、or( || )、not( ! )、eq( == )、ne ( != )、It( < )、gt ( > )、le( <= )、ge ( >= )
操作符优先级(自上而下)
字面量
EL中字符串字面量可以用 ' 或 '' 引起来
HashSet<Object>字面量:${ object.method({1,2,'three',4.00,x}) },Set中的元素用 {} 引起来
ArrayList<Object>字面量:${ object.method([1,2,'three',4.00,x]) },List中的元素用 [] 引起来
HashMap<Object,Object>字面量:${ object.method({'one':1,'two':2,'three':x,'list':[1,2.3]}) },Map中的元素用{}引起来
对象属性和方法
Student类,有一个student变量,有一个num属性,num属性提供set、get方法
可以使用${student.num}访问num属性,实际上是调用的getNum()方法
可以使用${student["num"]}访问num属性
可以直接调用对象的方法,${student.toString()}
静态字段、静态方法的访问->lang包下使用类名,其他包使用JSP的page指令导入包或者写出全限定类名
${Integer.MAX_VALUE},访问Integer类中的静态字段MAX_VALUE
${Integer.reverse(24)},访问Integer类中的静态方法reverse
lambla表达式->同java中的用法一致
${v = (a,b)->a+b;v(3,15)},最后的值是18
EL表达式中的作用域变量
JSP中的9个隐式变量:request、response、session、out、application、config、pageContext、page、exception
EL中的11个隐式变量:pageContext、pageScope、requestScope、sessionScope、applicationScope、param、paramValues、header、headerValues、cookie、initParam
隐含对象 | 类型 | 说明 |
PageContext | javax.servlet.ServletContext | 表示此JSP的PageContext |
PageScope | java.util.Map | 取得Page范围的属性名称所对应的值 |
RequestScope | java.util.Map | 取得Request范围的属性名称所对应的值 |
sessionScope | java.util.Map | 取得Session范围的属性名称所对应的值 |
applicationScope | java.util.Map | 取得Application范围的属性名称所对应的值 |
param | java.util.Map | 如同ServletRequest.getParameter(String name)。返回String |
paramValues | java.util.Map | 如同ServletRequest.getParameterValues(String name)。返回String[] |
header | java.util.Map | 如同ServletRequest.getHeader(String name)。返回String |
headerValues | java.util.Map | 如同ServletRequest.getHeaders(String name)。返回String[] |
cookie | java.util.Map | 如同HttpServletRequest.getCookies() |
initParam | java.util.Map | 如同ServletContext.getInitParameter(String name)。返回String |
EL解析变量的顺序
1.检查是否隐式变量
2.如果不是隐式变量,EL按照pageContext.getAttribute()、HttpServletRequest.getAttribute()、HttpSession.getAttribute()、ServletContext.getAttribute()的顺序检查是否有符合条件的变量名
3.如果仍未找到,则报错
集合的访问
Map,有一个map引用
${map.username} 或 ${map["username"]}
List,有一个list引用
${list[0]},注意${list.0}是错误的
EL中同样可以使用流操作,只要EL变量是Java数组或者Collection实例,但是不推荐在JSP中这样做