7.5.1 方括号运算符([])和点运算符(.)

优质
小牛编辑
146浏览
2023-12-01

在JSP页面中要经常访问Map、List、数组等类型的对象,以及EL内置对象、域对象的属性等。通过方括号运算符和点运算符可以很容易实现这个功能。

下面是方括号运算符和点运算符使用规则:

l 在访问EL内置对象属性时,可以使用方括号运算符或点运算符。例如,${param.name}和${param["name"]}都可以访问name请求参数。

2  在访问数组或List对象中的元素时,只能使用方括号运算符。例如,products是一个String[]类型的对象,则只能使用${products[0]}来访问该数组对象的第一个元素。

3  在访问Map对象中的元素时,既可以使用方括号运算符,也可以使用点运算符。例如,productMap是一个Map<String, String>类型的对象,则可以使用${productMap.bike}来访问key为bike的元素,也可以使用${productMap["bike"]}来访问key为bike的元素。

4  在访问域对象属性时,既可以使用方括号运算符,也可以使用点运算符,例如,myBean是MyBean类的对象实例,则${myBean.name}和${myBean["name"]}都可以访问myBean对象的name属性。

5  方括号运算符和点运算符可以混合使用。例如,productMap是一个Map<String, List<String>>类型的对象,可以使用${productsMap.productList[0]}来访问productMap对象中key为productList的value中的第一个元素。

6  如果对象属性或Map对象的key中含有点字符(.),则必须使用方括号运算符来访问该对象的属性或Map对象中和key对象的value。例如,productMap是一个Map<String, String>对象,该对象有一个key为“new.product”,要访问与该key对应的value,必须使用${productMap["new.product"]}。如果使用${productMap.new.product}来访问与key对应的value,则该表达式将返回null,并输出空串。

下面的代码演示了方括号运算符和点运算符的用法:

<!--  operator.jsp  -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%

   //  定义各种类型的变量
   String[] products = new String[]{"bike", "car"};
   java.util.List<String> productList = new java.util.ArrayList();
   java.util.Map<String, Object> productMap =new java.util.HashMap<String, Object>();
   chapter6.MyBean myBean = new chapter6.MyBean();
   //  为上面定义的变量赋值
   productList.add("啤酒");
   productList.add("衬衣");  
   productMap.put("bike", "自行车");
   productMap.put("products", products);
   productMap.put("myMap", productMap);
   productMap.put("new.List", products);
   myBean.setName("李明");
   //  将这些变量放到request域中
   request.setAttribute("products", products);
   request.setAttribute("productList", productList);
   request.setAttribute("productMap", productMap);
   request.setAttribute("myBean", myBean);
%>

访问EL内置对象中的属性

\${param.name}:${param.name}<br>

\${param["name"]}:${param["name"]}

访问数组中的元素

\${products[0]}:${products[0]}

访问List对象中的元素

\${productList[0]}:${productList[0]}
\${productList[1]}:${productList[1]}

访问Map对象中的元素

\${productMap.bike}:${productMap.bike}

\${productMap['bike']}:${productMap['bike']}

访问域对象中的属性

\${myBean.name}:${myBean.name}

\${myBean["name"]}:${myBean["name"]}

方括号运算符和点运算符混合使用

\${productMap.products[0]}:${productMap.products[0]}

\${productMap["myMap"].products[1]}:${productMap["myMap"].products[1]}

访问key带点字符的元素

\${productMap["new.List"][1]}:${productMap["new.List"][1]}

在浏览器地址栏中输入如下的URL:

http://localhost:8080/demo/chapter7/operator.jsp?name=bill

浏览器显示的信息如图7.11所示。

11

图7.11 使用方括号运算符和点运算符访问对象属性或元素

如果使用方括号运算符或点运算符访问EL内置对象的属性或数组、List以及Map对象的元素,即使访问的属性或元素不存在,甚至使用了不存在的属性。EL表达式并不会抛出异常,而是返回null,并输出空串。例如,${products[10]}中的访问了products数组中的第11个元素,但products数组中只有两个元素,很明显第11个数组元素并不存在,但该表达式不会抛出异常,而只是返回了null。如${products[10] ==null }将输出null。

当访问域对象属性时,如果未找到域对象,则EL表达式返回null。如果找到该域对象,并且使用了域对象中不存在的属性,则EL表达式会抛出异常。例如,${myBean.abc}访问了myBean中的abc属性,但abc属性并不存在,因此,该EL表达式会抛出异常。