让天下没有难学的技术
09-EL表 达 式 & JSTL标签库 讲师:王振国
今日任务
1.EL 表达式
a) 什么是 EL 表达式, EL 表达式的作用?
EL表达式的全称是:Expression Language 。 是表达式语言。
EL表达式的什么作用: EL 表达式主要是代替jsp页面中的表达式脚本在 jsp页面中进行数据的输出。 因为 EL 表达式在输出数据的时候,要比 jsp 的表达式脚本要简洁很多。
<%
request.setAttribute(“key”,“值”);
%>
表达式脚本输出 key 的值是:
<%=request.getAttribute(“key1”)==null?“”:request.getAttribute(“key1”)%>
EL 表达式输出 key 的值是:${key1}
EL表达式的格式是:${表达式}
EL表达式在输出null值的时候,输出的是空串。jsp 表达式脚本输出 null值的时候,输出的是 null 字符串。
b)EL 表达式搜索域数据的顺序
EL 表达式主要是在 jsp 页面中输出数据。
主要是输出域对象中的数据。
当四个域中都有相同的 key 的数据的时候, EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。
**<%** _//往四个域中都保存了相同的key 的数据。_ **request.setAttribute("key","request");**
让天下没有难学的技术
session.setAttribute(“key”,“session”);
application.setAttribute(“key”,“application”);
pageContext.setAttribute(“key”,“pageContext”);
%>
${key ]
</body>
山 尚硅谷
c)EL 表达式输出 Bean 的普通属性,数组属性。List 集
合属性, map 集合属性
i. 需求——输出Person类中普通属性,数组属性。list 集合属性和 map 集合属性。
Person 类
public class Person {
// i. 需求—输出Person 类中普通属性,数组属性。list 集合属性和map 集合属性。
**private **String name;
**private **String[]phones;
**private **Listcities;
**private **Map<String,Object>map;
**public int **getAge(){
return 18;
}
输出的代码 :
<%
Person person =new Person();
person.setName(" 国哥好帅! ");
person.setPhones(new String[]{“18610541354”,“18688886666”,“18699998888”});
Listcities =new ArrayList();
cities.add(“北京”);
cities.add(" 上海");
cities.add(“深圳“);
person.setCities(cities);
Map<String,Object>map =new HashMap<>();
map.put(“key1”,“value1”);
map.put(“key2”,“value2”);
map.put(“key3”,“value3”);
person.setMap(map);
山尚硅谷
pageContext.setAttribute(“p”,person);
%>
输出 Person:
p
<
b
r
/
>
输出
P
e
r
s
o
n
的
n
a
m
e
属性:
{p }<br/> 输出 Person 的 name 属性:
p<br/>输出Person的name属性:{p.name}
输出 Person
输出 Person
输 出Person
输出 Person
输出 Person
输出 Person
k/body>
pnones 数组属性值:
p
.
p
h
o
n
e
s
[
2
]
<
b
r
>
c
i
t
i
e
s
集合中的元素值:
{p.phones[2]}<br> cities 集合中的元素值:
p.phones[2]<br>cities集合中的元素值:{p.cities}
List 集合中个别元素值:
p
.
c
i
t
i
e
s
[
2
]
<
b
r
>
M
a
p
集合:
{p.cities[2]}<br> Map集合:
p.cities[2]<br>Map集合:{p.map}
Map 集合中某个 key 的值:
p
.
m
a
p
.
k
e
y
3
<
b
r
>
a
g
e
属性:
{p.map.key3}<br> age 属性:
p.map.key3<br>age属性:{p.age}
让天下没有难学的技术
的
的 的
的
的 的
d)EL 表达式——运算
语 法 : $ { 运 算 表 达 式 } , EL 表达式支持如下运算符:
1)关系运算
关系运算符 | 说 明 | 范 例 | 结果 |
---|---|---|---|
==或eq | 等于 | 5 = = 5 或 { 5==5 }或 5==5或{ 5eq5 } | true |
!=或ne | 不等于 | 5 ! = 5 或 {5!=5 }或 5!=5或{ 5ne 5} | false |
<或It | 小于 | 3 < 5 或 { 3<5}或 3<5或{3 It5} | true |
> 或 g t | 大于 | 2 > 10 或 { 2>10 }或 2>10或{ 2 gt 10 } | false |
<=或le | 小于等于 | 5 < = 12 或 {5<=12}或 5<=12或{5le 12 } | true |
>= 或 ge | 大于等于 | 3 > = 5 或 {3>=5}或 3>=5或{3ge 5 } | false |
2)逻辑运算
逻辑运算符 | 说 明 | 范 例 | 结果 |
---|---|---|---|
& & 或 a n d | 与运算 | S{12 ==12&&12<11}或${12 ==12 and 12<11 } | false |
Ⅱ或or | 或运算 | S{12==12||12<11}或${12 ==12 or 12<11} | true |
! 或not | 取反运算 | ! t r u e 或 {!true}或 !true或{not true } | false |
3)算数运算
算数运算符 | 说 明 | 范 例 | 结果 |
---|
让天下没有难学的技术
十 | 加法 | ${12 | +18 | } | 30 | ||
---|---|---|---|---|---|---|---|
减法 | ${18 | -8 | } | 10 | |||
乘法 | ${12 | *12 | } | 144 | |||
/或div | 除法 | ${144 | /12 }或 | ${1 | 44 div | 12 } | 12 |
%或mod | 取模 | ${144 | %10 }或 | ${1 | 44 mod | 10 } | 4 |
i.empty 运算
empty 运算可以判断一个数据是否为空,如果为空,则输出 true,不为空输出 false。
以下几种情况为空:
1、值为 null 值的时候,为空
2、值为空串的时候,为空
3、值是 Object类型数组,长度为零的时候
4、list 集合,元素个数为零
5、map 集合,元素个数为零
kbody>
<%
1、值为null 值的时候,为空
request.setAttribute(“emptyNull”,null);
// 2、值为空串的时候,为空
request.setAttribute(“emptyStr”,“”);
// 3、值是Object类型数组,长度为零的时候
request.setAttribute(“emptyArr”,new Object[]{});
// 4、List集合,元素个数为零
Listlist = new ArrayList<>();
// list.add(“abc”);
request.setAttribute(“emptyList”,list);
// 5,map 集合,元素个数为零
Map<String,Object>map =new HashMap<String,Object>();
// map.put(“key1”,“value1”);
request.setAttribute(“emptyMap”,map);
%>
${empty ${empty ${empty ${empty
${empty
emptyNull emptyStr emptyArr emptyList emptyMap
}
}
}
}
}
ii. 三元运算
表达式1?表达式2:表达式3
如果表达式1的值为真,返回表达式2的值,如果表达式1的值为假,返回表达式3的值。
让天下没有难学的技术
示例:
${12!=12 ?“ 国 哥 帅 呆”:“ 国哥又骗人啦” }
iii.“” 点运算和[]中括号运算符
.点运算,可以输出 Bean 对象中某个属性的值。
□中括号运算,可以输出有序集合中某个元素的值。
并且[]中括号运算,还可以输出 map 集 合 中key 里含有特殊字符的 key 的值。
request.setAttribute(“map”,map);
%>
${map[‘a.a.a’]}
${map[“b+b+b”]}
${map[‘c-c-c’]}
e)EL 表达式的11个隐含对象
EL个达式中11个隐含对象,是EL 表达式中自己定义的,可以直接使用。
变量
pageContext
pageScope
requestScope
sessionScope
applicationScope
param
paramValues
header
headerValues
cookie
类型
PageContextlmpl
Map<String,Object>
Map<String,Object>
Map<String,Object>
Map<String,Object>
Map<String,String>
Map<String,String[]>
Map<String,String>
Map<String,String[]>
Map<String,Cookie>
作用
它可以获取 jsp中的九大内置对象
它可以获取 pageContext 域中的数据
它可以获取 Request 域中的数据
它可以获取 Session 域中的数据
它可以获取 ServletContext 域中的数据
它可以获取请求参数的值
它也可以获取请求参数的值,获取多个值的时候使用。
它可以获取请求头的信息
它可以获取请求头的信息,它可以获取多个值的情况
它可以获取当前请求的 Cookie 信 息
让天下没有难学的技术
**initParam **Map<String,String> 它可以获取在 web .xml 中配置的上下文参数
i.EL 获取四个特定域中的属性
pageScope
requestScope
sessionScope
applicationScope
======
======
pageContext 域
Request 域
Session 域
ServletContext 域
<%
pageContext.setAttribute(“key1”,“pageContext1”);
pageContext.setAttribute(“key2”,“pageContext2”);
request.setAttribute(“key2”,“request”);
session.setAttribute(“key2”,“session”);
application.setAttribute(“key2”,“application”);
%>
${applicationScope.key2 }
</body>
ii.pageContext 对象的使用
- 协议;
- 服务器ip:
- 服务器端口:
4. 获取工程路径: -
获取请求方法:
- 获取客户端 ip 地址:
- 获取会话的id 编号:
<%–
request.getScheme() 它可以获取请求的协议
request.getServerName() 获取请求的服务器ip或域名
request.getServerPort() 获取请求的服务器端口号
getContextPath() 获取当前工程路径
request.getMethod() 获取请求的方式 (GET 或POST)
request.getRemoteHost() 获取客户端的ip 地址
session.getId() 获取会话的唯一标识
–%>
<%
pageContext.setAttribute(“req”,request);
%>
<%=request.getScheme()%>
山 尚硅谷
1.协议:
r
e
q
.
s
c
h
e
m
e
<
b
r
>
2.
服务器
i
p
:
{ req.scheme }<br> 2. 服务器ip:
req.scheme<br>2.服务器ip:{pageContext.request.serverName
3. 服务器端口:KaTeX parse error: Expected '}', got 'EOF' at end of input: …Port 4. 获取工程路径:{ pageContext.request.contextPath 5. 获取请求方法:KaTeX parse error: Expected '}', got 'EOF' at end of input: …. 获取客户端 ip 地址:{ pageContext.request.remoteHost 7. 获取会话的id 编号:${ pageContext.session.id
}
}
}
**让天下没有难学的技术** }
}
iii.EL 表达式其他隐含对象的使用
param
paramValues
Map<String,String>
Map<String,String[]>
它可以获取请求参数的值
它也可以获取请求参数的值,获取多个值的时候使用。
示例代码:
| 输出请求参数username的值:
p
a
r
a
m
.
u
s
e
r
n
a
m
e
<
b
r
>
输出请求参数
p
a
s
s
w
o
r
d
的值:
{param.username }<br> 输出请求参数password的值:
param.username<br>输出请求参数password的值:{param.password }
输出请求参数username的值:
p
a
r
a
m
V
a
l
u
e
s
.
u
s
e
r
n
a
m
e
[
0
]
<
b
r
)
输出请求参数
h
o
b
b
y
的值:
{paramValues.username[0]}<br) 输出请求参数hobby的值:
paramValues.username[0]<br)输出请求参数hobby的值:{paramValues.hobby[θ]}
输出请求参数hobby的值:${paramValues.hobby[1]} |
---|
请求地址:
http://localhost:8080/09_EL_JSTL/other el obj .jsp?username=wzg168&password=666666&hobby=java&hobby=cpp
header
headerValues
Map<String,String>
Map<String,String[]>
它可以获取请求头的信息
它可以获取请求头的信息,它可以获取多个值的情况
示例代码:
| 输出请求头【User-Agent】的值: h e a d e r [ ′ U s e r − A g e n t ′ ] < b r > 输出请求头【 C o n n e c t i o n 】的值: {header['User-Agent']}<br> 输出请求头【Connection】的值: header[′User−Agent′]<br>输出请求头【Connection】的值:{header.Connection }<br)
输出请求头【User-Agent】的值:${headerValues[‘User-Agent’][θ]} |
---|
cookie Map<String,Cookie> 它可以获取当前请求的 Cookie 信息
示例代码:
的名称:KaTeX parse error: Expected 'EOF', got '}' at position 52: …取 Cookie }<br> }̲<br> 的值:{ cookie.JSESSIONID.value
让天下没有难学的技术
|
initParam
web.xml 中的配置: |
Map<String,String> |
它可以获取在 webxml |
中配置的上下文参数 |
| — | — | — | — |
|
****username
root
url
jdbc:mysql:///test
</context-param> | | | |
|
示例代码: | | | |
输出81t;Context-param>username 的值:KaTeX parse error: Expected 'EOF', got '&' at position 30: …ername }<br> 输出&̲1t;Context-para…{ initParam.url }
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 指令引入标签库
<%@taglib prefix="c"uri=“http://java.sun.com/jsp/jstl/core”%>
CORE 标 签 库
让天下没有难学的技术
~~ <%@taglib prefix="x"uri=“”%> ~~http://java.sun.com/jsp/jstl/xmL
FMT 标 签 库
<%@taglib prefix="fmt"uri=“http://java.sun.com/jsp/jstl/fmt”%>
SQtglib 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.1.jar
taglibs-standard-spec-1.2.1.jar
2、第二步,使用 taglib 指令引入标签库。
<%@taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core"%>
g)core 核心库使用
i.<c:set/> (使用很少)
作用: set 标签可以往域中保存数据
<%–
i.<c:set />
作用:set 标签可以往域中保存数据
域对象.setAttribute(key,value);
scope 属性设置保存到哪个域
page 表示PageContext 域(默认值)
request表示Request域
session 表示Session 域
application 表示ServletContext 域
var 属性设置key是多少
value属性设置值
–%>
保存之前:
∗
∗
∗
∗
s
e
s
s
i
o
n
S
c
o
p
e
.
a
b
c
∗
∗
∗
∗
<
b
r
>
∗
∗
∗
∗
<
c
:
s
e
t
s
c
o
p
e
=
"
s
e
s
s
i
o
n
"
v
a
r
=
"
a
b
c
"
v
a
l
u
e
=
"
a
b
c
V
a
l
u
e
"
/
>
∗
∗
∗
∗
保存之后:
{** **sessionScope.abc** **}<br>** **<c:set scope="session"var="abc"value="abcValue"/>** **保存之后:
∗∗∗∗sessionScope.abc∗∗∗∗<br>∗∗∗∗<c:setscope="session"var="abc"value="abcValue"/>∗∗∗∗保存之后:{ sessionscope.abc }
让天下没有难学的技术
ii.<c:if />
if 标签用来做 if 判断。
<%- -
ii.<c:if />
if标签用来做if判断。
test 属性表示判断的条件(使用EL 表达式输出)
–%>
kc:if test=“${12 ==12 }”>
12 等于12
**:**: test="${12 !=12 }">12 不等于12
iii.<c:choose><c:when><c:otherwise> 标签
作用:多路判断。跟 switch …case …default 非常接近
<%- -
iii.<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 标签
–%>
k%
request.setAttribute(“height”,180);
%>
kc:choose>
<%–这是html注释–%>
**<c:when test =“
∗
∗
r
e
q
u
e
s
t
S
c
o
p
e
.
h
e
i
g
h
t
>
190
"
>
∗
∗
<
h
2
>
小巨人
<
/
h
2
>
∗
∗
∗
∗
<
/
c
:
w
h
e
n
>
∗
∗
<
c
:
w
h
e
n
t
e
s
t
=
"
{** requestScope.height >190 }"> **<h2>小巨人</h2>** **</c:when>** <c:when test="
∗∗requestScope.height>190">∗∗<h2>小巨人</h2>∗∗∗∗</c:when>∗∗<c:whentest="{requestscope.height >180
}”>
很高
****还可以
****山尚硅谷
让天下没有难学的技术
<c:otherwise>
<c:choose>
<c:when test=“${requestScope.height >160}”>
大于160
****大于150
****大于140
**** **** 其他小于140 <**/c:otherwise>** **** **** <**/c:choose>**iv.<c:forEach />
作用:遍历输出使用。
1. 遍 历 1 到 1 0 , 输 出
示例代码:
k%–1.遍历1到10,输出
begin属性设置开始的索引
end 属性设置结束的索引
表示循正在遍历到的数据)
–%>
<c:forEach begin="1"end="10"var=“i”>
</c:forEach>
< /table>
第${i} 行 |
2. 遍历 Object数组
示例代码:
山 尚硅谷
让天下没有难学的技术
k%–2. 遍历Object数组
for(Object item:arr)
items 表示遍历的数据源(遍历的集合)
var 表示当前遍历到的数据
–%>
<%
request.setAttribute(“arr”,new String[]{“18610541354”,“18688886666”,“18699998888”});
%>
<c:forEach items="
r
e
q
u
e
s
t
S
c
o
p
e
.
a
r
r
"
v
a
r
=
"
i
t
e
m
"
>
∗
∗
{requestScope.arr }"var="item"> **
requestScope.arr"var="item">∗∗{item }
**
</c:forEach>
3. 遍历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()){
// }
request.setAttribute(“map”,map);
%>
<c:forEach items="
r
e
q
u
e
s
t
S
c
o
p
e
.
m
a
p
"
v
a
r
=
"
e
n
t
r
y
"
>
∗
∗
∗
∗
<
h
1
>
{requestScope.map }"var="entry">** **<h1>
requestScope.map"var="entry">∗∗∗∗<h1>{entry.key}=${entry.value}
</c:forEach>
4. 遍历List 集合–list 中存放 Student 类,有属性:编号,用户名,密码,年龄,
电 话 信 息
Student类:
public class Student {
//4.编号,用户名,密码,年龄,电话信息
**private **Integer id;
**private **String username;
**private **String password;
**private **Integer age;
private String phone;
示例代码:
让天下没有难学的技术
<%–4.遍历List集合—List 中存放Student类,有属性:编号,用户名,密码,年龄,电话信息–%>
k %
ListstudentList =new ArrayList();
for(int i=1;i<=10;i++){
studentList.add(new Student(i,“username”+i ,“pass”+i,18+i,“phone”+i));
}
request.setAttribute(“stus”,studentList);
%>
<%–
items 表示遍历的集合
var 表示遍历到的数据
begin 表示遍历的开始索引值
end 表示结束的索引值
step 属性表示遍历的步长值
varStatus 属性表示当前遍历到的数据的状态
for(inti=1;i<10;i+=2)
–%>
begin="2"end="7"step="2"varStatus=“status"items=”${requestScope.stus}"var=“stu”>
kc:forEach
编号 | 用户名 | 密码 | 年龄 | 电话</th) | 操作 |
---|
s
t
u
.
i
d
<
/
t
d
>
∗
∗
∗
∗
<
t
d
>
{stu.id}</td>** **<td>
stu.id</td>∗∗∗∗<td>{stu.username}
${stu.password}