El表达式&JSTL标签库
代码语言:javascript复制El表达式的全称是:Expression Language 是表达式语言
作用:EL表达式主要是替代Jsp页面中的表达式脚本在Jsp页面中进行数据的输出;
页面中开启el表达式支持
代码语言:javascript复制<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false" %>
<body>
<%
request.setAttribute("name","伊丽莎白");
%>
表达式脚本输出key的值是:<%=request.getAttribute("name")%>
El表达式输出key的值是:${name}
</body>
输出
代码语言:javascript复制表达式脚本输出key的值是:伊丽莎白 El表达式输出key的值是:伊丽莎白
El表达式的格式:${表达式}
EL表达式在输出null的时候,输出的是空串。Jsp表达式脚本输出null值的时候输出null字符串;
EL表达式搜索域数据的顺序
代码语言:javascript复制<%
request.setAttribute("key","request");
pageContext.setAttribute("key","pageContext");
session.setAttribute("key","session");
application.setAttribute("key","application");
%>
<br/>
El取出的值是:${key}
输出:
代码语言:javascript复制El取出的值是:pageContext
当四个域中都有相同key数据的时候,El表达式会按照四个域的从小到大顺序去进行搜索,找到就输出;
El表达式输出Bean的普通属性,数组属性,List集合属性,map集合属性
生成一个book用于测试
代码语言:javascript复制public class Book {
private String name;
private String[] phones;
private List<String> category;
private Map<String,Object> map;
public Book() {
}
public Book(String name, String[] phones, List<String> category, Map<String, Object> map) {
this.name = name;
this.phones = phones;
this.category = category;
this.map = map;
}
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> getCategory() {
return category;
}
public void setCategory(List<String> category) {
this.category = category;
}
public Map<String, Object> getMap() {
return map;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
@Override
public String toString() {
return "Book{"
"name='" name '''
", phones=" Arrays.toString(phones)
", category=" category
", map=" map
'}';
}
}
jsp页面
代码语言:javascript复制<%
Book book = new Book();
book.setName("《钢铁是怎样炼成的》");
book.setPhones(new String[]{"1078","1234","8786"});
ArrayList<String> list = new ArrayList<>();
list.add("励志类");
list.add("故事类");
book.setCategory(list);
Map<String, Object> map = new HashMap<>();
map.put("k1","v1");
map.put("k2","v2");
map.put("k3","v3");
book.setMap(map);
pageContext.setAttribute("book",book);
%>
输出book:${book}<br/>
输出map:${book.map}
输出map中特定的值:${book.map.k3}
输出list:${book.category[1]}
输出:
代码语言:javascript复制输出book:Book{name='《钢铁是怎样炼成的》', phones=[1078, 1234, 8786], category=[励志类, 故事类], map={k1=v1, k2=v2, k3=v3}}
输出map:{k1=v1, k2=v2, k3=v3} 输出map中特定的值:v3 输出list:故事类
EL表达式------运算
EL关系运算
代码语言:javascript复制${5 == 5}或${5 eq 5} <br/>
${5 != 5}或${5 ne 5} <br/>
${5 < 5}或${5 lt 5} <br/>
${5 <= 5}或${5 le 5} <br/>
${5 > 5}或${5 gt 5} <br/>
${5 >= 5}或${5 ge 5} <br/>
输出
代码语言:javascript复制true或true
false或false
false或false
true或true
false或false
true或true
EL逻辑运算
代码语言:javascript复制${5 >= 5 && 5==5}或${5 >=5 and 5==5} <br/>
${5 >= 5 || 5==5}或${5 >=5 or 5==5} <br/>
${ !(5==5) } 或 ${not (5==5)} <br/>
输出
代码语言:javascript复制true或true
true或true
false 或 false
EL算数运算
代码语言:javascript复制${ 10 2 }<br/>
${ 10 - 2 }<br/>
${ 10 * 2 }<br/>
${ 10 / 2 }或${ 10 div 2 }<br/>
${ 10 % 2 }或${ 10 mod 2 }<br/>
输出
代码语言:javascript复制12
8
20
5.0或5.0
0或0
empty运算
可以判断一个数据是否为空,如果为空,则不输出true,不为空输出false;
以下几种情况为空:
1.值为null值时候,为空
2.值为空串的时候,为空
3.值是Object数组类型,长度为零的时候
4.list集合元素个数为零
5.map集合元素个数为零
代码语言:javascript复制<%
request.setAttribute("emptyTest",null);
request.setAttribute("emptyStr","");
request.setAttribute("emptyArr", new Object[]{});
ArrayList<Integer> integers = new ArrayList<>();
request.setAttribute("emptyList",integers);
HashMap<String,String> hashMap = new HashMap<>();
request.setAttribute("emptyMap",hashMap);
%>
true
true
true
true
true
三元运算
表达式1?表达式2:表达式3
如果表达式值为真返回表达式2的值 否则返回表达式三的值
"."运算和[]中括号运算符
.运算可以输出bean对象中某个属性的值
[]中括号运算,可以输出有序集合中某个元素的值。
并且[]括号运算,还可以输出map集合中key里含有特殊字符的key的值;
11个EL隐含对象
11个隐含对象是EL表达式中自己定义的们可以直接使用。
EL获取特定域中的属性
pageScope----------------pageContext域
requestScope------------request域
sessionScope------------session域
applicationScope------ application域
使用
代码语言:javascript复制<%
pageContext.setAttribute("key","pageContext");
request.setAttribute("key","request");
session.setAttribute("key","session");
application.setAttribute("key","application");
%>
${pageScope.key}
${requestScope.key}
${sessionScope.key}
${applicationScope.key}
输出
代码语言:javascript复制pageContext request session application
pageContext对象的使用
代码语言:javascript复制1.协议
2.服务器ip
3.服务器端口
4.获取工程路径
5.获取请求方法
6.获取客户端ip地址;
7.获取会话的id编号;
代码语言:javascript复制<%--获取请求的协议--%>
<%=request.getScheme()%>
<%=request.getServerName()%>
<%=session.getId()%>
协议:${pageContext.request.scheme}<br/>
服务器ip:${pageContext.request.serverName}<br/>
服务器端口:${pageContext.request.serverPort}<br/>
工程路径:${pageContext.request.contextPath}<br/>
请求方法:${pageContext.request.requestURI}<br/>
客户端ip地址:${pageContext.request.remoteHost}<br/>
获取会话的id编号:${pageContext.session.id}<br/>
输出
代码语言:javascript复制http localhost C68311AFB304EF1E1CBFEBB626C2CF52 协议:http
服务器ip:localhost
服务器端口:8080
工程路径:
请求方法:/expression.jsp
客户端ip地址:0:0:0:0:0:0:0:1
获取会话的id编号:C68311AFB304EF1E1CBFEBB626C2CF52
EL中其他对象的使用
代码语言:javascript复制 ${param}<br/>
${paramValues.name[0]}<br/>
${header}<br/>
${headerValues}<br/>
${cookie}<br/>
${initParam}<br/>
输出
代码语言:javascript复制{pass=123, name=zhangsan}
zhangsan
{sec-fetch-mode=navigate, sec-fetch-site=cross-site, accept-language=zh-CN,zh;q=0.9, cookie=JSESSIONID=5E9DCDC37E5BA99758765648246, sec-fetch-user=?1, (KHTML, like Gecko) 1 SLBChan/3, sec-fetch-dest=document}
{sec-fetch-mode=[Ljava.lang.String;@3bb706e4, sec-fetch-site=[Ljava.lang.String;@a68f86b, accept-language=[Ljava.lang.String;@74edb052, cookie=[Ljava.lang.String;@3ed0f533, sec-fetch-user=[Ljava.lang.String;@3d53442b, accept=[Ljava.lang.String;@7035584a, host=[Ljava.lang.String;@6943193e, upgrade-insecure-requests=[Ljava.lang.String;@50030048, connection=[Ljava.lang.String;@7756647f, cache-control=[Ljava.lang.String;@2d7b95d7, accept-encoding=[Ljava.lang.String;@5c80e3af, user-agent=[Ljava.lang.String;@14c9b937, sec-fetch-dest=[Ljava.lang.String;@5078424d}
{JSESSIONID=javax.servlet.http.Cookie@21dcb0b8}
{}
JSTL
JSTL标签库全称是指JSP Standard Tag Library Jsp标准标签库。是一个不断完善的开放源代码的JSP标签库。
EL表达式主要是为了替换Jsp中的表达式脚本,而标签库则是为了替换代码脚本,这样使得整个Jsp页面变得更加简洁;
在Jsp标签库中使用taglib指令引入标签库 JSTL标签库使用步骤:
1.先导入maven依赖
代码语言:javascript复制<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
2.使用用taglib指令引入标签库
代码语言:javascript复制<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Core核心库的使用
1、<c:set/>
代码语言:javascript复制set标签可以往域中保存数据
页面头设置:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" import="java.util.*" isELIgnored="false" pageEncoding="UTF-8" %>
域对象保存数据之前:${requestScope.name}<br/>
<c:set scope="request" var="name" value="王五"></c:set>
域对象保存数据之后:${requestScope.name}<br/>
代码语言:javascript复制 输出:
域对象保存数据之前:
域对象保存数据之后:王五
2、<C:if/>
代码语言:javascript复制<c:if test=${10==10}>
<h1>条件满足<h1>
</c:if>
满足 条件显示内容
3.<c:choose><c:when><c:otherwise> 作用:多路判断。跟switch … case …default 非常接近
代码语言:javascript复制choose标签开始选择判断
when标签表示每一种判断情况 匹配一种输出不再往下进行
test表示当前这种判断情况的值
otherwise表示剩下的情况
例子:
<c:set scope="request" var="num" value="45"></c:set>
<c:choose>
<c:when test="${requestScope.nums>50}">
<h3>大于50</h3>
</c:when>
<c:when test="${requestScope.num<50}">
<h3>小于50</h3>
</c:when>
<c:when test="${requestScope.num==50}">
<h3>等于于50</h3>
</c:when>
<c:otherwise>
<h3>其他数值</h3>
</c:otherwise>
</c:choose>
输出:
小于50
注意事项:1.标签里不能使用html注释,要使用Jsp注释
2.when标签里的父标签一定要是choose标签
3.<c:forEach>标签
作用:遍历输出使用
begin属性设置开始索引
end属性设置结束的索引
var属性表示遍历的变量
例子:遍历输出1-5
<c:forEach begin="0" end="5" var="i">
${ i }
</c:forEach>
输出
0 1 2 3 4 5
遍历Object数组
<%
request.setAttribute("arr",new String[]{"111","222","333"});
%>
<c:forEach items="${requestScope.arr}" var="item">
<%--items 表示要遍历的数据源 var 表示当前遍历到的数据--%>
${item}
</c:forEach>
遍历Map集合
<%
HashMap<String, Object> map = new HashMap<>();
map.put("k1","v1");
map.put("k2","v2");
map.put("k3","v3");
request.setAttribute("map",map);
%>
<c:forEach items="${requestScope.map}" var="entry">
key为:${entry.key}<br/>
value为:${entry.value}<br/>
</c:forEach>
输出
value为:v1
key为:k2
value为:v2
key为:k3
value为:v3
forEach属性 step:步长 varStatus:表示当前遍历到的数据的状态
status实现了下面的接口 拥有以下方法
public interface LoopTagStatus {
//获取当前遍历到的数据
Object getCurrent();
//获取遍历的索引
int getIndex();
//表示遍历的个数
int getCount();
//表示当前遍历的是第一条或最后一条
boolean isFirst();
boolean isLast();
//获取对应的属性值
Integer getBegin();
Integer getEnd();
Integer getStep();
}
测试
<c:forEach items="${requestScope.map}" var="entry" varStatus="status">
<tr>
<td>key为:${entry.key}</td>
<td>value为:${entry.value}</td>
<td>${status.current}</td>
<td>${status.index}</td>
<td>${status.count}</td>
<td>${status.first}</td>
<td>${status.last}</td>
<br/>
</tr>
</c:forEach>
输出
key为:k1 value为:v1 k1=v1 0 1 true false
key为:k2 value为:v2 k2=v2 1 2 false false
key为:k3 value为:v3 k3=v3 2 3 false true