`
yelangking
  • 浏览: 21236 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

在jsp中使用JSTL跟El表达式访问和遍历Map集合

    博客分类:
  • java
阅读更多
1.背景
      这段时间在项目中遇到在一个jsp页面中需要访问Map集合。可能各位同行和朋友在开发javaWeb 的时候,用的较多的是List<Bean>这样的集合,针对这类的集合访问比较简单,但是我在遍历Map<K,V> 这样的集合时,着实是费了一点心思。下面的代码样例都是在此背景(jsp、jstl、el、Map)下完成。
2.相关知识点
      1.关于jsp和jstl不再解释,具体请查阅相关资料或者书籍。
       2.EL,为什么要解释EL表达式呢,因为本文就是介绍如何使用EL表达来访问Map对象,以及EL的取值方式对于访问Map<K,V>这样的集合的特殊之处。
      3.什么是EL表达式,以及EL的用处:JSP表达式语言(ExpressionLanguage),简称EL,最初定义在JSTL1.0规范中,直到JSP2.0之后,EL表达式才正式成为JSP规范中的一部分。EL为存取变量、表达式运算和读取内置对象等内容提供了新的操作方式。
       4.EL取值方式
EL提供(.)和([])两种运算符来存取数据,即使用点运算符(.)和方括号运算符([])。那么EL是如何运用这两个运算符来取值的呢?这应该跟javaBean的规范有关,凡是提供了getXXX()的标准bean,都可以在访问范围(jsp的访问范围)中使用EL表达式取值。闲言少叙,进入正题,如何访问Map呢?
3.正文
1.使用${map.key}和${map.value}访问集合
   原理:以HashMap为例,通过查看HashMap的源码,你可以发现在HashMap中提供了如下的方法:
public final K getKey() {
     return key;
}

public final V getValue() {
     return value;
}

jsp代码片段:
<h3>1.使用"."运算符遍历Map</h3>
<h5>key:$&nbsp;{map.key};value:$&nbsp;{map1.value}。</h5>
<c:forEach items="${map1}" var="map">
    <h5>key: ${map.key}&nbsp;value:${map.value}</h5>
</c:forEach>
<hr/>

使用上述代码访问map时,其实就是调用了getKey()和getValue()这两个方法。
2.对于已经知道map中的key,如何直接获取key对应的value
原理:以HashMap为例,通过看源码,其内部提供了如下方法:
public V get(Object key) {
        if (key == null)
            return getForNullKey();
        int hash = hash(key.hashCode());
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
                return e.value;
        }
        return null;
    }

/**
* Offloaded version of get() to look up null keys.  Null keys map
* to index 0.  This null case is split out into separate methods
* for the sake of performance in the two most commonly used
* operations (get and put), but incorporated with conditionals in
* others.
*/
private V getForNullKey() {
    for (Entry<K,V> e = table[0]; e != null; e = e.next) {
        if (e.key == null)
                return e.value;
    }
        return null;
}

jsp 代码片段:
<h3>2.使用"."运算符访问Map</h3>
 <h5>姓名:$&nbsp;{map.name};年龄:$&nbsp;{map1.age}。</h5>
 <h5>姓名:${map1.name};年龄:${map1.age}。</h5>
 <hr/>

上面代码对于明确Map中的key的情况下,是可以采用这种方法访问的。当然,使用[]运算符也可以正常访问,具体jsp代码片段如下:
<h3>3.使用"[]"运算符访问Map</h3>
<h5>姓名:$&nbsp;{map['name']};年龄:$&nbsp;{map1['age']}。</h5>
<h5>姓名:${map1['name']};年龄:${map1['age']}。</h5>

使用这种方式时,请注意 具体的key请使用双引号或者单引号包含起来,以表示作为整体key。
使用这种方式访问map的时候,有一种特殊情况需要注意。后台 map.put(1, value1) , 前台 ${map[1]}将取不到值。原因:el表达式中数字1是Long类型,无法匹配后台map中的int。 修改 map.put(0L, value);  前台 :${map[1]}.
3.当key不是明确的,是一个变量时,如何访问Map?原理跟第2条相似,jsp代码有所不同
<
h3>4.当key是变量时,使用"[]"运算符访问Map</h3>
<c:set var="key" value="name"></c:set>
<h5>通过变量key获取的姓名:${map1[key]}</h5>
<hr/>

4.结语
    本文是自己的一个总结和思考,其实在项目中用的多的是list,而list中存储的都是标准的javaBean,因此使用起来比较简单。而针对于Map这种比较特殊的集合,如果把其中的源码稍微看一下,知道里面的getKey()和getValue(),以及get(key)这三个方法了之后,在EL中取Map的值就会得心应手了。欢迎各位前辈和同行拍砖指正,一起交流进步。详细代码和运行截图见附件。
 
欢迎转载,地址:http://yelangking.iteye.com/blog/2042913

运行效果:
  • 大小: 190.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics