EL表达式与JSTL标签库


一、EL表达式简介

  1. EL表达式全称:Expression Language,即表达式语言
  2. EL表达式作用:代替JSP页面中表达式脚本进行数据的输出
  3. EL表达式比JSP的表达式脚本简洁很多
  4. EL表达式的格式是:${表达式} ,注:EL表达式写在jsp页面中,表达式一般是域对象的key
  5. EL 表达式在输出null 值的时候,输出的是空串。jsp 表达式脚本输出null 值的时候,输出的是null字符串
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <%
  8. request.setAttribute("key", "值");
  9. %>
  10. 表达式脚本输出key的值是:<%=request.getAttribute("key1") == null ? "" : request.getAttribute("key1")%><br/>
  11. EL表达式输出key的值是:${key1}
  12. </body>
  13. </html>

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

EL表达式主要是输出域对象中的数据,当四个域对象都有同一个key的值时,EL表达式会按照四个域对象的范围从小到大进行搜索,找到就输出,与四个域对象声明的先后顺序无关

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <%
  8. //往四个域中都保存了相同的key的数据
  9. pageContext.setAttribute("key", "pageContext");
  10. request.setAttribute("key", "request");
  11. session.setAttribute("key", "session");
  12. application.setAttribute("key", "application");
  13. %>
  14. ${key}
  15. </body>
  16. </html>

三、EL表达式输出Java类的属性

  1. <%@ page import="com.atguigu.pojo.Person" %>
  2. <%@ page import="java.util.List" %>
  3. <%@ page import="java.util.ArrayList" %>
  4. <%@ page import="java.util.Map" %>
  5. <%@ page import="java.util.HashMap" %>
  6. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  7. <html>
  8. <head>
  9. <title>Title</title>
  10. </head>
  11. <body>
  12. <%
  13. Person person = new Person();
  14. person.setName("cess真的帅");
  15. person.setPhones(new String[]{"18611111111","18622222222","18699998888"});
  16. List<String> cities = new ArrayList<>();
  17. cities.add("北京");
  18. cities.add("上海");
  19. cities.add("成都");
  20. person.setCities(cities);
  21. Map<String, Object> map = new HashMap<>();
  22. map.put("key1", "value1");
  23. map.put("key2", "value2");
  24. map.put("key3", "value3");
  25. person.setMap(map);
  26. pageContext.setAttribute("p", person);
  27. %>
  28. 输出Person:${p}<br/>
  29. 输出Person的name属性:${p.name} <br/>
  30. 输出Person的phones数组属性值:${p.phones} <br/>
  31. 输出Person的phones数组属性值:${p.phones[0]} <br/>
  32. 输出Person的cities集合中的元素值:${p.cities} <br>
  33. 输出Person的List集合中个别元素值:${p.cities[2]} <br>
  34. 输出Person的Map集合: ${p.map} <br>
  35. 输出Person的Map集合中某个key的值: ${p.map.key3} <br>
  36. <%-- 通过getXxx()方法取值,并不需要Javabean中有这个属性 --%>
  37. 输出Person的age属性:${p.age} <br>
  38. </body>
  39. </html>

8、EL表达式与JSTL标签库 - 图1

  1. public class Person {
  2. // i.需求——输出Person类中普通属性,数组属性。list集合属性和map集合属性。
  3. private String name;
  4. private String[] phones;
  5. private List<String> cities;
  6. private Map<String,Object> map;
  7. public int getAge() {
  8. return 18;
  9. }
  10. public Person(String name, String[] phones, List<String> cities, Map<String, Object> map) {
  11. this.name = name;
  12. this.phones = phones;
  13. this.cities = cities;
  14. this.map = map;
  15. }
  16. public Person() {

四、EL表达式的运算

1. 关系运算

关系运算符 说明 范例 结果
== 或 eq 等于 ${5==5} 或 ${5 eq 5} true
!= 或 ne 不等于 ${5!=5} 或 ${5 ne 5} false
< 或 lt 小于 ${3<5} 或 ${3 lt 5} true
> 或 gt 大于 ${2>10} 或 ${2 gt 10} false
<= 或 le 小于等于 ${5<=12} 或 ${5 le 12} true
>= 或 ge 大于等于 ${3>=5} 或 ${3 ge 5} false

2. 逻辑运算

逻辑运算符 说明 范例 结果
&& 或 and 与运算 ${12==12 && 12<11} 或 ${12 == 12 and 12 <11} false
|| 或 or 或运算 ${12 == 12 || 12 <11} 或 ${12==12 or 12 <11} true
! 或 not 取反运算 ${ !true } 或 ${not true} false

3. 算数运算

算数运算符 说明 范例 结果
+ 加法 ${12+18} 30
- 减法 ${18-8} 10
* 乘法 ${12*12} 144
/ 或 dev 除法 ${144/12} 或 ${144 dev 12} 12.0(自动兼容浮点模式)
% 或 mod 取模 ${144%10} 或 ${144 mod 10} 4
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>运算符</title>
  5. </head>
  6. <body>
  7. ${ 12 == 12 } 或 ${ 12 eq 12 } <br>
  8. ${ 12 != 12 } 或 ${ 12 ne 12 } <br>
  9. ${ 12 < 12 } 或 ${ 12 lt 12 } <br>
  10. ${ 12 > 12 } 或 ${ 12 gt 12 } <br>
  11. ${ 12 <= 12 } 或 ${ 12 le 12 } <br>
  12. ${ 12 >= 12 } 或 ${ 12 ge 12 } <br>
  13. <hr>
  14. ${ 12 == 12 && 12 > 11 } 或 ${ 12 == 12 and 12 > 11 } <br>
  15. ${ 12 == 12 || 12 > 11 } 或 ${ 12 == 12 or 12 > 11 } <br>
  16. ${ ! true } 或 ${ not true } <br>
  17. <hr>
  18. ${ 12 + 12 } <br>
  19. ${ 12 - 12 } <br>
  20. ${ 12 * 12 } <br>
  21. <%-- 除法会转为浮点型 --%>
  22. ${ 18 / 12 } 或 ${ 18 div 12 } <br>
  23. ${ 18 % 12 } 或 ${ 18 mod 12 } <br>
  24. </body>
  25. </html>

4. empty运算

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

以下几种情况为空:

  • 值为 null 值的时候,为空
  • 值为空串的时候,为空
  • 值是 Object 类型数组,长度为零
  • list 集合,元素个数为零
  • map 集合,元素个数为零

5. 三元运算

表达式 1?表达式 2:表达式 3

表达式1为真返回表达式2的值,表达式1为假返回表达式3的值

  1. <%@ page import="java.util.List" %>
  2. <%@ page import="java.util.ArrayList" %>
  3. <%@ page import="java.util.HashMap" %>
  4. <%@ page import="java.util.Map" %>
  5. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  6. <html>
  7. <head>
  8. <title>empty</title>
  9. </head>
  10. <body>
  11. <%
  12. // 1、值为null值的时候,为空
  13. request.setAttribute("emptyNull", null);
  14. // 2、值为空串的时候,为空
  15. request.setAttribute("emptyStr", "");
  16. // 3、值是Object类型数组,长度为零的时候
  17. request.setAttribute("emptyArr", new Object[]{});
  18. // 4、list集合,元素个数为零
  19. List<String> list = new ArrayList<>();
  20. request.setAttribute("emptyList", list);
  21. // 5、map集合,元素个数为零
  22. Map<String, Object> map = new HashMap<>();
  23. request.setAttribute("emptyMap", map);
  24. %>
  25. ${empty emptyNull} <br/>
  26. ${empty emptyStr} <br/>
  27. ${empty emptyArr} <br/>
  28. ${empty emptyList} <br/>
  29. ${empty emptyMap} <br/>
  30. <br/>
  31. ${(12 == 12) ? "天气很好" : "天气不好"}
  32. </body>
  33. </html>

6. “.”点运算和“[ ]”中括号运算

  • .点运算,可以输出 Bean 对象中某个属性的值
  • []中括号运算,可以输出有序集合中某个元素的值

并且[]中括号运算,还可以输出 map 集合中 key 里含有特殊字符的 key 的值

  1. <%@ page import="java.util.HashMap" %>
  2. <%@ page import="java.util.Map" %>
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <html>
  5. <head>
  6. <title>Title</title>
  7. </head>
  8. <body>
  9. <%
  10. Map<String,Object> map = new HashMap<>();
  11. map.put("a.a.a", "aaaValue");
  12. map.put("b+b+b", "bbbValue");
  13. map.put("c-c-c", "cccValue");
  14. request.setAttribute("map", map);
  15. %>
  16. ${map['a.a.a']} <br/>
  17. ${map["b+b+b"]} <br/>
  18. ${map['c-c-c']} <br/>
  19. </body>
  20. </html>

五、EL表达式的11个隐含对象

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

8、EL表达式与JSTL标签库 - 图2

initParam Map 它可以获取在web.xml中配置的上下文参数

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

8、EL表达式与JSTL标签库 - 图3

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>scope</title>
  5. </head>
  6. <body>
  7. <%
  8. pageContext.setAttribute("key1", "pageContext1");
  9. pageContext.setAttribute("key2", "pageContext2");
  10. request.setAttribute("key2", "request");
  11. session.setAttribute("key2", "session");
  12. application.setAttribute("key2", "application");
  13. %>
  14. ${pageScope.key1} <br/>
  15. ${pageScope.key2} <br/>
  16. ${requestScope.key2} <br/>
  17. ${sessionScope.key2} <br/>
  18. ${applicationScope.key2} <br/>
  19. </body>
  20. </html>

2.pageContext对象的使用

作用:

  1. 协议:
  2. 服务器 ip:
  3. 服务器端口:
  4. 获取工程路径:
  5. 获取请求方法:
  6. 获取客户端 ip 地址:
  7. 获取会话的 id 编号:
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>pageContext</title>
  5. </head>
  6. <body>
  7. ${pageContext} <%--org.apache.jasper.runtime.PageContextImpl@33598e0--%>
  8. ${pageContext.servletConfig}
  9. <%--
  10. request.getScheme() 它可以获取请求的协议
  11. request.getServerName() 获取请求的服务器ip或域名
  12. request.getServerPort() 获取请求的服务器端口号
  13. getContextPath() 获取当前工程路径
  14. request.getMethod() 获取请求的方式(GETPOST
  15. request.getRemoteHost() 获取客户端的ip 地址
  16. session.getId() 获取会话的唯一标识
  17. --%>
  18. <%=request.getScheme() %> <br/>
  19. 1.协议: ${ pageContext.request.scheme } <br/>
  20. 2.服务器ip:${ pageContext.request.serverName } <br/>
  21. 3.服务器端口:${ pageContext.request.serverPort } <br/>
  22. 4.获取工程路径:${ pageContext.request.contextPath } <br/>
  23. 5.获取请求方法:${ pageContext.request.method } <br/>
  24. 6.获取客户端ip地址:${ pageContext.request.remoteHost } <br/>
  25. 7.获取会话的id编号:${ pageContext.session.id } <br/><br/>
  26. <%-- 开发中常将几大对象放到pageContext中,如下--%>
  27. <%
  28. pageContext.setAttribute("request", request);
  29. %>
  30. 1.协议: ${ request.scheme } <br>
  31. </body>
  32. </html>

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

param Map 它可以获取请求参数的值

paramValues Map 它也可以获取请求参数的值,获取多个值的时候使用。

  1. 输出请求参数 username 的值:${ param.username } <br>
  2. 输出请求参数 password 的值:${ param.password } <br>
  3. 输出请求参数 username 的值:${ paramValues.username[0] } <br>
  4. 输出请求参数 hobby 的值:${ paramValues.hobby[0] } <br>
  5. 输出请求参数 hobby 的值:${ paramValues.hobby[1] } <br>

请求地址: http://localhost:8080/09_EL_JSTL/other_el_obj.jsp?username=wzg168&password=666666&hobby=java&hobby=cpp

header Map 它可以获取请求头的信息

headerValues Map 它可以获取请求头的信息,它可以获取多个值的情况

  1. 输出请求头【User-Agent】的值:${ header['User-Agent'] } <br>
  2. 输出请求头【Connection】的值:${ header.Connection } <br>
  3. 输出请求头【User-Agent】的值:${ headerValues['User-Agent'][0] } <br>

cookie Map 它可以获取当前请求的 Cookie 信息

  1. 获取 Cookie 的名称:${ cookie.JSESSIONID.name } <br>
  2. 获取 Cookie 的值:${ cookie.JSESSIONID.value } <br>

initParam Map 它可以获取在 web.xml 中配置的上下文参数

web.xml 中的配置:

  1. <context-param>
  2. <param-name>username</param-name>
  3. <param-value>root</param-value>
  4. </context-param>
  5. <context-param>
  6. <param-name>url</param-name>
  7. <param-value>jdbc:mysql:///test</param-value>
  8. </context-param>
  1. 输出&lt;Context-param&gt;username 的值:${ initParam.username } <br>
  2. 输出&lt;Context-param&gt;url 的值:${ initParam.url } <br>

六、JSTL标签库简介

  1. JSTL标签库全称是JSP Standard Tag Library,是一个不断完善的开放源代码的JSP标签库
  2. EL表达式主要是为了替换JSP中的表达式脚本,JSTL标签库是为了替换代码脚本
  3. JSTL由五个不同功能的标签库组成

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

功能范围 URL 前缀
核心标签库—重点 http://java.sun.com/jsp/jstl/core c
格式化 http://java.sun.com/jsp/jstl/fmt fmt
函数 http://java.sun.com/jsp/jstl/functions fn
数据库(不使用) http://java.sun.com/jsp/jstl/sql sql
XML(不使用) http://java.sun.com/jsp/jstl/xml x

七、JSTL标签库的使用步骤

  1. 先导入JSTL标签库的jar包
    taglibs-standard-impl-1.2.1.jar
    taglibs-standard-spec-1.2.1.jar
  2. 在jsp页面中使用taglib指令引入标签库(可自动导包)

    1. CORE 标签库 <%@ taglib prefix=“c uri=“http://java.sun.com/jsp/jstl/core” %>
    2. XML 标签库 <%@ taglib prefix=“x uri=“http://java.sun.com/jsp/jstl/xml” %>
    3. FMT 标签库 <%@ taglib prefix=“fmt uri=“http://java.sun.com/jsp/jstl/fmt” %>
    4. SQL 标签库 <%@ taglib prefix=“sql uri=“http://java.sun.com/jsp/jstl/sql” %>
    5. FUNCTIONS 标签库<%@ taglib prefix=“fn uri=“http://java.sun.com/jsp/jstl/functions” %>

八、core核心库的使用

标签

作用:可以往域中保存数据

  • scope属性设置保存到哪个域

    1. page表示pageContext域(默认值)
    2. request表示Request
    3. session表示Session
    4. application表示ServletContext
  • var属性设置key是多少

  • value属性设置value是多少

标签

作用:做if判断
test属性设置判断的条件,属性值使用EL表达式
注意:如果test属性值为真则执行if开始标签和结束标签中的语句,为假则不执行

标签

作用:多路判断,类似switch-case结构

  • choose标签表示开始多路判断
  • when标签表示每一种判断情况

test属性设置判断的条件,属性值使用EL表达式

注意:若test属性值为真,则执行when起始和结束标签中的语句

  • otherwise标签表示其余情况,若满足,则执行起始和结束标签中的语句

注意

  1. 使用三种标签时标签里不能使用html注释,要使用jsp注释
  2. when标签的父标签一定是choose标签
  3. when标签是从上向下依次判断的,一旦有满足的就不会再判断剩余when标签

案例:

  1. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  3. <html>
  4. <head>
  5. <title>jstl-core</title>
  6. </head>
  7. <body>
  8. <%--
  9. i.<c:set />
  10. 作用:set标签可以往域中保存数据
  11. 域对象.setAttribute(key,value);
  12. scope 属性设置保存到哪个域
  13. page表示PageContext域(默认值)
  14. request表示Request
  15. session表示Session
  16. application表示ServletContext
  17. var属性设置key是多少
  18. value属性设置值
  19. --%>
  20. 保存之前:${ sessionScope.abc } <br>
  21. <c:set scope="session" var="abc" value="abcValue"/>
  22. 保存之后:${ sessionScope.abc } <br>
  23. <%--
  24. ii.<c:if />
  25. if标签用来做if判断。
  26. test属性表示判断的条件(使用EL表达式输出)
  27. --%>
  28. <c:if test="${12 == 12}" >
  29. <h3>12等于12</h3>
  30. </c:if>
  31. <c:if test="${12 != 12}" >
  32. <h3>12不等于12</h3>
  33. </c:if>
  34. <%--
  35. iii.<c:choose> <c:when> <c:otherwise>标签
  36. 作用:多路判断。跟switch ... case .... default非常接近
  37. choose标签开始选择判断
  38. when标签表示每一种判断情况
  39. test属性表示当前这种判断情况的值
  40. otherwise标签表示剩下的情况
  41. <c:choose> <c:when> <c:otherwise>标签使用时需要注意的点:
  42. 1、标签里不能使用html注释,要使用jsp注释 <!-- html注释 -->❌
  43. 2when标签的父标签一定要是choose标签
  44. --%>
  45. <%
  46. request.setAttribute("height", 168);
  47. %>
  48. <c:choose>
  49. <c:when test="${requestScope.height > 190}">
  50. <h3>小巨人</h3>
  51. </c:when>
  52. <c:when test="${requestScope.height > 180}">
  53. <h3>很高</h3>
  54. </c:when>
  55. <c:when test="${requestScope.height > 170}">
  56. <h3>还可以</h3>
  57. </c:when>
  58. <c:otherwise>
  59. <c:choose>
  60. <c:when test="${requestScope.height > 160}">
  61. <h3>大于160</h3>
  62. </c:when>
  63. <c:when test="${requestScope.height > 150}">
  64. <h3>大于150</h3>
  65. </c:when>
  66. <c:when test="${requestScope.height > 140}">
  67. <h3>大于140</h3>
  68. </c:when>
  69. <c:otherwise>
  70. 其他小于140
  71. </c:otherwise>
  72. </c:choose>
  73. </c:otherwise>
  74. </c:choose>
  75. </body>
  76. </html>

标签

作用:遍历输出(与foreach循环一样,自动的遍历到下一个数据

c:forEach varStatus属性继承自LoopTagStatus接口,接口方法为:

8、EL表达式与JSTL标签库 - 图4

  1. <%@ page import="java.util.HashMap" %>
  2. <%@ page import="java.util.Map" %>
  3. <%@ page import="java.util.ArrayList" %>
  4. <%@ page import="com.atguigu.pojo.Student" %>
  5. <%@ page import="java.util.List" %>
  6. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  7. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  8. <html>
  9. <head>
  10. <title>Title</title>
  11. <style type="text/css">
  12. table {
  13. border: 1px solid red;
  14. border-collapse: collapse;
  15. }
  16. th, td {
  17. border: 1px solid red;
  18. }
  19. </style>
  20. </head>
  21. <body>
  22. <%--
  23. 1.遍历110,输出
  24. for (int i = 1; i < 10; i++)
  25. var 属性表示循环的变量(也是当前正在遍历到的数据)
  26. begin属性设置开始的索引
  27. end 属性设置结束的索引
  28. --%>
  29. <table border="1px" cellspacing="0">
  30. <c:forEach var="i" begin="1" end="10">
  31. <tr>
  32. <td>第${i}行</td>
  33. </tr>
  34. </c:forEach>
  35. </table>
  36. <hr/>
  37. <%--
  38. 2.遍历Object数组
  39. for (Object item: arr)
  40. items 表示遍历的数据源(遍历的集合)
  41. var 表示当前遍历到的数据
  42. --%>
  43. <%
  44. request.setAttribute("arr", new String[]{"18610541354", "18688886666", "18699998888"});
  45. %>
  46. <c:forEach var="i" items="${requestScope.arr}">
  47. ${i}
  48. </c:forEach>
  49. <hr/>
  50. <%
  51. Map<String, Object> map = new HashMap<>();
  52. map.put("key1", "value1");
  53. map.put("key2", "value2");
  54. map.put("key3", "value3");
  55. // for ( Map.Entry<String,Object> entry : map.entrySet()) {
  56. // }
  57. request.setAttribute("map", map);
  58. %>
  59. <c:forEach var="entry" items="${requestScope.map}">
  60. <h3>${entry.key} = ${entry.value}</h3>
  61. </c:forEach>
  62. <hr/>
  63. <%--4.遍历List集合---list中存放 Student类,有属性:编号,用户名,密码,年龄,电话信息--%>
  64. <%
  65. List<Student> studentList = new ArrayList<>();
  66. for (int i = 1; i <= 10; i++) {
  67. studentList.add(new Student(i, "username" + i, "pass" + i, 18 + i, "phone" + i));
  68. }
  69. request.setAttribute("stus", studentList);
  70. %>
  71. <table>
  72. <tr>
  73. <th>编号</th>
  74. <th>用户名</th>
  75. <th>密码</th>
  76. <th>年龄</th>
  77. <th>电话信息</th>
  78. <th>操作</th>
  79. </tr>
  80. <%--
  81. items 表示遍历的集合
  82. var 表示遍历到的数据
  83. begin表示遍历的开始索引值
  84. end 表示结束的索引值
  85. step 属性表示遍历的步长值
  86. varStatus 属性表示当前遍历到的数据的状态
  87. forint i = 1; i < 10; i+=2
  88. --%>
  89. <c:forEach var="stu" items="${requestScope.stus}"
  90. begin="2" end="7" step="2" varStatus="status">
  91. <tr>
  92. <td>${stu.id}</td>
  93. <td>${stu.username}</td>
  94. <td>${stu.password}</td>
  95. <td>${stu.age}</td>
  96. <td>${stu.phone}</td>
  97. <td>${status.count}</td>
  98. </tr>
  99. </c:forEach>
  100. </table>
  101. </body>
  102. </html>