暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

EL表达式

Java笔记录 2019-02-16
1047

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表达式更加的简单。


EL表达式支持的运算符


empty运算符:检查对象是否为空

二元表达式:${user != null?张三:李四}


empty测试用例

<%
    List<String> list = new ArrayList<>();
    list.add("张三");
    list.add("李四");
    request.setAttribute("list",list);
%>
${empty(list)}


结果

可以使用empty完成判断集合是否为空,从而再进行其他比较。

EL表达式获取javabean属性


定义一个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表达式的方式明显简单了很多。

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时


<%
    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表达式隐含对象

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


结果

EL函数库


由于在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>


结果


文章转载自Java笔记录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论