EL表达式

Expression Language 。是表达式语言
EL表达式主要是代替jsp页面中的表达式脚本在jsp页面中进行数据的输出。比jsp表达式更加简洁

  1. <body>
  2. <%
  3. request.setAttribute("key","值");
  4. %>
  5. 表达式脚本输出的key的值:<%=request.getAttribute("key")%><br/>
  6. EL表达式输出的:${key};
  7. </body>

注:EL表达式在输出空字符串时,输出的就是空;而jsp输出的是null

EL 表达式搜索域数据的顺序

EL 表达式主要是在 jsp 页面 中输出数据
主要是输出域对象中的数据
当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。

  1. <body>
  2. <%
  3. // 往四个域中都保存了相同的 key 的数据。
  4. request.setAttribute("key", "request");
  5. session.setAttribute("key", "session");
  6. application.setAttribute("key", "application");
  7. pageContext.setAttribute("key", "pageContext");
  8. %>
  9. ${key};
  10. </body>

EL 表达式输出 Bean 的普通属性,数组属性。List 集 合属性,map 集合属性

  1. //先在person类中添加set/get方法
  2. public class person {
  3. private String name;
  4. private String[] phones;
  5. private List<String> cities;
  6. private Map<String,Object> map;
  7. }
  8. <body>
  9. <%
  10. person person = new person();
  11. person.setName("h");
  12. person.setPhones(new String[]{"12345", "12315", "112"});
  13. List<String> cities=new ArrayList<>();
  14. cities.add("北京");
  15. cities.add("上海");
  16. cities.add("深圳");
  17. person.setCities(cities);
  18. Map<String,Object> map=new HashMap<>();
  19. map.put("k1", "v1");
  20. map.put("k2", "v2");
  21. map.put("k3", "v3");
  22. person.setMap(map);
  23. pageContext.setAttribute("person", person);
  24. %>
  25. 输出person:${person}<br/>
  26. 输出person的name属性值:${person.name}
  27. 输出 Person 的 cities 集合中的元素值:${p.cities} <br>
  28. 输出 Person 的 List 集合中个别元素值:${p.cities[2]} <br>
  29. 输出 Person 的 Map 集合: ${p.map} <br>
  30. 输出 Person 的 Map 集合中某个 key 的值: ${p.map.key3} <br>
  31. </body>

EL表达式—运算

${ 运算表达式 }

结果返回true/false

  1. //关系运算
  2. ${1==1} ${1 eq 1}
  3. //逻辑运算
  4. ${ 12 == 12 && 12 < 11 } ${ 12 == 12 and 12 < 11 }
  5. //算术运算
  6. ${1+1}

empty 运算

可以判断一个数据是否为空,如果为空,则输出 true,不为空输出 false

  1. <body>
  2. <%
  3. // 1、值为 null 值的时候,为空
  4. request.setAttribute("emptyNull", null);
  5. // 2、值为空串的时候,为空
  6. request.setAttribute("emptyStr", "");
  7. // 3、值是 Object 类型数组,长度为零的时候
  8. request.setAttribute("emptyArr", new Object[]{});
  9. // 4、list 集合,元素个数为零
  10. List<String> list = new ArrayList<>();
  11. // list.add("abc");
  12. request.setAttribute("emptyList", list);
  13. // 5、map 集合,元素个数为零
  14. Map<String,Object> map = new HashMap<String, Object>();
  15. // map.put("key1", "value1");
  16. request.setAttribute("emptyMap", map);
  17. %>
  18. ${ empty emptyNull } <br/>
  19. ${ empty emptyStr } <br/>
  20. ${ empty emptyArr } <br/>
  21. ${ empty emptyList } <br/>
  22. ${ empty emptyMap } <br/>
  23. </body>

. 点运算 和 [] 中括号运算符

.点运算,可以输出 Bean 对象中某个属性的值。
[]中括号运算,可以输出有序集合中某个元素的值。 并且[]中括号运算,还可以输出 map 集合中key 里含有特殊字符的 key 的值

  1. <body>
  2. <%
  3. Map<String,Object> map = new HashMap<String, Object>();
  4. map.put("a.a.a", "aaaValue");
  5. map.put("b+b+b", "bbbValue");
  6. map.put("c-c-c", "cccValue");
  7. request.setAttribute("map", map);
  8. %>
  9. ${ map['a.a.a'] } <br> //包含特殊字符 用中括号输出
  10. ${ map["b+b+b"] } <br>
  11. ${ map['c-c-c'] } <br>
  12. </body>

EL 表达式的 11 个隐含对象

EL 个达式中 11 个隐含对象,是 EL 表达式中自己定义的,可以直接使用
image.png
**

i. EL 获取四个特定域中的属性

pageScope pageContext 域
requestScope Request 域
sessionScope Session 域
applicationScope ServletContext 域

  1. <body>
  2. <%
  3. pageContext.setAttribute("key1", "pageContext1");
  4. pageContext.setAttribute("key2", "pageContext2");
  5. request.setAttribute("key2", "request");
  6. session.setAttribute("key2", "session");
  7. application.setAttribute("key2", "application");
  8. %>
  9. ${ applicationScope.key2 }
  10. </body>

**

ii. pageContext 对象的使用

  1. <body>
  2. <%--
  3. request.getScheme() 它可以获取请求的协议
  4. request.getServerName() 获取请求的服务器 ip 或域名
  5. request.getServerPort() 获取请求的服务器端口号
  6. getContextPath() 获取当前工程路径
  7. request.getMethod() 获取请求的方式(GET POST
  8. request.getRemoteHost() 获取客户端的 ip 地址
  9. session.getId() 获取会话的唯一标识
  10. --%>
  11. <%
  12. pageContext.setAttribute("req", request);
  13. %>
  14. <%=request.getScheme() %> <br>
  15. //EL表达式语句· 方法是获取它的get方法取值
  16. 1.协议: ${ req.scheme }<br>
  17. 2.服务器 ip:${ pageContext.request.serverName }<br>
  18. 3.服务器端口:${ pageContext.request.serverPort }<br>
  19. 4.获取工程路径:${ pageContext.request.contextPath }<br>
  20. 5.获取请求方法:${ pageContext.request.method }<br>
  21. 6.获取客户端 ip 地址:${ pageContext.request.remoteHost }<br>
  22. 7.获取会话的 id 编号:${ pageContext.session.id }<br>
  23. </body>

iii. EL 表达式其他隐含对象的使用

  1. <body>
  2. 输出请求参数 username 的值:${ param.username } <br>
  3. 输出请求参数 password 的值:${ param.password } <br>
  4. 输出请求参数 hobby 的值:${ paramValues.hobby[0] } <br>
  5. 输出请求参数 hobby 的值:${ paramValues.hobby[1] } <br>
  6. 输出请求头[User-Agent]的值:${ header['User-Agent'] } <br>
  7. 输出请求头[Connection]的值:${ header.Connection } <br>
  8. 输出请求头[User-Agent]的值:${ headerValues['User-Agent'][0] } <br>
  9. 获取 Cookie 的名称:${ cookie.JSESSIONID.name } <br>
  10. 获取 Cookie 的值:${ cookie.JSESSIONID.value } <br>
  11. 输出Context-paramusername 的值:${ initParam.username } <br>
  12. 输出Context-paramurl 的值:${ initParam.url } <br>
  13. </body>

**

JSTL 标签库

  1. JSTL 标签库是指 JSP Standard Tag Library JSP 标准标签库。是一个不断完善的开放源代码的 JSP 标签库。 <br /> EL 表达式主要是为了替换 jsp 中的表达式脚本,而**标签库则是为了替换代码脚本**。这样使得整个 jsp 页面 变得更佳简洁。

JSTL 由五个不同功能的标签库组成

功能范围 URL 前缀
核心标签库 https://java.sun.com/jsp/jstl/core c
格式化 https://java.sun.com/jsp/jstl/frmt frmt
函数 https://java.sun.com/jsp/jstl/functions fn
数据库(不使用) https://java.sun.com/jsp/jstl/sql sql
XML(不使用) https://java.sun.com/jsp/jstl/xml x
  1. //导入依赖
  2. <dependency>
  3. <groupId>org.apache.taglibs</groupId>
  4. <artifactId>taglibs-standard-impl</artifactId>
  5. <version>1.2.5</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.taglibs</groupId>
  9. <artifactId>taglibs-standard-spec</artifactId>
  10. <version>1.2.5</version>
  11. </dependency>

**

core核心库使用

  1. <body>
  2. //<c:set/>标签
  3. <%--set标签可以向域中保存数据--%>
  4. 保存之前:${ sessionScope.abc } <br>
  5. <c:set scope="session" var="abc" value="abcValue"/>
  6. 保存之后:${ sessionScope.abc } <br>
  7. //<c:if/>标签 用来做if判断
  8. <c:if test="${1==1}"> //test属性表示判断条件(用EL表达式输出)
  9. <span>1=1</span>
  10. </c:if>
  11. //<c:choose> <c:when> <c:otherwise>标签 多路判断
  12. <%
  13. request.setAttribute("height", 175);
  14. %>
  15. <c:choose> //choose标签表示开始选择判断
  16. <c:when test="${ requestScope.height > 180 }">
  17. <h2></h2> //test属性表示当前这种情况的判断值
  18. </c:when> //when标签表示每一种判断情况
  19. <c:when test="${ requestScope.height > 170 }">
  20. <h2>还可以</h2>
  21. </c:when>
  22. <c:otherwise> //类似于switch语句的 default结尾
  23. <c:choose> //when标签的父标签必须是choose标签
  24. <c:when test="${requestScope.height > 160}">
  25. <h3>大于 160</h3>
  26. </c:when>
  27. <c:otherwise>
  28. 其他小于 160
  29. </c:otherwise>
  30. </c:choose>
  31. </c:otherwise>
  32. </c:choose>
  33. //forEach表示遍历
  34. <c:forEach begin="1" end="10" var="i">
  35. ${i}
  36. </c:forEach> //遍历对象类型数组
  37. <%
  38. request.setAttribute("arr", new String[]{"A","B","C"});
  39. %>
  40. <c:forEach items="${ requestScope.arr }" var="item">
  41. ${ item } <br>
  42. </c:forEach>
  43. //遍历map
  44. <%
  45. Map<String,Object> map = new HashMap<String, Object>();
  46. map.put("key1", "value1");
  47. map.put("key2", "value2");
  48. map.put("key3", "value3");
  49. request.setAttribute("map", map);
  50. %>
  51. <c:forEach items="${ requestScope.map }" var="entry">
  52. <h1>${entry.key} = ${entry.value}</h1>
  53. </c:forEach>
  54. //foreach标签属性
  55. item: 表示遍历的集合
  56. var 表示遍历的数据
  57. step 表示遍历的步长
  58. varstatus 表示当前遍历到的数据的状态
  59. <c:forEach begin="1" end="7" varStatus="sta">
  60. ${sta.current}<br/>
  61. ${sta.index}<br/>
  62. ${sta.count}<br/>
  63. </c:forEach>
  64. </body>