3.5 三元运算
表达式 1?表达式 2:表达式 3
表达式1为真返回表达式2的值,表达式1为假返回表达式3的值
示例代码及结果如下:
<body> <% //1、值为null值时 request.setAttribute("emptyNull", null); //2、值为空串时 request.setAttribute("emptyStr", ""); //3、值是Object类型数组,长度为零的时候 request.setAttribute("emptyArr", new Object[]{}); //4、list集合,元素个数为零 List<String> list = new ArrayList<>(); request.setAttribute("emptyList", list); //5、map集合,元素个数为零 Map<String,Object> map = new HashMap<String, Object>(); request.setAttribute("emptyMap", map); //6、其他类型数组长度为0 request.setAttribute("emptyIntArr", new int[]{}); %> ${ empty emptyNull } <br/> ${ empty emptyStr } <br/> ${ empty emptyArr } <br/> ${ empty emptyList } <br/> ${ empty emptyMap } <br/> ${ empty emptyIntArr} <br/> <%-- 三元运算 --%> ${ 12 != 12 ? "相等":"不相等" } </body>
3.6 点运算和中括号运算
- 点运算可以输出某个对象的某个属性的值(getXxx或isXxx方法返回的值)
- 中括号运算可以输出有序集合中某个元素的值
中括号运算可以输出Map集合中key里含有特殊字符的key的值
特殊字符:等于、大于小于、点等。
示例代码如下:
<body> <% Map<String,Object> map = new HashMap<String, Object>(); map.put("a.a.a", "aaaValue"); map.put("b+b+b", "bbbValue"); map.put("c-c-c", "cccValue"); request.setAttribute("map", map); %> <%--特殊的key需要去掉最开始的"."并使用中括号和单引号(双引号)包起来--%> ${ map["a.a.a"] } <br> <%--如果不加中括号则相当于三个.运算--%> //错误的是 ${map.a.a.a} ${ map["b+b+b"] } <br> <%--如果不加中括号则相当于三个+运算--%> ${ map["c-c-c"] } <br> <%--如果不加中括号则相当于三个-运算--%> </body>
4 EL表达式的11个隐含对象
4.1 概述
EL表达式中的11个隐含对象是EL表达式自己定义的,可以直接使用。
4.2 获取四个特定域中的属性
<body> <% pageContext.setAttribute("key1", "pageContext1"); pageContext.setAttribute("key2", "pageContext2"); request.setAttribute("key2", "request"); session.setAttribute("key2", "session"); application.setAttribute("key2", "application"); %> <%-- 获取特定域中的属性 --%> ${ pageScope.key1 } <br> ${ applicationScope.key2 } <%-- 若直接获取key1或key2依然按照之前范围从小到大检索,无法获取指定域 --%> </body>
4.3 pageContext对象的使用
pageContext常用于如下需求,在jsp的代码脚本中使用如下:
- 获取请求的协议: request.getScheme()
- 获取请求的服务器ip或域名: request.getServerName()
- 获取请求的服务器端口号: request.getServerPort()
- 获取当前工程路径: request.getContextPath()
- 获取请求的方式: request.getMethod()
- 获取客户端的ip地址: request.getRemoteHost()
- 获取会话的唯一标识: session.getId()
在EL表达式中 更加简便,实现上述需求的代码如下:
<body> <%-- 先通过pageContext对象获取request、session对象,再获取以下内容 --%> 1.协议: ${ pageContext.request.scheme }<br> 2.服务器ip:${ pageContext.request.serverName }<br> 3.服务器端口:${ pageContext.request.serverPort }<br> 4.获取工程路径:${ pageContext.request.contextPath }<br> 5.获取请求方法:${ pageContext.request.method }<br> 6.获取客户端ip地址:${ pageContext.request.remoteHost }<br> 7.获取会话的id编号:${ pageContext.session.id}<br> </body>
看到这里,是不是会感到困惑?
不是说EL表达式会更加简洁吗,为何在获取的时候语句长度反而比代码脚本要复杂呢?
在实际开发中,有一个小技巧,代码示例如下:
<body> <% pageContext.setAttribute("req", request); pageContext.setAttribute("session", session); %> 1.协议: ${ req.scheme }<br> 2.服务器ip:${ req.serverName }<br> 3.服务器端口:${ req.serverPort }<br> 4.获取工程路径:${ req.contextPath }<br> 5.获取请求方法:${ req.method }<br> 6.获取客户端ip地址:${ req.remoteHost }<br> 7.获取会话的id编号:${ session.id}<br> </body>
提前将对应的对象设置成域对象,便于EL表达式访问,可以使代码更简洁!
4.4 param、paramValues对象的使用
<body> 获取请求参数username的值:${ param.username } <br> 获取请求参数password的值:${ param.password } <br> 获取请求参数中第一个hobby的值:${ paramValues.hobby[0] } <br> 获取请求参数中第二个hobby的值:${ paramValues.hobby[1] } <br> <%-- 有多个同名的key时使用paramValues的索引值决定获取哪一个,使用param只可获取第一个 --%> 使用param获取hobby的值:${ param.hobby } <br> </body>
4.5 header、headerValues对象的使用
<body> 输出请求头[user-Agent]的值:${ header["User-Agent"] }<br> 输出请求头中第一个[user-Agent]的值:${ headerValues["User-Agent"][0] }<br> </body>
4.6 cookie对象的使用
<body> 获取Cookie的名称:${ cookie.JSESSIONID.name } <br> 获取Cookie的值:${ cookie.JSESSIONID.value } <br> </body>
4.7 initParam对象的使用
<body> 输出<Context-param>username的值:${ initParam.username } <br> 输出<Context-param>url的值:${ initParam.url } <br> </body>