EL表达式概述
EL的作用
EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。
最终目的 即:JSP不包含<% … %>、<%! … %>,以及<%= … %>
EL(Expression Language)是一门表达式语言,它对应JSP中<%=…%>。我们知道在JSP中,<%=…%>表达式会被输出,所以EL表达式也会被输出。
EL表达式基本用法
EL表达式的格式
格式:${}
关闭EL表达式
如果希望整个JSP忽略EL表达式,需要在page指令中指定isELIgnored=”true”。该属性默认为fasle,表示支持EL表达式。
如果希望忽略某个EL表达式,可以在EL表达式之前添加“\”,例如:${1 + 2}。
EL基本运算符
运算符 | 说明 | 范例 | 结果 |
---|---|---|---|
+ | 加 | ${1+2} | 3 |
- | 减 | ${2-1} | 1 |
* | 乘 | ${3*2} | 6 |
/或div | 除 | ${17/5} | 3 |
%或mod | 取余 | ${17 mod 5} | 2 |
==或eq | 等于 | ${5 eq 5} | true |
!=或ne | 不等于 | ${5ne5} | false |
<或it | 小于 | ${5<3} | false |
gt或> | 大于 | ${5>3} | true |
<=或le | 小于等于 | ${3<=5} | true |
ge或>= | 大于等于 | ${3》=5} | false |
&&或and | 且 | ${true&&true} | true |
双竖线或or | 或 | ${false or true} | true |
!或not | 非 | ${!true} | false |
empty | 是否为空 | ${empty “”} | true |
a>b?1:2 | 条件运算符 | ${a>b?true;false} |
其中${empty ""}
,可以判断字符串、数据、集合的长度是否为0,为0返回true。empty还可以与not或!一起使用。${not empty “”}
EL不显示null
当EL表达式的值为null时,会在页面上显示空白,即什么都不显示。
EL表达式操作数组,对象属性和Map
- 操作List和数组:
${list[0]}、${arr[0]}
; - 操作bean的属性:
${person.name}、${person[‘name’]},
对应person.getName()方法; - 操作Map的值:
${map.key}、${map.value}、${map[‘key’]}
,对应map.get(key)。
EL内置对象
EL一共11个内置对象,无需创建即可以使用。这11个内置对象中有10个是Map类型的,最后一个是pageContext对象。
* pageScope(注意:pageContext)
* requestScope
* sessionScope
* applicationScope
* param;
* paramValues;
* header;
* headerValues;
* initParam;
* cookie;
* pageContext。
域相关内置对象
域内置对象一共有四个:
* pageScope:
pageScope.name等同与pageContext.getAttribute(“name”);∗requestScope:
{requestScope.name}等同与request.getAttribute(“name”);
* sessionScope:
sessionScope.name等同与session.getAttribute(“name”);∗applicationScope:
{applicationScope.name}等同与application.getAttribute(“name”)。
如果在域中保存的是JavaBean对象,那么可以使用EL来访问JavaBean属性。因为EL只做读取操作,所以JavaBean一定要提供get方法,而set方法没有要求。
定义一个JavaBean类Person.java
public class Person {
private String name;
private int age;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
用EL表达式来获取
<%
pageContext.setAttribute("p1",new Person("张三",23,"male"));
%>
${pageScope.p1.name}<br/>
${pageScope.p1.name}<br/>
${pageScope.p1.name}<br/>
全域查找:
上例中,${pageScope.p1.name}表示在page域中查找p1也可以直接写${p1.name}
表示依次在pageScope、requesScopet、sessionScope、appliationScope四个域中查找名字为p1的属性。
请求参数相关内置对象
param和paramValues这两个内置对象是用来获取请求参数的。
* param:Map<String,String>
类型,param对象可以用来获取参数,与request.getParameter()方法相同。
paramValues:paramValues是Map
*
请求头相关内置对象
header和headerValues是与请求头相关的内置对象:
* header: Map<String,String>
类型,用来获取请求头。
如:${header.Host}
* headerValues:headerValues
是Map<String,String[]>
类型。当一个请求头名称,对应多个值时,使用该对象。
应用初始化相关内置对象
- initParam:initParam是Map
<context-param>
<param-name>user_Name</param-name>
<param-value>王五</param-value>
</context-param>
用EL表达式获取user_Name的值
${initParam.user_Name}
Cookie相关内置对象
- cookie:cookie是
Map<String,Cookie>
类型,其中key是Cookie的名字,而值是Cookie对象本身。
设置cookie对象的属性值
<%
response.addCookie(new Cookie("username","张胜男"));
response.addCookie(new Cookie("password","123456"));
%>
获取cookie对象的属性值
${cookie.username.name}:${cookie.username.value}<br/>
${cookie.password.name}:${cookie.password.value}<br/>
pageContext内置对象
pageContext:pageContext是PageContext类型!可以使用pageContext对象调用getXXX()方法,例如java中pageContext.getRequest(),el中:${pageContext.request}。
EL表达式 | 对应Java代码 |
---|---|
${pageContext.request.queryString} | pageContext.getRequest().getQueryString()//获取url中?后内容 |
${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() |
不难发现通过EL表达式的pageContext内置对象,可以轻松获取相关信息。
EL函数库
什么EL函数库
EL函数库是第三方对EL功能的扩展,这里学习的EL函数库是由JSTL添加的。
EL函数库就是定义一些有返回值的静态方法。然后通过EL语言来调用它们!当然,不只是JSTL可以定义EL函数库,我们也可以自定义EL函数库。
EL函数库中包含了很多对字符串的操作方法,以及对集合对象的操作。例如:${fn:length(“abc”)}会输出3,即字符串的长度。
导入函数库
因为是第三方的东西,所以需要导入。导入需要使用taglib指令!
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
EL函数库介绍
注意:以下对于需要用数组等对象的函数,需要将该对象存在域空间中之后才可使用。
String toUpperCase(String input) :把字符串参数转换成大写,并返回String toLowerCase(String input):把字符串参数转换成小写,并返回;
int indexOf(String input, String substring):返回input中substring出现的索引位置;
boolean contains(String input, String substring):查看input中是否包含substring,包含返回true,否则返回false;
boolean containsIgnoreCase(String input, String substring):在忽略大小写的情况下,查看input中是否包含substring,包含返回true,否则返回false;
boolean startsWith(String input, String substring):判断input是否是以substring为前缀,如果是就返回true,否则就返回false;
boolean endsWith(String input, String substring):判断input是否是以substring为后缀,如果是就返 回true,否则就返回false;
String substring(String input, int beginIndex, int endIndex):以beginIndex为开始值,endIndex为结束值,在input上截取子串;
String substringAfter(String input, String substring):获取input中,substring所在位置后面的字符串;
substringBefore(String input, String substring):获取input中,substring所在位置前面的字符串;
String escapeXml(String input):把input中”<”,”>”,“&”,“’”,“””进行转义;
String trim(String input):去除input中的前后空格;
String replace(String input, String substringBefore, String substringAfter):将input中的substringBefore 替换成substringAfter;
String[] split(String input, String delimiters):以delimiters为标识分割input,返回一个字符串数组;
int length(Object obj):可以获取字符串、数组、各种集合的长度!
String join(String array[], String separator):将array数组中的元素以separator连接起来,返回一个字符串。
对于个别函数用法举例说明如下
<body>
${fn:escapeXml("<div>王祖贤</div>")}</br>
<%
String[] str={"a","b","c"};
pageContext.setAttribute("str", str);
%>
${fn:join(str,",")}
${fn:substringAfter("abc", "a")}</br>
</body>
最终浏览器会输出
<div>王祖贤</div>
a,b,c bc