EL表达式
EL表达式的全名叫做Expression Language,也即是表达式语言。主要用于替换jsp页面中的脚本表达式,以从各种类型的域(page、request、session、application)中获取数据。
EL表达式语法:${标识符}
EL表达式的执行过程及原理
EL表达式在执行的过程中会首先调用pageContext.findAttribte方法,并以EL表达式的标识符作为关键字,分别从
page、request、session、application四个域中查找相应的对象,如果找到就返回对象,找不到就返回null(注意是null,而不是空字符串)。EL表达式调用的findAttribute()方法查找的域的顺序是从小到大,即page、request、session、
application
看一个简单的例子:
<%
request.setAttribute("username","ForMe");
%>
不使用EL表达式获取的用户名为:<%=request.getAttribute("username")%>
<hr>
使用EL表达式获取的用户名为:${username}
</body>
看一下运行的结果

可以看出使用el表达式与不使用的结果是一致的,但是使用了el表达式更加的简单。


empty运算符:检查对象是否为空
二元表达式:${user != null?张三:李四}
empty测试用例
<%
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
request.setAttribute("list",list);
%>
${empty(list)}
结果

可以使用empty完成判断集合是否为空,从而再进行其他比较。
定义一个Person类,只设定用户名和id。使用jsp:setProperty设定值
<jsp:setProperty name="person" property="username" value="张三"/>
<jsp:setProperty name="person" property="id" value="123456"/>
用户名:<jsp:getProperty name="person" property="username"/><br>
id:<jsp:getProperty name="person" property="id"/>
<hr>
用户名:${person.username}<br>
id:${person.id}
结果如下

发现二者的结果仍是一致的,但是使用EL表达式的方式明显简单了很多。
<%
List<Person> list = new ArrayList<>();
Person p1 = new Person();
p1.setUsername("张三");
Person p2 = new Person();
p2.setUsername("李四");
Person p3 = new Person();
p3.setUsername("王五");
list.add(p1);
list.add(p2);
list.add(p3);
request.setAttribute("list",list);
%>
<%
for(Person person : list)
out.write(person.getUsername() + "<br>");
%>
<hr>
${list[0].username}<br>
${list[1].username}<br>
${list[2].username}<br>
结果

说明两种方式都是可以的。上面代码实现的时候使用了
foreach循环,当不使用foreach循环的时候就会发现明显是EL表达式较为简单。
<%
Map<String,Person> map = new HashMap<>();
Person p1 = new Person();
p1.setUsername("张三");
Person p2 = new Person();
p2.setUsername("李四");
Person p3 = new Person();
p3.setUsername("王五");
map.put("1",p1);
map.put("abc",p2);
map.put("王五",p3);
request.setAttribute("map",map);
%>
<%
Set<Map.Entry<String,Person>> entrySet = map.entrySet();
Iterator<Map.Entry<String,Person>> iterator = entrySet.iterator();
while(iterator.hasNext()){
Map.Entry<String,Person> entry= iterator.next();
String key= entry.getKey();
Person value = entry.getValue();
out.write(value.getUsername() + "<br>");
}
%>
<hr>
${map["1"].username}<br>
${map.abc.username}<br>
${map.王五.username}<br>
结果和上边的是一样的,但是我们发现使用EL表达式进行访问简单了许多,EL表达式的优点也突出了出来。
注意:当map的key值是数字时在EL表达式中只能使用这种方法:${map["数字"].属性}进行访问。
EL表达式中定义了11个隐含对象。
语法:${隐式对象名称}:获得对象的引用
1 pageContext 对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。)
2 pageScope 代表page域中用于保存属性的Map对象
3 requestScope 代表request域中用于保存属性的Map对象
4 sessionScope 代表session域中用于保存属性的Map对象
5 applicationScope 代表application域中用于保存属性的Map对象
6 param 表示一个保存了所有请求参数的Map对象
7 paramValues 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个String[]
8 header 表示一个保存了所有http请求头字段的Map对象,注意:如果头里面有“-” ,例Accept-Encoding,则要header[“Accept-Encoding”]
9 headerValues 表示一个保存了所有http请求头字段的Map对象,它对于某个请求参数,返回的是一个string[]数组。注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]
10 cookie 表示一个保存了所有cookie的Map对象
11 initParam 表示一个保存了所有web应用初始化参数的map对象
paramValues可以用于勾选兴趣爱好,感兴趣的内容等方面。
数据回显
<%
Person p = new Person();
p.setId("0");
request.setAttribute("person",p);
%>
<input type="checkbox" name="sex" value="male" ${person.id=="1"?"checked":""}>male
<input type="checkbox" name="sex" value="female" ${person.id=="0"?"checked":""}>female
结果

由于在JSP页面中显示数据时,经常需要对显示的字符串进行处理,SUN公司针对于一些常见处理定义了一套EL函数库供开发者使用。
这些EL函数在JSTL开发包中进行描述,因此在JSP页面中使用SUN公司的EL函数库,需要导入JSTL开发包(jstl.jar、standard.jar),并在页面中导入EL函数库(<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>)。
常用函数:

其中escapeXML是直接输出HTML代码。其余的和String类一致。
看下测试
contains方法:${fn:contains("张三是个好人", "人")}<br>
containsIgnoreCase方法:${fn:containsIgnoreCase("ForMe","forme" )}<br>
endWith方法:${fn:endsWith("sjhfsanxx","nxx" )}<br>
startWith方法:${fn:startsWith("sjfsjss","sjf" )}<br>
escapeXml方法:${fn:escapeXml("<h1>这是第一个大标题<h1>")}<br>
indexOf方法:${fn:indexOf("asdhafdiewvnhhhhf","h" )}<br>
replace方法:${fn:replace("JerryAndTom","Tom" ,"Merry" )}<br>
split方法:${fn:split("sdf.rg.rr.g.g.","." )}<br>
subString方法:${fn:substring("sdkfh",0 ,3 )}<br>
subStringAfter方法:${fn:substringAfter("sadaskd","sad" )}<br> //子字符串后边的字符串
substringBefore方法:${fn:substringBefore("sdjfdsvkv","sv" )}<br> //子字符串前面的字符串
trim方法:${fn:trim(" sdf d d ")}<br>
结果





