EL 表达式 & JSTL 标签库

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/>

在这里插入图片描述
没有值的情况下输出的结果:

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

在这里插入图片描述

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>

在这里插入图片描述

此处输出 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、关系运算

在这里插入图片描述

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>

在这里插入图片描述

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 表达式中自己定义的,可以直接使用

变量类型作用
pageContextPageContextImpl它可以获取 jsp 中的九大内置对象
pageScopeMap<String,Object>它可以获取 pageContext 域中的数据
requestScopeMap<String,Object>它可以获取 Request 域中的数据
sessionScopeMap<String,Object>它可以获取 Session 域中的数据
applicationScopeMap<String,Object>它可以获取 ServletContext 域中的数据
paramMap<String,String>它可以获取请求参数的值
paramValuesMap<String,String[]>它也可以获取请求参数的值,获取多个值的时候使用。
headerMap<String,String>它可以获取请求头的信息
headerValuesMap<String,String[]>它可以获取请求头的信息,它可以获取多个值的情况
cookieMap<String,Cookie>它可以获取当前请求的 Cookie 信息
initParamMap<String,String>它可以获取在 web.xml 中配置的上下文参数

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

属性
pageScopepageContext 域
requestScopeRequest 域
sessionScopeSession 域
applicationScopeServletContext 域
<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>

在这里插入图片描述

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 表达式其他隐含对象的使用

变量类型作用
paramMap<String,String>它可以获取请求参数的值
paramValuesMap<String,String[]>它也可以获取请求参数的值,获取多个值的时候使用

示例代码:

${ 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>

在这里插入图片描述

变量类型作用
headerMap<String,String>它可以获取请求头的信息
headerValuesMap<String,String[]>它可以获取请求头的信息,它可以获取多个值的情况

示例代码:

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

在这里插入图片描述

<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>

在这里插入图片描述
在这里插入图片描述

变量类型作用
cookieMap<String,Cookie>它可以获取当前请求的 Cookie 信息

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

因为 cookie 的类型是Map<String,Cookie> , 所以 ${ cookie } 输出的是Map<String,Cookie> 的地址值
{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>

在这里插入图片描述

变量类型作用
initParamMap<String,String>它可以获取在 web.xml 中配置的上下文参数

示例代码:

<body>
输出&lt;Context-param&gt;key1 的值:${ initParam.key1 } <br>
输出&lt;Context-param&gt;key2 的值:${ initParam.key2 } <br>
${ initParam }
</body>

在这里插入图片描述

2、JSTL 标签库

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

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

JSTL 由五个不同功能的标签库组成
在这里插入图片描述
要使用标签库就必须先使用 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" %>

引入标签库:
可以输入 <c:、或者<fmt, 然后回车,IDEA 就自动帮我们引入标签库

2.2、core 核心库使用

2.2.1、<c:set />(使用很少)

作用: 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、<c:if />

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

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

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

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

2.2.3、<c:choose> <c:when> <c:otherwise>标签

作用: 多路判断。跟 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、<c:forEach />

作用: 遍历输出使用

遍历 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>

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值