EL表达式
-
EL表达式的作用
EL表达式主要是代替jsp页面中的表达式脚本,在jsp页面中进行数据的输出,EL表达式在输出数据的时候简洁的多
-
如何使用
EL表达式的规则是:${表达式}
EL<body> <% request.setAttribute("key","value"); %> <%-- 如果在域对象中查不到所对应key的数据,jsp会返回null,而EL返回空(什么都不显示) --%> jsp表达式写法:<%=request.getAttribute("key")%><br/> EL表达式写法:${key} </body>
-
EL表达式搜索域对象时的顺序
我们发现我们在使用EL表达式是,内容单单写一个key值即可,那么就会思考,四大域对象,如果都有相同的key值,会调用哪一个呢?
我们通过测试以下代码可以发现,最先调用最小的域对象中的值
<body> <% pageContext.setAttribute("key","pageContext"); request.setAttribute("key","request"); session.setAttribute("key","session"); application.setAttribute("key","application"); %> ${key} </body>
-
EL表达式的更多用法
创建一个person类,定义他的一些属性,数组类型、list类型、map类型。
public class Person { private String name; private String[] phone; private List<String> cities; private Map<String,String> map; public Integer getAge() { return 18; } //因代码太长看起来不方便,getset,构造器,tostring方法就不写出来了 }
我们创建一个测试类,通过点运算的方式可以调用他的某一属性。name,phone,cities,map都不难理解,而age属性没有在person类中定义,只定义了getAge方法,也可以显示出来。这说明了,EL表达式来person中查找数据时,找的是get方法,而不是他定义的属性
<body> <% Person person = new Person(); person.setName("Tom"); person.setPhone(new String[]{"13388886666","13599998888","13666677777"}); List<String> list = new ArrayList<>(); list.add("上海"); list.add("北京"); list.add("浙江"); person.setCities(list); Map<String,String> map = new HashMap<>(); map.put("key1","value1"); map.put("key2","value2"); map.put("key3","value3"); person.setMap(map); request.setAttribute("person",person); %> 输出person对象:${person}<br/> 输出person对象中name属性:${person.name}<br/> 输出person对象中数组的指定属性:${person.phone[0]}<br/> 输出person对象中list某个对象属性:${person.cities[0]}<br/> 输出person对象中map对象属性:${person.map}<br/> 输出person对象中map指定对象属性:${person.map.key1}<br/> 输出未定义的age属性:${person.age}<br/> </body>
-
EL表达式的运算
关系运算、逻辑运算、算数运算、三元运算都跟Java中一样,主要介绍一下两种运算方式
-
empty运算 例如:${empty 对象}
empty运算可以判断一个数值是否为空,为空的时候返回true,否则返回false
以下几种情况为空
- 值为null的时候
- 值为空字符串的时候
- 值是Object类型数组,且长度为0时
- list集合中,元素个数为0时
- map集合中,元素个数为0时
-
点运算 例如:&{map.key1}
点运算,可以输出Bean对象中的某个属性的值
-
中括号运算
可以输出有序集合中某个元素的值(使用方法相当于下标)
可以输出map集合中key里含有特殊字符的值 例如:${map[‘a.a.a’]}
-
-
EL表达式中11个隐含对象
- pageContext:可以获取jsp中的9大内置对象
- pageScope:可以获取pageContext域中的数据
- requestScope:可以获取request域中的数据
- sessionScope:可以获取Session域中的数据
- applicationScope:可以获取ServletContext域中的数据
- param:可以获取请求参数的值
- paramValues:可以获取请求参数的值,当一个key有多个value时使用
- header:可以获取请求头的值
- hesderValues:获取请求头的值,当一个key有多个value时使用
- cookie:可以获取当前请求的cookie信息
- initParam:可以获取web.xml中配置的上下文参数
四大域对象的使用方法
<% pageContext.setAttribute("key","pageContext"); request.setAttribute("key","request"); session.setAttribute("key","session"); application.setAttribute("key","application"); %> pageContext:${pageScope.key}<br/> request:${requestScope.key}<br/> session:${sessionScope.key}<br/> application:${applicationScope.key}<br/>
pageContext对象的常用方法
<body> 1. 协议:${pageContext.request.scheme}<br> 2. 服务器 ip:${pageContext.request.serverName}<br> 3. 服务器端口:${pageContext.request.serverPort}<br> 4. 获取工程路径:${pageContext.request.contextPath}<br> 5. 获取请求方法:${pageContext.request.method}<br> 6. 获取客户端 ip 地址:${pageContext.request.remoteHost}<br> 7. 获取会话的 id 编号:${pageContext.session.id}<br> </body>