Java_EL表达式从数组 Map List集合取值

via: http://blog.sina.com.cn/s/blog_7ffb8dd501013z1n.html

 

Jstl是sun的标准taglib库,Jstl是标签库和el语言的结合。

el 表达式的隐含对象pageScope,requestScope,sessionScope,applicationScope,比如${hello}语 句首先会从pageScope开始逐个查找scope中的属性,指定域对象语句为${requestScope.hello}

 

1.与 [ ] 运算符  

EL 提供 . 和 [ ] 两种运算符来导航数据。下列两者所代表的意思是一样的: ${sessionScope.user.sex}等于${sessionScope.user["sex"]}

. 和 [ ] 也可以同时混合使用,如下: ${sessionScope.shoppingCart[0].price}

回传结果为shoppingCart中第一项物品的价格。

 

不过,以下两种情况,两者会有差异:

(1) 当要存取的属性名称中包含一些特殊字符,如. 或 – 等并非字母或以数字开头的符号,就一定要使用 [ ],例如:${user.My-Name } 应当改为:${user["My-Name"] }

(2) 我们来考虑下列情况:

${sessionScope.user[data]}

此时,data 是一个变量,假若data的值为"sex"时,那上述的例子等于${sessionScope.user.sex}; 假若data 的值为"name"时,它就等于${sessionScope.user.name}。因此,如果要动态取值时,就可以用上述的方法来做,但. 无法做到动态取值。

注意:(使用[]时,里面是String类型要加双引号“”!!!!!,是数字,就直接写数字,不要加双引号)

 

(3)数组或集合的索引只能使用[]    如:${sessionScope.user[0]}     ${sessionScope.list[1].name}

 

属性值:${hello}

对象值

姓名:${user.username}

年龄:${user.age}

所属组:${user.group.name}

 

1、map集合

在EL中,方括号运算符用来检索数组和集合的元素。对于实现 java.util.Map 接口的集合,方括号运算符使用关联的键查找存储在映射中的值。

在方括号中指定键,并将相应的值作为表达式的值返回。例如,表达式 ${map['key']} 返回与 map标识符所引用的 Map 中的 "key" 键相关联的值。

当forEach 的items属性中的表达式的值是java.util.Map时,则var中命名的变量的类型就是 java.util.Map.Entry。这时var=entry的话,用表达式${entry.key}取得键名。 用表达${entry.value}得到每个entry的值。这是因为java.util.Map.Entry对象有getKey和getValue方法,表达式语言遵守JavaBean的命名约定。

<%

Map<String,String> map2 = new HashMap();

map2.put("a","hello world");

map2.put("b","this is map");

request.setAttribute("map2",map2);

%>

键值对遍历

<c:forEach var="item" items="${map2}">

${item.key} > ${item.value} <br>

</c:forEach>

键遍历

<c:forEach var="item" items="${map2}">

${item.key}<br>

</c:forEach>

值遍历

<c:forEach var="item" items="${map2}">

   ${item.value}<br>

 </c:forEach>

根据键遍历值

<c:forEach var="item" items="${map2}">

  ${item['a']}<br>

  ${item['b']}<br>

</c:forEach>

 

<%

List<String> list = new ArrayList<String>();

list.add("first");

list.add("second");

List<String> list2 = new ArrayList<String>();

list2.add("aaaaaa");

list2.add("bbbbbb");

Map<String,List<String>> map = new HashMap();//(List<Map(k,v)>同理)

map.put("a",list);

map.put("b",list2);

request.setAttribute("map",map);

%>

通过键获得列表值,并遍历列表<br>

<c:forEach var="item" items="${map['a']}">

${item }<br>

</c:forEach><br>

<c:forEach var="item" items="${map['b']}">

${item }<br>

</c:forEach> <br>

map中值为列表,直接遍历列表中的每一项<br>

<c:forEach var="item" items="${map}">

<c:forEach items="${item.value}" var="it">

${it }<br>

</c:forEach>

</c:forEach>

 

但是要注意,如果你的numberMap是这样的:

HashMap<Integer, String> numberMap= new HashMap<Integer, String>();

numberMap.put(0, "零");

numberMap.put(1, "一");

在jsp页面中${numberMap[1]}将取不到值,因为el表达式中数字1是Long类型,无法匹配到numberMap中的Integer 1 。明白了原理,事儿就好办了。修改numberMap:

HashMap<Long, String> map = new HashMap<Long, String>();

map.put(0L, "零");

map.put(1L, "一");

然后就随心所欲哈${numberMap[1]}

 

2、数组

假设Action中有数组

Char[] char={“1”.”2”};

request.setAttribute(“char”,char);

${char[1]}

 

数组中的对象

User[] users=new User[10];

for(int i=0;i<10;i++)

{

  User u=new User();

  u.setUsername(“U_”+i);

  users[i]=u;

}

request.setAttribute(“users”,users);

${users[1].username}

 

list集合(set集合同理)

List list=new ArrayList();

list.add(user1);

list.add(user2);

list.add(user3);

request.setAttribute(“list”,list);

 

取单个值: ${list[3].username}

遍历取值:<c:forEach var="user" items="${list}">

            <c:out value="${user.username}" />

         </c:forEach>

 

el表达式对运算符的支持

1+2=${1+2}

10/5=${10/5}

10 div 5=${10 div 5}

10%3=${10%3}

10 mod 3=${10 mod 3}

 

el表达式支持算数运算符和逻辑运算符

el表达式的函数

判断值是否为空: ${empty  scope中的属性名}

判断值为非空: ${!empty  scope中的属性名}

 

--------------------------------------------

via: http://ihuangweiwei.iteye.com/blog/1185200

 

EL表达式简述

 

一.jsp禁用EL表达式的三种方式

1.使用斜杠"\"符号   \${expression}

2.使用page指令 <%@ pageisELIgnored="true|false"%>

3.在web.xml文件中配置<el-ignored>元素

    <jsp-config>

        <jsp-property-group>

            <url-pattern>*.jsp</url-pattern>

            <el-ignored>true</el-ignored>

        </jsp-property-group>

    </jsp-config>

    

三.EL表达式的运算符

 

1.存取数据运算符[]和.

    通常情况,我们可以通过"."运算符获得指定对象的属性。

    但当属性中包含一些特殊符号("."或者"-"等非字母或数字符号)时,可以用[]格式访问属性值。

    如:${sessionScope.user[user-name]}

    

    同样,可以使用"[]"运算符来读取数组

    如:${sessionScope.fruit[1]}

    

    Map集合元素的获取,假如有一个key为fruit的键值对,我们可以如下获取

    如:${sessionScope.fruit["frutit"]}

 

2.算术运算符(+、-、*、/或div、%或mod)

注:%或者mod为求余运算符

    如:${15%4} 返回值为3

 

3.关系运算符

    ==或eq    等于

    !=或ne       不等于

    <或lt     小于

    >或gt     大于

    <=或le    小于等于

    >=或ge    大于等于

    注意:在使用EL表达式关系运算符时,不能够写成:

     ${param.pwd1} == ${param.pwd2} 或 ${${param.pwd1} == ${param.pwd2}}

     而应写成:${param.pwd1 == param.pwd2}     

     

4.逻辑运算符

    1.&&或and运算符

    2.||或or运算符

    3.!或not运算符

        ${! username == "mr"}

 

5.empty运算符(特殊的运算符)

    用来确定一个对象或者变量是否为null或者空。

    ${empty expression}

    同时可以跟not运算符结合使用,用于确定一个对象或者变量是否为非空。

    ${not empty expression}    

    

6.条件运算符

    ${条件表达式?计算表达式1:计算表达式2}    

    ${empty user ? "user is null ": user}

 

四.EL函数介绍

 

1:fn:toLowerCase函数将一个字符串中包含的所有字符转换为小写形式,并返回转换后的字符串,它接收一个字符串类型的参数。

例如:

fn:toLowerCase("Www.IT315.org") 的返回值为字符串“www.it315.org”  

fn:toLowerCase("")的返回值为空字符串  

 

2:fn:toUpperCase函数将一个字符串中包含的所有字符转换为大写形式,并返回转换后的字符串,它接收一个字符串类型的参数。

例如:

fn:toUpperCase("Www.IT315.org") 的返回值为字符串“WWW.IT315.ORG”  

fn:toUpperCase("")的返回值为空字符串  

 

3:fn:trim函数删除一个字符串的首尾的空格,并返回删除空格后的结果字符串,它接收一个字符串类型的参数。需要注意的是,fn:trim函数不能删除字符串中间位置的空格。

fn:trim(" www.it315.org ") 的返回值为字符串“www.it 315.org”。  

 

4:fn:length函数返回一个集合或数组大小,或返回一个字符串中包含的字符的个数,返回值为int类型。fn:length函数接收一个参数,这个参数可以是<c:forEach>标签的items属性支持的任何类型,包括任意类型的数组、java.util.Collection、java.util.Iterator、java.util.Enumeration、java.util.Map等类的实例对象和字符串。

如果fn:length函数的参数为null或者是元素个数为0的集合或数组对象,则函数返回0;如果参数是空字符串,则函数返回0。

 

5:fn:split函数以指定字符串作为分隔符,将一个字符串分割成字符串数组并返回这个字符串数组。

fn:split函数接收两个字符串类型的参数,第一个参数表示要分割的字符串,第二个参数表示作为分隔符的字符串。

fn:split("www.it315.org", ".")[1]的返回值为字符串“it315”。  

 

6:fn:join函数以一个字符串作为分隔符,将一个字符串数组中的所有元素合并为一个字符串并返回合并后的结果字符串。fn:join函数接收两个参数,第一个参数是要操作的字符串数组,第二个参数是作为分隔符的字符串。

如果fn:join函数的第二个参数是空字符串,则fn:join函数的返回值直接将元素连接起来。

例如: 假设stringArray是保存在Web域中的一个属性,它表示一个值为{"www","it315","org"}的字符串数组,则

fn:join(stringArray, “.")返回字符串“www.it315.org”  

fn:join(fn:split("www,it315,org", ","), ".") 的返回值为字符串www.it315.org”  

 

7:fn:indexOf函数返回指定字符串在一个字符串中第一次出现的索引值,返回值为int类型。fn:indexOf函数接收两个字符串类型的参数,如果第一个参数字符串中包含第二个参数字符串,那么,不管第二个参数字符串在第一个参数字符串中出现几次,fn:indexOf函数总是返回第一次出现的索引值;如果第一个参数中不包含第二个参数,则fn:indexOf函数返回-1。如果第二个参数为空字符串,则fn:indexOf函数总是返回0。

fn:indexOf("www.it315.org","t3") 的返回值为5  

 

8:fn:contains函数检测一个字符串中是否包含指定的字符串,返回值为布尔类型。fn:contains函数在比较两个字符串是否相等时是大小写敏感的。

fn:contains函数接收两个字符串类型的参数,如果第一个参数字符串中包含第二个参数字符串,则fn:contains函数返回true,否则返回false。如果第二个参数的值为空字符串,则fn:contains函数总是返回true。实际上,

fn:contains(string, substring)等价于fn:indexOf(string, substring) != -1。  

忽略大小的EL函数:fn:containsIgnoreCase  

 

9:fn:startsWith函数用于检测一个字符串是否是以指定字符串开始的,返回值为布尔类型。

fn:startsWith函数接收两个字符串类型的参数,如果第一个参数字符串以第二个参数字符串开始,则函数返回true,否则函数返回false。如果第二个参数为空字符串,则fn:startsWith函数总是返回true。

例如: fn:startsWith("www.it315.org","it315")的返回值为false  与之对应的EL函数:fn:endsWith  

 

10:fn:replace函数将一个字符串中包含的指定子字符串替换为其它的指定字符串,并返回替换后的结果字符串。fn:replace方法接收三个字符串类型的参数,第一个参数表示要操作的源字符串,第二个参数表示源字符串中要被替换的子字符串,第三个参数表示要被替换成的字符串。

例如: fn:replace("www it315 org", " ", ".")的返回值为字符串“www.it315.org”  

 

11:fn:substring函数用于截取一个字符串的子字符串并返回截取到的子字符串。fn:substring函数接收三个参数,第一个参数是用于指定要操作的源字符串,第二个参数是用于指定截取子字符串开始的索引值,第三个参数是用于指定截取子字符串结束的索引值,第二个参数和第三个参数都是int类型,其值都从0开始。

例如: fn:substring("www.it315.org", 4, 9) 的返回值为字符串“it315”  

 

13:fn:substringAfter函数用于截取并返回一个字符串中的指定子字符串第一次出现之后的子字符串。fn:substringAfter函数接收两个字符串类型的参数,第一个参数表示要操作的源字符串,第二个参数表示指定的子字符串。

fn:substringAfter(“www.it315.org”, “.”)的返回值为字符串“it315.org”。  

与之对应的EL函数为:fn:substringBefore  

你可能感兴趣的:(el表达式)