5.EL&JSTL

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)关系运算
5.EL&JSTL_第1张图片

2)逻辑运算
在这里插入图片描述
3)算数运算符
5.EL&JSTL_第2张图片
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由五个不同功能的标签库组成。

5.EL&JSTL_第3张图片

2.3 使用步骤

1)导入jar包。

taglibs-standard-impl-1.2.1.jar

taglibs-standard-spec-1.2.1.jar

2)使用taglib引入标签库。

<%@taglib prefix=“curi=“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--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}
当前页面路径 当前页面路径

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

你可能感兴趣的:(javaweb,java,jsp)