EL表达式的全称是:Expression Language,是表达式语言。
作用:EL表达式主要代替jsp页面中的表达式脚本在jsp页面中进行数据的输出==>EL表达式在输出数据的时候,要比jsp的表达式脚本要简洁很多。
格式:${表达式}
注意:EL表达式在输出NULL值的时候,输出为""空串,而非NULL
EL表达式主要是为了在jsp页面中输出域对象中存储的数据。如果出现重名的情况下,优先输出域范围小的值,如果想要输出指定域中的值,可以使用sessionScope等对象指定输出。
<%
request.setAttribute("key","value");
session.setAttribute("key","session");
%>
jsp的表达式脚本:<%=request.getAttribute("key")%>
EL表达式:
${pageScope.values()}
${requestScope.values()}
${sessionScope.values()}
${applicationScope.values()}
bean的属性,数组属性,List集合属性,map集合属性。
<%
//定义伪造一些数据,用来测试El的输出是否存在问题。
Person person=new Person();
person.setName("龙哥帅");
person.setPhones(new String[]{"111111","2222222","333333"});
ArrayList list = new ArrayList<>();
list.add("洛阳");
list.add("郑州");
list.add("杭州");
person.setCities(list);
HashMap map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
person.setMap(map);
pageContext.setAttribute("person",person);
%>
<%--输出person对象,重写了toString之后,输出则为toString的信息--%>
${person}
<%--输出属性:name。调用的是getName方法--%>
${person.name}
<%--输出数组--%>
${person.phones[0]}
<%--输出list集合--%>
${person.cities}
<%--输出list集合中的某个下标的值:下标从0开始--%>
${person.cities[1]}
<%--输出map中信息--%>
${person.map}
<%--输出map中的某个key的值--%>
${person.map.key1}
注意:当输出为javaBean的属性的时候:输出的时候找的不是那个属性,而是那个获取属性的方法,默认调用的为get方法。
2)逻辑运算
3)算数运算符
4)empty运算:判断一个数据是否为空,是则输出true,否则输出false
格式:${empty key}
以下几种情况为空:返回为true
值为null值的时候
值为空串的时候,为空
值为Object类型数组,长度为零的时候
list集合,元素个数为零
map集合,元素个数为零
5)三元运算
表达式1?表达式2:表达式3==>如果表达式1的值为真,则返回表达式2,否则返回表达式3。
6)点运算,[ ]运算
7)字符串的拼接
使用+=来实现字符串的拼接。
变量 | 类型 | 作用 |
---|---|---|
pageContext | pageContextImpl | 获取jsp中的九大内置对象 |
pageScope | Map |
获取pageContext域中的数据 |
requestScope | Map |
获取request域中的数据 |
sessionScope | Map |
获取session域中的数据 |
applicationScope | Map |
获取application域中的数据 |
param | Map |
获取请求参数的值 |
paramValues | Map |
获取请求参数的多个值 |
header | Map |
获取请求头的信息 |
headerValues | Map |
获取请求头,多个值的情况 |
cookie | Map |
当前请求的cookie信息 |
initParam | Map |
获取web.xml中配置的 |
1)EL获取四个特定域中属性
域对象 | 获取域对象中存储的值 |
---|---|
pageScope | ${pageScope.key} |
requestScope | ${requestScope.key} |
sessionScope | ${sessionScope.key} |
applicationScope | ${applicationScope.key} |
<%
request.setAttribute("key","value");
session.setAttribute("key","session");
%>
jsp的表达式脚本:<%=request.getAttribute("key")%>
EL表达式:
${pageScope.values()}
${requestScope.values()}
${sessionScope.values()}
${applicationScope.values()}
2)pageContext
获取jsp九大内置对象。
<%--常见的使用方式--%>
协议:${pageContext.request.scheme}
服务器的ip:${pageContext.request.serverName}
服务器的端口号:${pageContext.request.serverPort}
工程路径:${pageContext.request.contextPath}
请求的方式:${pageContext.request.method}
获取客户端ip:${pageContext.request.remoteHost}
获取会话sessionID:${pageContext.session.id}
<%--可以将request存到域对象中,然后使用req调用方法--%>
<%pageContext.setAttribute("req",request);%>
${req.scheme}
3)其他隐含对象的使用
http://localhost:8080/10_EL_JSTL/otherElE.jsp?username=%22%E5%BC%A0%E4%B8%89%22&hobby=football&hobby=basketball
<%--param的使用:输出请求的参数,如果多个value则只能输出第一个value--%>
${param} <%--默认输出是key-value--%>
${param.username}
<%--paramValues使用:输出key对应多个值--%>
${paramValues.hobby}
${paramValues.hobby[1]}
<%--header和headerValues的使用:获取请求头的信息--%>
${header}
${header['User-Agent']} <%--因为存在特殊符号,所以需要使用[]来进行输出--%>
${headerValues['User-Agent'][0]}
<%--cookie的使用--%>
${cookie.JSESSIONID}
${cookie.JSESSIONID.name}
${cookie.JSESSIONID.value}
<%--initParam的使用,获取上下文参数--%>
${initParam}
${initParam.username}
JSTL全称为JSP Standarded Tag Library。jsp标准标签库,是开源的jsp标签库,非jsp的规范,使用的时候需要导入jar包。
EL表达式主要为了替换jsp中的表达式脚本,而标签库是为了替换代码脚本。使得jsp页面变得更加简洁。
1)导入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” %>
<%--c:set:可以往域中保存数据
scope属性设置保存到哪个域。
var属性设置key是多少
value属性设置值
--%>
保存之前:${requestScope.username}
保存之后:${requestScope.username}
<%--c:if:用来做if判断
test属性用来设置判断的条件,使用EL表达式
--%>
龙哥帅气
<%--c:choose;c:when;c:otherwise:配合使用实现多路判断。类似为switch--case
choose标签开始进行判断
when标签开始判断每一种情况
otherwise标签表示其他情况
代码会从上到下开始执行,一旦满足,则执行完代码跳出循环。
注意点:1.标签内不要使用HTML注释,;如果需要使用注释,则使用JSP注释/<%----/%>
2.c:when使用的时候,其父标签一定要是c:choose。可以用来实现嵌套。
--%>
你是姚明
你长得真高
三级残废
<%--c:foreach:遍历输出使用
begin属性设置起始值。
end属性设置结束值。
var属性表示循环的变量(也是当前正在遍历到的数据)。
step属性设置步长,如果不设置,默认为1.
--%>
<%--1.遍历1-10 --%>
第${i}行
<%--2.遍历Object数组
items属性设置遍历的数据源.
var表示当前遍历的数据
--%>
<%
request.setAttribute("arr",new String[]{"zhangsan","lisi","wangwu"});
%>
${item}
<%--3.遍历map
--%>
<%
HashMap map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
request.setAttribute("map",map);
%>
${key}
${key.key}==${key.value}
<%--4.foreach遍历list集合--%>
<%
ArrayList students = new ArrayList<>();
students.add(new Student(1,"张三","1997",23,"111111"));
students.add(new Student(2,"李四","1990",30,"222222"));
students.add(new Student(3,"王五","1987",33,"333333"));
request.setAttribute("stus",students);
%>
id
username
password
age
phone
操作
${item.id}
${item.username}
${item.password}
${item.age}
${item.phone}
<%--
var表示遍历到的数据
items表示遍历的集合
begin-end表示遍历的开始索引值以及结束索引[begin,end],索引从0开始。
varStatus:是当前遍历到的数据的状态。输出发现是一个内部类,实现了一个接口。接口口中存在一些方法。
--%>
id
username
password
age
phone
操作
${item.id}
${item.username}
${item.password}
${item.age}
${item.phone}
${status.current}
其他标签的使用:
core中常用的标签
1.catch标签:
<%--1.catch:如果代码出现异常,则进行捕获,并存入到page域中 --%>
<%=1/0 %>
${e}
2.out标签:
<%--2.out:输出内容到页面中去 ,escapeXml="true":默认将里面的内容当成字符串进行输出,如果改为false则会对
其中的内容进行解析。
--%>
3.set标签:
<%--3.set:往指定的域中添加属性,默认为pageContext中添加属性.scope来指定需要添加到的指定域--%>
4.redirect标签:
<%--4.redirect:重定向,默认路径修改为当前项目下。 --%>
<%-- --%>
5.remove标签:
<%--5.remove:移除指定域的指定属性,如果不设置则移除所有域中的该属性 --%>
6.if标签:
<%--6.if:if判断。test属性添加需要测试的条件 --%>
message=${requestScope.message}
7.choose标签:
<%--7.choose:进行判断。配合c:when,c:otherwise来进行使用 --%>
你是姚明
你长得真高
三级残废
8.foreach标签:
<%--8.foreach:循环 ,将变量i放到pageContext域中--%>
8.1foreach遍历数:
index=${index.index},i=${i}
8.2foreach遍历数组:
<% int[] arr=new int[]{1,2,3,3,2,1};
request.setAttribute("arr", arr);
%>
${status.index}==${i}
8.3foreach遍历对象数组:
<%
request.setAttribute("names",new String[]{"zhangsan","lisi","wangwu"});
%>
${item}
<%--遍历map--%>
8.4foreach遍历map:
<%
HashMap map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
request.setAttribute("map",map);
%>
${entry}
${entry.key}==${entry.value}
9.url标签:
<%--9.url:会自动在前面添加项目的路径--%>
当前的项目路径: ${pageContext.request.contextPath}
当前页面路径
当前页面路径
方法 | 作用 |
---|---|
public Object getCurrent() | 表示获取当前遍历到的对象 |
public int getIndex() | 表示获取遍历的索引 |
public int geCount() | 表示遍历的个数 |
public boolean isFirst() | 表示是否是第一个 |
public boolean isLast() | 是否是最后一个 |
public Integer getBegin() | 获取begin的属性值 |
public Integer getEnd() | 获取end属性值 |
public Integer getStep() | 获取step的属性值 |
拓展:jstl标签库的源码
taglibs-standard-1.2.1-source-release.zip
dex() | 表示获取遍历的索引 |
| public int geCount() | 表示遍历的个数 |
| public boolean isFirst() | 表示是否是第一个 |
| public boolean isLast() | 是否是最后一个 |
| public Integer getBegin() | 获取begin的属性值 |
| public Integer getEnd() | 获取end属性值 |
| public Integer getStep() | 获取step的属性值 |
拓展:jstl标签库的源码
taglibs-standard-1.2.1-source-release.zip