28. EL 表达式 以及 JSTL 标签库
1.EL 表达式
a)什么是 EL 表达式,EL 表达式的作用?
- EL 表达式的全称是:Expression Language。是表达式语言。
- EL 表达式的什么作用:EL 表达式主要是代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出。
下面我们来举例说明一下:
1.创建 a.jsp 页面,分别使用 表达式脚本 以及 EL 表达式 输出内容
image-20201129142911898
代码语言:javascript复制<body>
<%
request.setAttribute("key","值");
%>
表达式脚本输出key的值是:<%=request.getAttribute("key")%><br/>
EL表达式输出key的值是:${key}
</body>
浏览器访问如下:
image-20201129143032528
2.两种表达式在处理 null 的情况
image-20201129143131556
从结果来看:
- 表达式脚本输出 null 值 在浏览器直接就是 null 字符串显示
- EL表达式会进行一定的处理,浏览器不显示 null
这让用户感觉更加友好。
3.如果 表达式脚本也要将 null 值 在浏览器中不显示,那就需要写一个三元表达式,如下:
image-20201129143356923
代码语言:javascript复制<body>
<%
request.setAttribute("key","值");
%>
表达式脚本输出key的值是:<%=request.getAttribute("key1")==null? "":request.getAttribute("key1") %><br/>
EL表达式输出key的值是:${key1}
</body>
4.总结
- EL 表达式在输出数据的时候,要比 jsp 的表达式脚本要简洁很多。
- EL 表达式的格式是:
${表达式}
- EL 表达式在输出 null 值的时候,输出的是空串。jsp 表达式脚本输出 null 值的时候,输出的是 null 字符串。
b)EL 表达式搜索域数据的顺序
EL 表达式主要是在 jsp 页面中输出数据。
主要是输出域对象中的数据。
当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。
示例如下:
1.创建 b.jsp,使用四个域对象存入相同的 key 数据
image-20201129224230092
代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//往四个域中都保存了相同的 key 的数据。
request.setAttribute("key", "request");
session.setAttribute("key", "session");
application.setAttribute("key", "application");
pageContext.setAttribute("key", "pageContext");
%>
<%--使用 EL 表达式取值--%>
${ key }
</body>
</html>
2.访问 b.jsp ,查看会从四个域对象中取值
image-20201129224415206
3.注释 pageContext 对象,再次访问 b.jsp,查看取值
image-20201129224525125
4.注释 request 对象,再次访问 b.jsp ,查看取值
image-20201129224621778
5.注释 session 对象,再次访问 b.jsp , 查看取值
image-20201129224742342
6.总结:EL 表达式搜索域数据的顺序 , pageContext > request > session > application
c)EL 表达式输出 Bean 的普通属性,数组属性。List 集 合属性,map 集合属性
需求——输出 Person 类中普通属性,数组属性。list 集合属性和 map 集合属性。
1.创建 Person 类
image-20201129230325475
代码语言:javascript复制package pojo;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* @author Aron.li
* @date 2020/11/29 23:01
*/
public class Person {
//定义普通属性,数组属性。list 集合属性和 map 集合属性
private String name;
private String[] phones;
private List<String> cities;
private Map<String,Object> map;
//构造器
public Person() {
}
public Person(String name, String[] phones, List<String> cities, Map<String, Object> map) {
this.name = name;
this.phones = phones;
this.cities = cities;
this.map = map;
}
// toString
@Override
public String toString() {
return "Person{"
"name='" name '''
", phones=" Arrays.toString(phones)
", cities=" cities
", map=" map
'}';
}
// getter setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String[] getPhones() {
return phones;
}
public void setPhones(String[] phones) {
this.phones = phones;
}
public List<String> getCities() {
return cities;
}
public void setCities(List<String> cities) {
this.cities = cities;
}
public Map<String, Object> getMap() {
return map;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
}
2.创建 c.jsp,在里面创建 Person 类对象,并使用 EL 表达式输出
image-20201129231518019
代码语言:javascript复制<%@ page import="pojo.Person" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//创建Person对象
Person person = new Person();
//设置String属性
person.setName("肥子白");
//设置数组属性
person.setPhones(new String[]{"18610523456","18688886666","18699998888"});
//设置集合属性
List<String> cities = new ArrayList<String>();
cities.add("北京");
cities.add("上海");
cities.add("深圳");
person.setCities(cities);
//设置Map属性
Map<String,Object> map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
person.setMap(map);
//将Person存储在pageContext域对象
pageContext.setAttribute("p", person);
%>
输出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>
</html>
浏览器访问 c.jsp,如下:
image-20201129231618876
3.EL表达式取 Bean 对象的值是基于 getter 属性的
3.1 在 Person 类中,任意写一个 getAge() 方法,如下:
image-20201129231818001
3.2 在 c.jsp 中,使用 EL 表达式读取 age 的值,如下:
image-20201129232039165
d)EL 表达式——运算
语法:${ 运算表达式 } , EL 表达式支持如下运算符:
1. 关系运算
关系运算符 | 说明 | 范例 | 结果 |
---|---|---|---|
== 或 eq | 等于 | 或{ 5 eq 5 } | TRUE |
!= 或 ne | 不等于 | 或{ 5 ne 5 } | FALSE |
< 或 lt | 小于 | 或{ 3 lt 5 } | TRUE |
> 或 gt | 大于 | 或{ 2 gt 10 } | FALSE |
<= 或 le | 小于等于 | 或{ 5 le 12 } | TRUE |
>= 或 ge | 大于等于 | 或{ 3 ge 5 } | FALSE |
{ 5 eq 5 }TRUE!= 或 ne不等于
{ 5 ne 5 }FALSE< 或 lt小于
{ 3 lt 5 }TRUE> 或 gt大于
{ 2 gt 10 }FALSE<= 或 le小于等于
{ 5 le 12 }TRUE>= 或 ge大于等于
{ 3 ge 5 }FALSE
1.1 创建 jsp,演示关系运算如下
image-20201129232520444
代码语言:javascript复制<body>
<h1>关系运算符</h1>
${ 12 == 12 } 或 ${ 12 eq 12 } <br>
${ 12 != 12 } 或 ${ 12 ne 12 } <br>
${ 12 < 12 } 或 ${ 12 lt 12 } <br>
${ 12 > 12 } 或 ${ 12 gt 12 } <br>
${ 12 <= 12 } 或 ${ 12 le 12 } <br>
${ 12 >= 12 } 或 ${ 12 ge 12 } <br>
</body>
2. 逻辑运算
逻辑运算符 | 说明 | 范例 | 结果 |
---|---|---|---|
&& 或 and | 与运算 | { 12 == 12 && 12 < 11 } 或{ 12 == 12 and 12 < 11 } | FALSE |
|| 或 or | 或运算 | 或{ 12 == 12 or 12 < 11 } | TRUE |
! 或 not | 取反运算 | 或{not true } | FALSE |
{ 12 == 12 and 12 < 11 }FALSE|| 或 or或运算
{ 12 == 12 or 12 < 11 }TRUE! 或 not取反运算
{not true }FALSE
2.1 代码演示:
image-20201129232742809
代码语言:javascript复制<body>
<h1>逻辑运算</h1>
${ 12 == 12 && 12 > 11 } 或 ${ 12 == 12 and 12 > 11 } <br>
${ 12 == 12 || 12 > 11 } 或 ${ 12 == 12 or 12 > 11 } <br>
${ ! true } 或 ${ not true } <br>
</body>
3. 算数运算
算数运算符 | 说明 | 范例 | 结果 |
---|---|---|---|
| 加法 | ${ 12 18 } | 30 |
- | 减法 | ${ 18 - 8 } | 10 |
* | 乘法 | ${ 12 * 12 } | 144 |
/ 或 div | 除法 | 或{ 144 div 12 } | 12 |
% 或 mod | 取模 | { 144 % 10 } 或{ 144 mod 10 } | 4 |
{ 144 div 12 }12% 或 mod取模
{ 144 mod 10 }4
3.1 代码演示:
image-20201129233022576
代码语言:javascript复制<body>
<h1>算数运算</h1>
12 12 = ${ 12 12 } <br>
12 - 12 = ${ 12 - 12 } <br>
12 * 12 = ${ 12 * 12 } <br>
18 / 12 = ${ 18 / 12 } 或 ${ 18 div 12 }<br>
18 % 12 = ${ 18 % 12 } 或 ${ 18 mod 12 } <br>
</body>
4. empty 运算
empty 运算可以判断一个数据是否为空,如果为空,则输出 true,不为空输出 false。
以下几种情况为空:
1、值为 null 值的时候,为空
2、值为空串的时候,为空
3、值是 Object 类型数组,长度为零的时候
4、list 集合,元素个数为零
5、map 集合,元素个数为零
4.1 代码演示:
image-20201130074830399
代码语言:javascript复制<body>
<%
// 1、值为null值的时候,为空
request.setAttribute("emptyNull", null);
// 2、值为空串的时候,为空
request.setAttribute("emptyStr", ""); // 空字符串
request.setAttribute("notEmptyStr", "hello"); // 字符串不为空
// 3、值是Object类型数组,长度为零的时候
request.setAttribute("emptyArr", new Object[]{}); // 数组长度为零
request.setAttribute("notEmptyArr", new Object[]{1,2,3}); // 数组长度不为零
// 4、list集合,元素个数为零
// 4.1 非空list
List<String> list = new ArrayList<>();
list.add("add");
request.setAttribute("notEmptyList", list);
// 4.2 空list
ArrayList<Object> list1 = new ArrayList<>();
request.setAttribute("emptyList", list1);
// 5、map集合,元素个数为零
// 5.1 非空map
Map<String,Object> map = new HashMap<String, Object>();
map.put("key1", "value1");
request.setAttribute("notEmptyMap", map);
// 5.2 空map
HashMap<String, Object> map1 = new HashMap<>();
request.setAttribute("emptyMap", map);
%>
<%--1、值为null值的时候,为空--%>
emptyNull: ${ empty emptyNull } <br/>
<%--2、值为空串的时候,为空--%>
emptyStr: ${ empty emptyStr } <br/>
notEmptyStr: ${ empty notEmptyStr } <br/>
<%--3、值是Object类型数组,长度为零的时候--%>
emptyArr: ${ empty emptyArr } <br/>
notEmptyArr: ${ empty notEmptyArr } <br/>
<%--4、list集合,元素个数为零--%>
<%--4.1 非空list--%>
notEmptyList: ${ empty notEmptyList } <br/>
<%--4.2 空list--%>
emptyList: ${ empty emptyList } <br/>
<%--5、map集合,元素个数为零--%>
notEmptyMap: ${ empty notEmptyMap } <br/>
emptyMap: ${ empty emptyMap } <br/>
</body>
5. 三元运算
表达式 1?表达式 2:表达式 3
如果表达式 1 的值为真,返回表达式 2 的值,如果表达式 1 的值为假,返回表达式 3 的值。
示例:
image-20201130075158301
代码语言:javascript复制<%--三元表单时--%>
${ 12 == 13 ? "12等于13" : "12不等于13" }
6. “.”点运算 和 [] 中括号运算符
.
点运算,可以输出 Bean 对象中某个属性的值。
[]
中括号运算,可以输出有序集合中某个元素的值。
并且[]
中括号运算,还可以输出 map 集合中 key 里含有特殊字符的 key 的值。
示例:
image-20201130075955855
代码语言:javascript复制<body>
<%
//创建HashMap
Map<String,Object> map = new HashMap<String, Object>();
map.put("a", "a1Value");
map.put("a.a.a", "aaaValue"); // 设置特殊字符在key中
map.put("b b b", "bbbValue");
map.put("c-c-c", "cccValue");
request.setAttribute("map", map);
%>
<%--使用 . 获取map的值--%>
map.a: ${ map.a } <br>
<%--使用 [] 获取特殊字符key的值 --%>
map['a.a.a']: ${ map['a.a.a'] } <br>
map["b b b"]: ${ map["b b b"] } <br>
map['c-c-c']: ${ map['c-c-c'] } <br>
</body>
e)EL 表达式的 11 个隐含对象
EL 个达式中 11 个隐含对象,是 EL 表达式中自己定义的,可以直接使用。
变量 | 类型 | 作用 |
---|---|---|
pageContext | PageContextImpl | 它可以获取 jsp 中的九大内置对象 |
pageScope | Map<String,Object> | 它可以获取 pageContext 域中的数据 |
requestScope | Map<String,Object> | 它可以获取 Request 域中的数据 |
sessionScope | Map<String,Object> | 它可以获取 Session 域中的数据 |
applicationScope | Map<String,Object> | 它可以获取 ServletContext 域中的数据 |
param | Map<String,String> | 它可以获取请求参数的值 |
paramValues | Map<String,String[]> | 它也可以获取请求参数的值,获取多个值的时候使用。 |
header | Map<String,String> | 它可以获取请求头的信息 |
headerValues | Map<String,String[]> | 它可以获取请求头的信息,它可以获取多个值的情况 |
cookie | Map<String,Cookie> | 它可以获取当前请求的 Cookie 信息 |
initParam | Map<String,String> | 它可以获取在 web.xml 中配置的上下文参数 |
1. EL 获取四个特定域中的属性
代码语言:javascript复制pageScope ====== pageContext 域
requestScope ====== Request 域
sessionScope ====== Session 域
applicationScope ====== ServletContext 域
示例:
image-20201130081835846
代码语言:javascript复制<body>
<%
// 存储EL表达式可以读取的 四个域对象数据
request.setAttribute("key2", "request");
pageContext.setAttribute("key1", "pageContext1");
pageContext.setAttribute("key2", "pageContext2");
session.setAttribute("key2", "session");
application.setAttribute("key2", "application");
%>
<%--使用EL表达式读取 四个域对象的数据--%>
<%--EL表达式读取 request域对象的值--%>
requestScope: ---- ${ requestScope } <br>
requestScope.key2: ---- ${ requestScope.key2 } <br>
<%--EL表达式读取 pageContext 域对象的值--%>
pageContext.key1: ---- ${pageScope.key1} <br>
pageContext.key2: ---- ${pageScope.key2} <br>
<%--EL表达式读取 session 域对象的值--%>
sessionScope.key1: ---- ${sessionScope.key2} <br>
<%--EL表达式读取 application 域对象的值--%>
applicationScope.key1: ---- ${applicationScope.key2} <br>
</body>
2. pageContext 对象的使用
- 协议:
- 服务器 ip:
- 服务器端口:
- 获取工程路径:
- 获取请求方法:
- 获取客户端 ip 地址:
- 获取会话的 id 编号:
示例:
image-20201130230900242
代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--在表达式脚本中,使用request输出相关信息--%>
<h3>在表达式脚本中,使用request输出相关信息</h3>
request.getScheme() 它可以获取请求的协议: <%=request.getScheme()%> <br>
request.getServerName() 获取请求的服务器 ip 或域名: <%=request.getServerName()%> <br>
request.getServerPort() 获取请求的服务器端口号: <%=request.getServerPort()%> <br>
getContextPath() 获取当前工程路径: <%=request.getContextPath()%> <br>
request.getMethod() 获取请求的方式(GET 或 POST): <%=request.getMethod()%> <br>
request.getRemoteHost() 获取客户端的 ip 地址: <%=request.getRemoteHost()%> <br>
session.getId() 获取会话的唯一标识: <%=session.getId()%> <br>
<hr>
<%--使用EL表达式,输出相关信息--%>
<h3>使用EL表达式,输出相关信息</h3>
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>
<hr>
<%--简写EL表达式的技巧--%>
<%
//首先将request域对象存储在pageContext中
pageContext.setAttribute("req", request); // 那么后续调用 ${pageContext.request} ==> ${req}
pageContext.setAttribute("session", session); // 那么后续调用 ${pageContext.session} ==> ${session}
%>
<h3>简写EL表达式</h3>
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>
</html>
浏览器访问如下:http://127.0.0.1:8080/09_EL_JSTL/k.jsp
image-20201130230939522
3. EL 表达式其他隐含对象的使用
3.1 param 、paramValues 的使用
代码语言:javascript复制param Map<String,String> 它可以获取请求参数的值
paramValues Map<String,String[]> 它也可以获取请求参数的值,获取多个值的时候使用。
示例代码:
image-20201201074718047
代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
输出请求参数 param 的值: ${ param } <br>
输出请求参数 username 的值:${ param.username } <br>
输出请求参数 password 的值:${ param.password } <br>
<hr>
输出请求参数 paramValues 的值: ${ paramValues } <br>
输出请求参数 username 的值:${ paramValues.username[0] } <br>
输出请求参数 hobby 的值:${ paramValues.hobby[0] } <br>
输出请求参数 hobby 的值:${ paramValues.hobby[1] } <br>
</body>
</html>
请求浏览器:
代码语言:javascript复制http://localhost:8080/09_EL_JSTL/param.jsp?username=libai&password=666666&hobby=java&hobby=cpp
image-20201201074758713
3.2 header 、 headerValues 的使用
代码语言:javascript复制header Map<String,String> 它可以获取请求头的信息
headerValues Map<String,String[]> 它可以获取请求头的信息,它可以获取多个值的情况
示例代码:
image-20201201075537464
代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
输出请求头 header 的值: ${ header } <br>
输出请求头 User-Agent 的值:${ header['User-Agent'] } <br>
输出请求头 Connection 的值:${ header.Connection } <br>
<hr>
输出请求头 headerValues 的值: ${ headerValues } <br>
输出请求头 User-Agent 的值:${ headerValues['User-Agent'][0] } <br>
</body>
</html>
请求浏览器:
image-20201201075609725
3.3 cookie 的使用
代码语言:javascript复制cookie Map<String,Cookie> 它可以获取当前请求的 Cookie 信息
示例代码:
代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
获取 Cookie 的值: ${ cookie }
<hr>
获取 Cookie.JSESSIONID: ${ cookie.JSESSIONID }
<hr>
获取 Cookie 的名称:${ cookie.JSESSIONID.name }
<hr>
获取 Cookie 的值:${ cookie.JSESSIONID.value }
<hr>
</body>
</html>
请求浏览器如下:
image-20201201080112127
3.4 initParam 的使用
代码语言:javascript复制initParam Map<String,String> 它可以获取在 web.xml 中配置的<context-param>上下文参数
首先需要 web.xml 中的配置:
image-20201201080451264
代码语言:javascript复制<context-param>
<param-name>username</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql:///test</param-value>
</context-param>
示例代码:
image-20201201080743588
代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
输出 initParam 的值:${ initParam } <hr>
输出<Context-param>username 的值:${ initParam.username } <hr>
输出<Context-param>url 的值:${ initParam.url } <hr>
</body>
</html>
请求浏览器访问:
image-20201201080803712
2. JSTL 标签库
JSTL 标签库 全称是指 JSP Standard Tag Library JSP 标准标签库。是一个不断完善的开放源代码的 JSP 标签库。
EL 表达式主要是为了替换 jsp 中的表达式脚本,而标签库则是为了替换代码脚本。这样使得整个 jsp 页面变得更佳简洁。
JSTL 由五个不同功能的标签库组成。
功能范围 | URI | 前缀 |
---|---|---|
核心标签库--重点 | 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 |
在 jsp 标签库中使用 taglib 指令引入标签库
代码语言:javascript复制- CORE 标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- XML 标签库
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
- FMT 标签库
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
- SQL 标签库
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
- FUNCTIONS 标签库
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
f) JSTL 标签库的使用步骤
1、先导入 jstl 标签库的 jar 包。
taglibs-standard-impl-1.2.5.jar
taglibs-standard-spec-1.2.5.jar
设置Maven依赖如下:
代码语言:javascript复制<!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-impl -->
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-spec -->
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-spec</artifactId>
<version>1.2.5</version>
</dependency>
2、第二步,使用 taglib 指令引入标签库。
代码语言:javascript复制<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
image-20210228175941424
g) core 核心库使用
1. <c:set />(使用很少)
“作用:set 标签可以往域中保存数据 ”
示例代码:
代码语言:javascript复制<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
<c:set />
作用:set 标签可以往域中保存数据域对象.setAttribute(key,value);
scope 属性设置保存到哪个域
page 表示 PageContext 域(默认值)
request 表示 Request 域
session 表示 Session 域
application 表示 ServletContext 域
var 属性设置 key 是多少
value 属性设置值
--%>
<h3>保存pageContext域对象:</h3>
保存之前:${ pageScope.abc } <br>
<c:set scope="page" var="abc" value="abcValue"/>
保存之后:${ pageScope.abc } <br>
<hr>
<h3>保存Request域对象:</h3>
保存之前:${ requestScope.abc } <br>
<c:set scope="request" var="abc" value="abcValue"/>
保存之后:${ requestScope.abc } <br>
<hr>
<h3>保存Session域对象:</h3>
保存之前:${ sessionScope.abc } <br>
<c:set scope="session" var="abc" value="abcValue"/>
保存之后:${ sessionScope.abc } <br>
<hr>
<h3>保存ServletContext域对象:</h3>
保存之前:${ applicationScope.abc } <br>
<c:set scope="application" var="abc" value="abcValue"/>
保存之后:${ applicationScope.abc } <br>
</body>
</html>
浏览器显示如下:
image-20201202124021795
2. <c:if />
“if 标签用来做 if 判断。注意:没有 else 分支。 ”
示例代码:
代码语言:javascript复制<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2021/3/1
Time: 0:32
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
<c:if />
if 标签用来做 if 判断。
test 属性表示判断的条件(使用 EL 表达式输出)
--%>
<c:if test="${ 100 == 100}">
<h3>100等于100</h3>
</c:if>
<c:if test="${ 200 == 100}">
<h3>200等于100</h3>
</c:if>
</body>
</html>
浏览器显示如下:
image-20201202124627517
3. <c:choose> <c:when> <c:otherwise>
标签
“作用:多路判断。跟 switch ... case .... default 非常接近 ”
示例代码:
代码语言:javascript复制<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2021/3/1
Time: 0:33
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
<c:choose> <c:when> <c:otherwise>标签
作用:多路判断。跟 switch ... case .... default 非常接近
choose 标签开始选择判断
when 标签表示每一种判断情况
test 属性表示当前这种判断情况的值
otherwise 标签表示剩下的情况
<c:choose> <c:when> <c:otherwise>标签使用时需要注意的点:
1、标签里不能使用 html 注释,要使用 jsp 注释
2、when 标签的父标签一定要是 choose 标签
--%>
<c:choose>
<%-- 不能使用 html 注释,要使用 jsp 注释 --%>
<c:when test="${ requestScope.height > 190 }">
<h2>小巨人</h2>
</c:when>
<c:when test="${ requestScope.height > 180 }">
<h2>很高</h2>
</c:when>
<c:when test="${ requestScope.height > 170 }">
<h2>还可以</h2>
</c:when>
<c:otherwise>
<%-- when 标签的父标签一定要是 choose 标签 --%>
<c:choose>
<c:when test="${requestScope.height > 160}">
<h3>大于 160</h3>
</c:when>
<c:when test="${requestScope.height > 150}">
<h3>大于 150</h3>
</c:when>
<c:when test="${requestScope.height > 140}">
<h3>大于 140</h3>
</c:when>
<c:otherwise>
其他小于 140
</c:otherwise>
</c:choose>
</c:otherwise>
</c:choose>
</body>
</html>
浏览器请求如下:
image-20201202124942107
4. <c:forEach />
“作用:遍历输出使用。 ”
1. 遍历 1 到 10,输出
示例代码:
代码语言:javascript复制<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
遍历 1 到 10,输出
begin 属性设置开始的索引
end 属性设置结束的索引
var 属性表示循环的变量(也是当前正在遍历到的数据)
java的基本for写法:
for (int i = 1; i <= 10; i )
--%>
<h3>foreach遍历 1 到 10</h3>
<%--foreach遍历 1 到 10--%>
<c:forEach begin="1" end="10" var="i">
${i}
</c:forEach>
<hr>
<h3>在table表格中使用遍历 1 到 10</h3>
<table border>
<c:forEach begin="1" end="10" var="i">
<tr>
<td>第${i}行</td>
</tr>
</c:forEach>
</table>
</body>
</html>
浏览器显示如下:
image-20201202125656561
2. 遍历 Object 数组
示例代码:
代码语言:javascript复制<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
遍历 Object 数组
for (Object item: arr)
items 表示遍历的数据源(遍历的集合)
var 表示当前遍历到的数据
--%>
<%
//存储一个数组
request.setAttribute("arr", new String[]{"18610541354","18688886666","18699998888"});
%>
<%--遍历数组--%>
<c:forEach items="${ requestScope.arr }" var="item">
${ item } <br>
</c:forEach>
</body>
</html>
浏览器显示如下:
image-20201202223728567
3. 遍历 Map 集合
示例代码:
代码语言:javascript复制<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//存储一个Map
Map<String,Object> map = new HashMap<String, Object>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
//for ( Map.Entry<String,Object> entry : map.entrySet()) {
//}
//将map保存在request域对象
request.setAttribute("map", map);
%>
<%--遍历map--%>
<c:forEach items="${ requestScope.map }" var="entry">
<h1>${entry.key} = ${entry.value}</h1>
</c:forEach>
</body>
</html>
浏览器显示如下:
image-20201202223939426
4. 遍历 List 集合---list 中存放 Student 类,有属性:编号,用户名,密码,年龄, 电话信息
4.1 创建Student类:
image-20201202224151090
代码语言:javascript复制package pojo;
/**
* @author Aron.li
* @date 2020/12/2 22:40
*/
public class Student {
//编号,用户名,密码,年龄,电话信息
private Integer id;
private String username;
private String password;
private Integer age;
private String phone;
//构造器
public Student(Integer id, String username, String password, Integer age, String phone) {
this.id = id;
this.username = username;
this.password = password;
this.age = age;
this.phone = phone;
}
public Student() {
}
//getter setter
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
// toString
@Override
public String toString() {
return "Student{"
"id=" id
", username='" username '''
", password='" password '''
", age=" age
", phone='" phone '''
'}';
}
}
4.2 创建jsp 示例:
代码语言:javascript复制<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="pojo.Student" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%-- 4.遍历 List 集合---list 中存放 Student 类,有属性:编号,用户名,密码,年龄,电话信息--%>
<%
//创建一个list
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));
}
//将list存储在request域对象
request.setAttribute("stus", studentList);
%>
<%--
items 表示遍历的集合
var 表示遍历到的数据
begin 表示遍历的开始索引值
end 表示结束的索引值
step 属性表示遍历的步长值
varStatus 属性表示当前遍历到的数据的状态
for(int i = 1; i < 10; i =2)
--%>
<c:forEach begin="2" end="7" step="2" varStatus="status" items="${requestScope.stus}" var="stu">
stu.id: ${stu.id} <br>
stu.username: ${stu.username} <br>
stu.password: ${stu.password} <br>
stu.age: ${stu.age} <br>
stu.phone: ${stu.phone} <br>
status.begin: ${status.begin} <br>
status.end: ${status.end} <br>
status.step: ${status.step} <br>
<hr>
</c:forEach>
</body>
</html>
浏览器显示如下: