EL(表达式语言)
1、EL概述
EL是JSP内置的表达式语言!
* jsp2.0开始,不让再使用java脚本,而是使用el表达式和动态标签来替代java脚本!
* EL替代的是<%= ... %>,也就是说,EL只能做输出!
1.1、EL的作用
JSP2.0要把html和css分离、要把html和javascript分离、要把Java脚本替换成标签。标签的好处是非Java人员都可以使用。
JSP2.0 – 纯标签页面,即:不包含<% … %>、<%! … %>,以及<%= … %>
1.2、EL的格式
格式:${…}
例如:${1 + 2}
1.3、关闭EL
如果希望整个JSP忽略EL表达式,需要在page指令中指定isELIgnored=”true”。
如果希望忽略某个EL表达式,可以在EL表达式之前添加“\”,例如:\${1 + 2}。
1.4、EL运算符
运算符 | 说明 | 范例 | 结果 |
+ | 加 | ${17+5} | 22 |
- | 减 | ${17-5} | 12 |
* | 乘 | ${17*5} | 85 |
/或div | 除 | ${17/5}或${17 div 5} | 3 |
%或mod | 取余 | ${17%5}或${17 mod 5} | 2 |
==或eq | 等于 | ${5==5}或${5 eq 5} | true |
!=或ne | 不等于 | ${5!=5}或${5 ne 5} | false |
<或lt | 小于 | ${3<5}或${3 lt 5} | true |
>或gt | 大于 | ${3>5}或${3 gt 5} | false |
<=或le | 小于等于 | ${3<=5}或${3 le 5} | true |
>=或ge | 大于等于 | ${3>=5}或${3 ge 5} | false |
&&或and | 并且 | ${true&&false}或${true and false} | false |
!或not | 非 | ${!true}或${not true} | false |
||或or | 或者 | ${true||false}或${true or false} | true |
empty | 是否为空 | ${empty “”},可以判断字符串、数据、集合的长度是否为0,为0返回true。empty还可以与not或!一起使用。${not empty “”} | true |
1.5、EL不显示null
当EL表达式的值为null时,会在页面上显示空白,即什么都不显示。
2、EL表达式格式
先来了解一下EL表达式的格式!现在还不能演示它,因为需要学习了EL11个内置对象后才方便显示它。
* 操作List和数组:${list[0]}、${arr[0]};
* 操作bean的属性:${person.name}、${person[‘name’]},对应person.getName()方法;
* 操作Map的值:${map.key}、${map[‘key’]},对应map.get(key)。
如果在域中保存的是JavaBean对象,那么可以使用EL来访问JavaBean属性。因为EL只做读取操作,
所以JavaBean一定要提供get方法,而set方法没有要求。
3、EL内置对象
EL一共11个内置对象,无需创建即可以使用。这11个内置对象中有10个是Map类型的,最后一个是pageContext对象。
* pageScope
* requestScope
* sessionScope
* applicationScope
* param;
* paramValues;
* header;
* headerValues;
* initParam;
* cookie;
* pageContext;
3.1、域相关内置对象(重点)
域内置对象一共有四个:
* pageScope:${pageScope.name} 等同于 pageContext.getAttribute("name");
* requestScope:${requestScope.name} 等同于 request.getAttribute("name");
* sessionScoep: ${sessionScope.name} 等同于 session.getAttribute("name");
* applicationScope:${applicationScope.name} 等同于 application.getAttribute("name");
EL表达式来读取四大域
* ${xxx},全域查找名为xxx的属性,如果不存在,输出空字符串,而不是null。
* ${pageScope.xxx}、${requestScope.xxx}、${sessionScope.xxx}、${applicationScope.xxx},指定域获取属性!
全域查找:${xxx}表示依次在pageScope、requesScopet、sessionScope、appliationScope四个域中查找名字为person的属性。
3.2、param 和 paramValues:请求参数相关内置对象
* param:Map<String,String>类型,param对象可以用来获取参数,与request.getParameter()方法相同。
注意,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。这一点与使用request.getParameter()方法是不同的。
${param.username }
* paramValues:paramValues是Map<String, String[]>类型,当一个参数名,对应多个参数值时可以使用它。
${paramValues.hobby[0] }
${paramValues.hobby[1] }
3.3、header 和 headerValues :请求头相关内置对象
* header: Map<String,String>类型,用来获取请求头。
${header['User-Agent']}
* headerValues:headerValues是Map<String,String[]>类型。当一个请求头名称,对应多个值时,使用该对象,这里就不在赘述。
3.4、initParam:应用初始化参数相关内置对象
* initParam:initParam是Map<String,String>类型。它对应web.xml文件中的<context-param>参数。
<context-param>
<param-name>yyy</param-name>
<param-value>YYY</param-value>
</context-param>
${initParam.yyy}
3.5、Cookie相关内置对象
* cookie:cookie是Map<String,Cookie>类型,其中key是Cookie的名字,而值是Cookie对象本身。
${cookie.JSESSIONID.value }、${cookie.JSESSIONID.name }
3.6、pageContext对象
pageContext:pageContext是PageContext类型!可以使用pageContext对象调用getXXX()方法,
${pageContext.request.contextPath}常用的动态获得项目路径,如:/day12_1
例如方法 pageContext.getRequest() 等同于 ${pageContext.request}。也就是读取JavaBean属性!!!
EL表达式 | 说明 |
${pageContext.request.queryString} | pageContext.getRequest().getQueryString(); |
${pageContext.request.requestURL} | pageContext.getRequest().getRequestURL(); |
${pageContext.request.contextPath} | pageContext.getRequest().getContextPath(); |
${pageContext.request.method} | pageContext.getRequest().getMethod(); |
${pageContext.request.protocol} | pageContext.getRequest().getProtocol(); |
${pageContext.request.remoteUser} | pageContext.getRequest().getRemoteUser(); |
${pageContext.request.remoteAddr} | pageContext.getRequest().getRemoteAddr(); |
${pageContext.session.new} | pageContext.getSession().isNew(); |
${pageContext.session.id} | pageContext.getSession().getId(); |
${pageContext.servletContext.serverInfo} | pageContext.getServletContext().getServerInfo(); |
例:
AServlet:
Address address = new Address();
address.setCity("北京");
address.setStreet("西三旗");
Employee emp = new Employee();
emp.setName("李小四");
emp.setSalary(123456);
emp.setAddress(address);
request.setAttribute("emp", emp);
request.getRequestDispatcher("/day12_1/a.jsp").forward(request,response);
------------------------------------------
页面获取:
<h3>使用el获取request域的emp</h3>
${requestScope.emp.address.street }
<!-- 等同于内置对象获得 request.getAttribute("emp").getAddress().getStreet() --><br/>