28. EL 表达式 以及 JSTL 标签库

2021-11-19 16:13:53 浏览数 (1)

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

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 && 12 < 11 } 或

{ 12 == 12 and 12 < 11 }FALSE|| 或 or或运算

{ 12 == 12 || 12 < 11 } 或

{ 12 == 12 or 12 < 11 }TRUE! 或 not取反运算

{ !true } 或

{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 / 12 } 或

{ 144 div 12 }12% 或 mod取模

{ 144 % 10 } 或

{ 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: &nbsp; ${ map.a } <br>

<%--使用 [] 获取特殊字符key的值 --%>
map['a.a.a']: &nbsp; ${ map['a.a.a'] } <br>
map["b b b"]: &nbsp; ${ map["b b b"] } <br>
map['c-c-c']: &nbsp; ${ 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 对象的使用
  1. 协议:
  2. 服务器 ip:
  3. 服务器端口:
  4. 获取工程路径:
  5. 获取请求方法:
  6. 获取客户端 ip 地址:
  7. 获取会话的 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>
    输出&lt;Context-param&gt;username 的值:${ initParam.username } <hr>
    输出&lt;Context-param&gt;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>

浏览器显示如下:

0 人点赞