EL 表达式 & JSTL 标签库

EL 表达式 & JSTL 标签库

  • 1、EL 表达式
    • 1.1、简介
    • 1.2、EL 表达式搜索域数据的顺序
    • 1.3、EL 表达式输出 Bean 的属性
    • 1.4、EL 表达式——运算
      • 1.4.1、关系运算
      • 1.4.2、逻辑运算
      • 1.4.3、算数运算
      • 1.4.4、empty 运算
      • 1.4.5、三元运算
      • 1.4.6、“.”点运算和[ ]中括号运算符
    • 1.5、EL 表达式的 11 个隐含对象
      • 1.5.1、EL 获取四个特定域中的属性
      • 1.5.2、pageContext 对象的使用
      • 1.5.3、EL 表达式其他隐含对象的使用
  • 2、JSTL 标签库
    • 2.1、 JSTL 标签库的使用步骤
    • 2.2、core 核心库使用
      • 2.2.1、(使用很少)
      • 2.2.2、
      • 2.2.3、 标签
      • 2.2.4、
      • 遍历 1 到 10,输出
      • 遍历 Object 数组
      • 遍历 Map 集合
      • 遍历 List 集合---list 中存放 Student 类,有属性:编号,用户名,密码,年龄, 电话信息

1、EL 表达式

1.1、简介

EL 表达式的全称是:Expression Language。是表达式语言

使用在 jsp 文件中

EL 表达式的作用:
EL 表达式主要是代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出

因为 EL 表达式在输出数据的时候,要比 jsp 的表达式脚本要简洁很多。

有值的情况下输出的结果:

<% request.setAttribute("key","值"); %>
表达式脚本输出 key 的值是:<%=request.getAttribute("key")%><br/>
EL 表达式输出 key 的值是:${key}<br/>

EL 表达式 & JSTL 标签库_第1张图片
没有值的情况下输出的结果:

<% request.setAttribute("key","值"); %>
表达式脚本输出 key1 的值是:<%=request.getAttribute("key1")%><br/>
EL 表达式输出 key1 的值是:${key1}<br/>

EL 表达式 & JSTL 标签库_第2张图片

EL 表达式的格式是:${表达式}

EL 表达式在输出 null 值的时候,输出的是空串

jsp 表达式脚本输出 null 值的时候,输出的是 null 字符串,要想 jsp 表达式脚本输出空串,要用到三元表达式
<%=request.getAttribute("key1")==null?"":request.getAttribute("key1")%>

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

EL 表达式主要是在 jsp 页面中输出数据, 主要是输出域对象中的数据

当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出

从小到大的范围的顺序 pageContext ====>>> request ====>>> session ====>>> application

<body> 
<% 
	//往四个域中都保存了相同的 key 的数据。 
	request.setAttribute("key", "request");
	session.setAttribute("key", "session");
	application.setAttribute("key", "application");
	pageContext.setAttribute("key", "pageContext"); 
%>

<%--使用 EL表达式获取域参数值  --%>
${ key } <%--此时输出结果是pageContext--%>
body>

注意 session 是在浏览器页面有效,所以就算将设置参数的代码注释掉,还要重新打开浏览器页面才有效
同理, application 是在整个 web 工程有效,注释掉赋值的代码之后,还要重启 web 工程才有效

1.3、EL 表达式输出 Bean 的属性

需求:
输出 Person 类中普通属性、数组属性、list 集合属性、map 集合属性

Person 类

public class Person { 
	private String name; 
	private String[] phones; 
	private List<String> cities; 
	private Map<String,Object> map; 
	
	public int getAge() { 
		return 18; 
	}
}

jsp 中代码:

<body> 
<%
//创建对象 
    Person ps = new Person();
//给属性赋值
    ps.setName("小草莓");
    ps.setPhones(new String[]{"18610541354", "18688886666", "18699998888"});
    List<String> cities = new ArrayList<String>();
    cities.add("北京");
    cities.add("上海");
    cities.add("深圳");
    ps.setCities(cities);
    Map<String, Object> map = new HashMap<>();
    map.put("key1", "value1");
    map.put("key2", "value2");
    map.put("key3", "value3");
    ps.setMap(map);
//将对象设置为域参数
    pageContext.setAttribute("p", ps);
%>

输出 Person:${ p }<br/> 
输出 Person 的 name 属性:${p.name} <br> 
输出 Person 的 pnones 数组属性值:${p.phones[2]} <br> 
输出 Person 的 cities 集合中的元素值:${p.cities} <br> 
输出 Person 的 List 集合中个别元素值:${p.cities[2]} <br> 
输出 Person 的 Map 集合: ${p.map} <br> 
输出 Person 的 Map 集合中某个 key 的值: ${p.map.key3} <br> 

body>

EL 表达式 & JSTL 标签库_第3张图片

此处输出 Person 对象的属性、map中指定的value,使用的是.运算符

输出数组、集合中的某个元素,使用的是[]运算符

输出不是根据对象的属性名,而是根据对象中创建的 get()方法

比如:在 Person 类中没有 age 属性名,但是提供一个 getAge() 的方法,然后使用 EL 表达式来获取

Person 类中代码:
public int getAge() { return 18; }

jsp 中代码:
输出 Person 的 age 属性:${p.age}

在这里插入图片描述

1.4、EL 表达式——运算

语法:${ 运算表达式 }

1.4.1、关系运算

EL 表达式 & JSTL 标签库_第4张图片

1.4.2、逻辑运算

在这里插入图片描述

1.4.3、算数运算

算数运算符 说 明 范 例 结果
+ 加法 ${ 12 + 18 } 30
- 减法 ${ 18 - 8 } 10
* 乘法 ${ 12 * 12 } 144
/ 或 div 除法 ${ 144 / 12 } 或 ${ 144 div 12 } 12
% 或 mod 取模 ${ 144 % 10 } 或 ${ 144 mod 10 } 4

1.4.4、empty 运算

empty 运算可以判断一个数据是否为空

如果为空,则输出 true;不为空,则输出 false

以下几种情况为空:

  1. 值为 null 值的时候,为空
  2. 值为空串的时候,为空
  3. 值是 Object 类型数组,长度为零的时候
  4. list 集合,元素个数为零
  5. map 集合,元素个数为零

注意:
传入参数是一个对象的话,不为空

<body>
<%
    List<String> list = new ArrayList<>();
    request.setAttribute("key1", list);
    request.setAttribute("key2", new ArrayList<String>());
    request.setAttribute("key3", new Object());
%>
list 集合,元素个数为零:${empty key1}<br/>
一个集合对象:${empty key2}<br/>
一个 Object 对象:${empty key3}<br/>
body>

EL 表达式 & JSTL 标签库_第5张图片

1.4.5、三元运算

${表达式 1?表达式 2:表达式 3}

如果表达式 1 的值为真,返回表达式 2 的值

如果表达式 1 的值为假,返回表达式 3 的值

${ 12 != 12 ? "正确的":"错误的" }

1.4.6、“.”点运算和[ ]中括号运算符

.点运算
可以输出 Bean 对象中某个属性的值

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

示例:
输出 map 集合中 key 里含有特殊字符的 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); 
%> 

${ map['a.a.a'] } <br> 
${ map["b+b+b"] } <br> 
${ map['c-c-c'] } <br> 

body>

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

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

变量 类型 作用
pageContext PageContextImpl 它可以获取 jsp 中的九大内置对象
pageScope Map 它可以获取 pageContext 域中的数据
requestScope Map 它可以获取 Request 域中的数据
sessionScope Map 它可以获取 Session 域中的数据
applicationScope Map 它可以获取 ServletContext 域中的数据
param Map 它可以获取请求参数的值
paramValues Map 它也可以获取请求参数的值,获取多个值的时候使用。
header Map 它可以获取请求头的信息
headerValues Map 它可以获取请求头的信息,它可以获取多个值的情况
cookie Map 它可以获取当前请求的 Cookie 信息
initParam Map 它可以获取在 web.xml 中配置的上下文参数

1.5.1、EL 获取四个特定域中的属性

属性
pageScope pageContext 域
requestScope Request 域
sessionScope Session 域
applicationScope ServletContext 域
<body> 
<% 
	pageContext.setAttribute("key1", "pageContext1");
	pageContext.setAttribute("key2", "pageContext2");
	request.setAttribute("key2", "request");
	session.setAttribute("key2", "session");
	application.setAttribute("key2", "application"); 
%>

获取application单个域属性的value值:${ applicationScope.key2 }<br/>
获取request域参数整个的键值对:${ requestScope }<br/>

body>

EL 表达式 & JSTL 标签库_第6张图片

1.5.2、pageContext 对象的使用

  1. 协议:
    <%=request.getScheme()%> jsp 表达式脚本获取请求的协议
    ${ pageContext.request.scheme } EL 表达式获取协议
  2. 服务器 ip:
    request.getServerName() 获取请求的服务器 ip 或域名
    ${ pageContext.request.serverName }
  3. 服务器端口:
    request.getServerPort() 获取请求的服务器端口号
    ${ pageContext.request.serverPort }
  4. 获取工程路径:
    request.getContextPath()获取当前工程路径
    ${ pageContext.request.contextPath }
  5. 获取请求方法:
    request.getMethod() 获取请求的方式(GET 或 POST)
    ${ pageContext.request.method }
  6. 获取客户端 ip 地址:
    request.getRemoteHost() 获取客户端的 ip 地址
    ${ pageContext.request.remoteHost }
  7. 获取会话的 id 编号:
    session.getId() 获取会话的唯一标识
    ${ pageContext.session.id }

1.5.3、EL 表达式其他隐含对象的使用

变量 类型 作用
param Map 它可以获取请求参数的值
paramValues Map 它也可以获取请求参数的值,获取多个值的时候使用

示例代码:

${ param }

在没有设置参数的情况下,获取请求参数只输出一对 花括号
在这里插入图片描述
有多个参数可以都获取,但若参数有多个值,就要使用 paramValues

在这里插入图片描述

示例代码:

<body>
<%--获取指定参数名的值--%>
输出请求参数 username 的值:${ param.username } <br>
输出请求参数 password 的值:${ param.password } <br>

<%--获取指定参数的指定位置的值--%>
输出请求参数 username 指定位置的值:${ paramValues.username[0] } <br>
输出请求参数 hobby 指定位置的值:${ paramValues.hobby[0] } <br>
输出请求参数 hobby 指定位置的值:${ paramValues.hobby[1] } <br>

<%-- ${ paramValues.hobby } 这种情况只会输出地址值 [Ljava.lang.String;@6bb1cfb --%>
body>

EL 表达式 & JSTL 标签库_第7张图片

变量 类型 作用
header Map 它可以获取请求头的信息
headerValues Map 它可以获取请求头的信息,它可以获取多个值的情况

示例代码:

<%--获取请求头信息--%>
输出请求头信息:${ header } <br>

EL 表达式 & JSTL 标签库_第8张图片

<body>
<%-- 参数里有特殊值,需要用[]括号 --%>
输出请求头【User-Agent】的值:${ header['User-Agent'] } <br>
输出请求头【Connection】的值:${ header.Connection } <br>
输出请求头【User-Agent】的值:${ headerValues['User-Agent'][0] } <br>

<%-- headerValues 的类型是Map<String,String[]> --%>
<%-- ${ headerValues['User-Agent'] } 输出数组String[]的地址值 [Ljava.lang.String;@78ff1384 --%>
body>

EL 表达式 & JSTL 标签库_第9张图片
EL 表达式 & JSTL 标签库_第10张图片

变量 类型 作用
cookie Map 它可以获取当前请求的 Cookie 信息

Cookie 对象里面可以存放一对键值对

因为 cookie 的类型是Map , 所以 ${ cookie } 输出的是Map 的地址值
{Idea-9ddd6c63=javax.servlet.http.Cookie@3c1e879f, JSESSIONID=javax.servlet.http.Cookie@35b121ae}

里面Cookie对象的 key 就是JSESSIONID,对应的 value 就是 javax.servlet.http.Cookie@35b121ae

示例代码:

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

EL 表达式 & JSTL 标签库_第11张图片

变量 类型 作用
initParam Map 它可以获取在 web.xml 中配置的上下文参数

示例代码:

<body>
输出<Context-param>key1 的值:${ initParam.key1 } <br>
输出<Context-param>key2 的值:${ initParam.key2 } <br>
${ initParam }
body>

EL 表达式 & JSTL 标签库_第12张图片

2、JSTL 标签库

JSTL 标签库
全称是指 JSP Standard Tag Library JSP 标准标签库
是一个不断完善的开放源代码的 JSP 标 签库

EL 表达式主要是为了替换 jsp 中的表达式脚本,而标签库则是为了替换代码脚本。 这样使得整个 jsp 页面 变得更佳简洁

JSTL 由五个不同功能的标签库组成
EL 表达式 & JSTL 标签库_第13张图片
要使用标签库就必须先使用 taglib 指令引入标签库

在 jsp 标签库中使用 taglib 指令引入标签库

CORE 标签库 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

FMT 标签库 
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

FUNCTIONS 标签库 
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

SQL 标签库 
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %> 

XML 标签库
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>  

2.1、 JSTL 标签库的使用步骤

  1. 先导入 jstl 标签库的 jar 包
    taglibs-standard-impl-1.2.1.jar
    taglibs-standard-spec-1.2.1.jar
  2. 第二步,使用 taglib 指令引入标签库
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

引入标签库:
可以输入 、或者

2.2、core 核心库使用

2.2.1、(使用很少)

作用: set 标签可以往域属性中保存数据

java中操作保存数据:域对象.setAttribute(key,value);

  1. scope 属性设置保存到哪个域
    page 表示 PageContext 域(默认值)
    request 表示 Request 域
    session 表示 Session 域
    application 表示 ServletContext 域
  2. var 属性设置key是多少
  3. value 属性设置值value
保存之前:${ sessionScope.abc } <br> 
<c:set scope="session" var="abc" value="abcValue"/> 
保存之后:${ sessionScope.abc } <br>

2.2.2、

if 标签用来做 if 判断,只能是单个判断

test 属性表示判断的条件(使用 EL 表达式)

若成立,就执行前后标签之间的内容,若不成立,就不执行
相当于 if()

<c:if test="${ 12 == 12 }"> 	
	<h1>12 等于 12h1>
c:if>

2.2.3、 标签

作用: 多路判断。跟 switch … case … default 非常接近

  1. choose 标签开始选择判断
  2. when 标签表示每一种判断情况
    test 属性表示当前这种判断情况的值
  3. otherwise 标签表示剩下的情况
<% 
	request.setAttribute("score", 59); 
%>
<c:choose> 
	<c:when test="${ requestScope.score > 90 }">
		<h2>优秀h2> 
	c:when> 
	<c:when test="${ requestScope.score > 60 }"> 
		<h2>及格h2> 
	c:when> 
	<c:otherwise>
		<h2>不及格h2> 
	c:otherwise>
c:choose> 

注意:
1、标签里不能使用 html 注释,要使用 jsp 注释
2、when 标签的父标签一定要是 choose 标签

<% 
	request.setAttribute("score", 59); 
%>
<c:choose> 
	<%-- 这是 jsp 注释 --%>
	<c:when test="${ requestScope.score > 90 }">
		<h2>优秀h2> 
	c:when> 
	
	<c:otherwise>
		<%-- c:otherwise 标签里面再嵌套一整套的 c:choose --%>
		<c:choose> 
			<c:when test="${ requestScope.score > 80 }">
				<h2>良好h2> 
			c:when> 
			<c:when test="${ requestScope.score > 60 }"> 
				<h2>及格h2> 
			c:when> 
			<c:otherwise>
				<h2>不及格h2> 
			c:otherwise>
		c:choose> 
	c:otherwise>
	
c:choose> 

2.2.4、

作用: 遍历输出使用

遍历 1 到 10,输出

  1. begin 属性设置开始的索引
  2. end 属性设置结束的索引
  3. var 属性表示循环的变量(也是当前正在遍历到的数据)
<%-- for (int i = 1; i < 10; i++) --%>
<c:forEach begin="1" end="10" var="i"> 
	第${i}行<br> 
c:forEach>

遍历 Object 数组

  1. items 表示遍历的数据源(遍历的集合)
  2. var 表示当前遍历到的数据
<%-- for (Object o: arr) --%>
<% 
	request.setAttribute("arr", new String[]{"18610541354","18688886666","18699998888"}); 
%>
<c:forEach items="${ requestScope.arr }" var="o"> 
	${ o } <br> 
c:forEach>

遍历 Map 集合

Map 中包含着多个键值对,键 key 值 value ,单个键值对组合就是 entry

<%-- Map.Entry<String,Object>是指Map类中的内部类Entry --%>
<%-- for(Map.Entry<String,Object> entry : map.entrySet()){} --%>
<% 
	Map<String,Object> map = new HashMap<String, Object>();
	 map.put("key1", "value1"); 
	 map.put("key2", "value2"); 
	 map.put("key3", "value3"); 
	 request.setAttribute("map", map); 
%>
<c:forEach items="${ requestScope.map }" var="entry"> 
	<h1>${entry.key} = ${entry.value}h1> 
c:forEach>

entry.key的含义就是调用 entry 对象中 getKey() 方法
entry.value的含义就是调用 entry 对象中 getValue() 方法

在 EL 表达式中,要想调用某个类中的实例方法 Y.getxxx(),可以试着调用${ Y.xxx }

遍历 List 集合—list 中存放 Student 类,有属性:编号,用户名,密码,年龄, 电话信息

  1. items 表示遍历的集合
  2. var 表示遍历到的数据
  3. begin 表示遍历的开始索引值
  4. end 表示结束的索引值
  5. step 属性表示遍历的步长值
  6. varStatus 属性表示当前遍历到的数据的状态
public class Student { 
	private Integer id; 
	private String username; 
	private String password; 
	private Integer age; 
	private String phone;
}
<% 
	List<Student> studentList = new ArrayList<Student>(); 
	for (int i = 1; i <= 10; i++) { 
		studentList.add(new Student(i,"username"+i ,"pass"+i,18+i,"phone"+i)); 
	}
	request.setAttribute("stus", studentList); 
%>
<%-- 
	可以将前面的begin、end、items、var结合起来
	注意 begin、end 设置的是索引值,所以以下代码输出的是id为3-8部分
 --%>
<c:forEach begin="2" end="7" items="${requestScope.stus}" var="stu">
	${stu.id}<br/>
	${stu.username}<br/>
	${stu.password}<br/>
	${stu.age}<br/>
	${stu.phone}<br/>
	${status.step}<br/>
c:forEach>

注意 begin、end 设置的是索引值,所以以上代码输出的是 id 为 3 - 8 部分

step 属性表示遍历的步长值 ,默认为 0

step="2"相当于 for(int i = 1; i < 10; i+=2)里面的 i+=2
输出是隔行输出:1、3、5、7…

<c:forEach begin="2" end="7"  step="2" varStatus="status"  items="${requestScope.stus}" var="stu">
	${stu.id}<br/>
	${stu.username}<br/>
	${stu.password}<br/>
	${stu.age}<br/>
	${stu.phone}<br/>
	${status.step}<br/>
c:forEach>

varStatus 属性表示当前遍历到的数据的状态

varStatus 继承了LoopTagStatus接口,所以可以使用里面的方法
比如:
status.step调用的就是 getStep() 方法,获取 step 属性值

<c:forEach varStatus="status" items="${requestScope.stus}" var="stu">
	${status.step}
c:forEach>

EL 表达式 & JSTL 标签库_第14张图片

你可能感兴趣的:(笔记,html,前端)