5.ELJSTL
1 EL表达式
1.1 什么是EL表达式,EL表达式的作用?
EL表达式的全称是:Expression Language,是表达式语言。
作用:EL表达式主要代替jsp页面中的表达式脚本在jsp页面中进行数据的输出==>EL表达式在输出数据的时候,要比jsp的表达式脚本要简洁很多。
格式:${表达式}
注意:EL表达式在输出NULL值的时候,输出为""空串,而非NULL
1.2 EL表达式搜索域数据的数据
EL表达式主要是为了在jsp页面中输出域对象中存储的数据。如果出现重名的情况下,优先输出域范围小的值,如果想要输出指定域中的值,可以使用sessionScope等对象指定输出。
<%
request.setAttribute("key","value");
session.setAttribute("key","session");
%>
jsp的表达式脚本:<%=request.getAttribute("key")%>
EL表达式:
${pageScope.values()}
${requestScope.values()}
${sessionScope.values()}
${applicationScope.values()}
1.3 EL表达式的使用
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方法。
1.4 EL表达式–运算
1)关系运算

2)逻辑运算

3)算数运算符

4)empty运算:判断一个数据是否为空,是则输出true,否则输出false
格式:${empty key}
以下几种情况为空:返回为true
-
值为null值的时候
-
值为空串的时候,为空
-
值为Object类型数组,长度为零的时候
-
list集合,元素个数为零
-
map集合,元素个数为零
5)三元运算
表达式1?表达式2:表达式3==>如果表达式1的值为真,则返回表达式2,否则返回表达式3。
6)点运算,[ ]运算
- 点运算:输出Bean对象中某个属性的值,可以输出map中不含有特殊字符的key的值。
- [ ]中的运算:输出有序集合中某个元素的值,并且可以输出map集合中key里含有特殊字符(例如:“-”)的key的值。例如:${ map[‘a.a.a.a’]}
7)字符串的拼接
使用+=来实现字符串的拼接。
1.5 El表达式中的11个隐含对象
| 变量 | 类型 | 作用 |
|---|---|---|
| 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)其他隐含对象的使用
- param和paramValue的使用
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}
2 JSTL
2.1 什么是JSTL标签库?
JSTL全称为JSP Standarded Tag Library。jsp标准标签库,是开源的jsp标签库,非jsp的规范,使用的时候需要导入jar包。
EL表达式主要为了替换jsp中的表达式脚本,而标签库是为了替换代码脚本。使得jsp页面变得更加简洁。
2.2 JSTL由五个不同功能的标签库组成。

2.3 使用步骤
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” %>
2.4 一些常见的用法
<%--c:set:可以往域中保存数据scope属性设置保存到哪个域。var属性设置key是多少value属性设置值
--%>
保存之前:${requestScope.username}
保存之后:${requestScope.username}
<%--c:if:用来做if判断test属性用来设置判断的条件,使用EL表达式
--%>
龙哥帅气
<%--c:choose;c:when;c:otherwise:配合使用实现多路判断。类似为switch--casechoose标签开始进行判断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}
当前页面路径
">当前页面路径
2.5 status类实现的接口中定义的一些方法
| 方法 | 作用 |
|---|---|
| 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
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
