09_尚硅谷_EL表达式&JSTL标签库_王振国 - 课堂笔记

让天下没有难学的技术
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/>输出Personname属性:{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 }或${144 div12 }12
%或mod取模${144%10 }或${144 mod10 }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 的值。

<% Map

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 对象的使用

  1. 协议;
  2. 服务器ip:
  3. 服务器端口:
    4. 获取工程路径:
  4. 获取请求方法:
    
  5. 获取客户端 ip 地址:
  6. 获取会话的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[UserAgent]<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/coreC
格式化http://java.sun.com/jsp/jstl/fmtfmt
函数http://java.sun.com/jsp/jstl/functionsfn
数据库(不使用http://java.sun.com/jsp/jstl/sqlsql
XML(不使用)http://java.sun.com/jsp/jstl/xmlX

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}

${stu.age} ${stu.phone} ${status.step} <**/c:forEach>**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值