EL表达式
Expression Language 。是表达式语言
EL表达式主要是代替jsp页面中的表达式脚本在jsp页面中进行数据的输出。比jsp表达式更加简洁
<body>
<%
request.setAttribute("key","值");
%>
表达式脚本输出的key的值:<%=request.getAttribute("key")%><br/>
EL表达式输出的:${key};
</body>
注:EL表达式在输出空字符串时,输出的就是空;而jsp输出的是null
EL 表达式搜索域数据的顺序
EL 表达式主要是在 jsp 页面 中输出数据
主要是输出域对象中的数据
当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。
<body>
<%
// 往四个域中都保存了相同的 key 的数据。
request.setAttribute("key", "request");
session.setAttribute("key", "session");
application.setAttribute("key", "application");
pageContext.setAttribute("key", "pageContext");
%>
${key};
</body>
EL 表达式输出 Bean 的普通属性,数组属性。List 集 合属性,map 集合属性
//先在person类中添加set/get方法
public class person {
private String name;
private String[] phones;
private List<String> cities;
private Map<String,Object> map;
}
<body>
<%
person person = new person();
person.setName("h");
person.setPhones(new String[]{"12345", "12315", "112"});
List<String> cities=new ArrayList<>();
cities.add("北京");
cities.add("上海");
cities.add("深圳");
person.setCities(cities);
Map<String,Object> map=new HashMap<>();
map.put("k1", "v1");
map.put("k2", "v2");
map.put("k3", "v3");
person.setMap(map);
pageContext.setAttribute("person", person);
%>
输出person:${person}<br/>
输出person的name属性值:${person.name}
输出 Person 的 cities 集合中的元素值:${p.cities} <br>
输出 Person 的 List 集合中个别元素值:${p.cities[2]} <br>
输出 Person 的 Map 集合: ${p.map} <br>
输出 Person 的 Map 集合中某个 key 的值: ${p.map.key3} <br>
</body>
EL表达式—运算
${ 运算表达式 }
结果返回true/false
//关系运算
${1==1} 或 ${1 eq 1}
//逻辑运算
${ 12 == 12 && 12 < 11 } 或 ${ 12 == 12 and 12 < 11 }
//算术运算
${1+1}
empty 运算
可以判断一个数据是否为空,如果为空,则输出 true,不为空输出 false
<body>
<%
// 1、值为 null 值的时候,为空
request.setAttribute("emptyNull", null);
// 2、值为空串的时候,为空
request.setAttribute("emptyStr", "");
// 3、值是 Object 类型数组,长度为零的时候
request.setAttribute("emptyArr", new Object[]{});
// 4、list 集合,元素个数为零
List<String> list = 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 emptyNull } <br/>
${ empty emptyStr } <br/>
${ empty emptyArr } <br/>
${ empty emptyList } <br/>
${ empty emptyMap } <br/>
</body>
. 点运算 和 [] 中括号运算符
.点运算,可以输出 Bean 对象中某个属性的值。
[]中括号运算,可以输出有序集合中某个元素的值。 并且[]中括号运算,还可以输出 map 集合中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>
EL 表达式的 11 个隐含对象
EL 个达式中 11 个隐含对象,是 EL 表达式中自己定义的,可以直接使用
**
i. EL 获取四个特定域中的属性
pageScope pageContext 域
requestScope Request 域
sessionScope Session 域
applicationScope ServletContext 域
<body>
<%
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 对象的使用
<body>
<%--
request.getScheme() 它可以获取请求的协议
request.getServerName() 获取请求的服务器 ip 或域名
request.getServerPort() 获取请求的服务器端口号
getContextPath() 获取当前工程路径
request.getMethod() 获取请求的方式(GET 或 POST)
request.getRemoteHost() 获取客户端的 ip 地址
session.getId() 获取会话的唯一标识
--%>
<%
pageContext.setAttribute("req", request);
%>
<%=request.getScheme() %> <br>
//EL表达式语句· 方法是获取它的get方法取值
1.协议: ${ req.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>
</body>
iii. EL 表达式其他隐含对象的使用
<body>
输出请求参数 username 的值:${ param.username } <br>
输出请求参数 password 的值:${ param.password } <br>
输出请求参数 hobby 的值:${ paramValues.hobby[0] } <br>
输出请求参数 hobby 的值:${ paramValues.hobby[1] } <br>
输出请求头[User-Agent]的值:${ header['User-Agent'] } <br>
输出请求头[Connection]的值:${ header.Connection } <br>
输出请求头[User-Agent]的值:${ headerValues['User-Agent'][0] } <br>
获取 Cookie 的名称:${ cookie.JSESSIONID.name } <br>
获取 Cookie 的值:${ cookie.JSESSIONID.value } <br>
输出Context-paramusername 的值:${ initParam.username } <br>
输出Context-paramurl 的值:${ initParam.url } <br>
</body>
JSTL 标签库
JSTL 标签库是指 JSP Standard Tag Library JSP 标准标签库。是一个不断完善的开放源代码的 JSP 标签库。 <br /> EL 表达式主要是为了替换 jsp 中的表达式脚本,而**标签库则是为了替换代码脚本**。这样使得整个 jsp 页面 变得更佳简洁。
JSTL 由五个不同功能的标签库组成
功能范围 | URL | 前缀 |
---|---|---|
核心标签库 | https://java.sun.com/jsp/jstl/core | c |
格式化 | https://java.sun.com/jsp/jstl/frmt | frmt |
函数 | https://java.sun.com/jsp/jstl/functions | fn |
数据库(不使用) | https://java.sun.com/jsp/jstl/sql | sql |
XML(不使用) | https://java.sun.com/jsp/jstl/xml | x |
//导入依赖
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-spec</artifactId>
<version>1.2.5</version>
</dependency>
core核心库使用
<body>
//<c:set/>标签
<%--set标签可以向域中保存数据--%>
保存之前:${ sessionScope.abc } <br>
<c:set scope="session" var="abc" value="abcValue"/>
保存之后:${ sessionScope.abc } <br>
//<c:if/>标签 用来做if判断
<c:if test="${1==1}"> //test属性表示判断条件(用EL表达式输出)
<span>1=1</span>
</c:if>
//<c:choose> <c:when> <c:otherwise>标签 多路判断
<%
request.setAttribute("height", 175);
%>
<c:choose> //choose标签表示开始选择判断
<c:when test="${ requestScope.height > 180 }">
<h2>高</h2> //test属性表示当前这种情况的判断值
</c:when> //when标签表示每一种判断情况
<c:when test="${ requestScope.height > 170 }">
<h2>还可以</h2>
</c:when>
<c:otherwise> //类似于switch语句的 default结尾
<c:choose> //when标签的父标签必须是choose标签
<c:when test="${requestScope.height > 160}">
<h3>大于 160</h3>
</c:when>
<c:otherwise>
其他小于 160
</c:otherwise>
</c:choose>
</c:otherwise>
</c:choose>
//forEach表示遍历
<c:forEach begin="1" end="10" var="i">
${i}
</c:forEach> //遍历对象类型数组
<%
request.setAttribute("arr", new String[]{"A","B","C"});
%>
<c:forEach items="${ requestScope.arr }" var="item">
${ item } <br>
</c:forEach>
//遍历map
<%
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>
//foreach标签属性
item: 表示遍历的集合
var 表示遍历的数据
step 表示遍历的步长
varstatus 表示当前遍历到的数据的状态
<c:forEach begin="1" end="7" varStatus="sta">
${sta.current}<br/>
${sta.index}<br/>
${sta.count}<br/>
</c:forEach>
</body>