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")%><br />
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<String> list = new ArrayList<>();
    list.add("洛阳");
    list.add("郑州");
    list.add("杭州");
    person.setCities(list);
    HashMap<String, Object> 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}<br/>
<%--输出属性:name。调用的是getName方法--%>
        ${person.name}<br />
<%--输出数组--%>
        ${person.phones[0]}<br/>
<%--输出list集合--%>
        ${person.cities}<br/>
<%--输出list集合中的某个下标的值:下标从0开始--%>
        ${person.cities[1]}<br />
<%--输出map中信息--%>
        ${person.map}<br />
<%--输出map中的某个key的值--%>
        ${person.map.key1}<br />

注意:当输出为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个隐含对象
变量类型作用
pageContextpageContextImpl获取jsp中的九大内置对象
pageScopeMap<String,Object>获取pageContext域中的数据
requestScopeMap<String,Object>获取request域中的数据
sessionScopeMap<String,Object>获取session域中的数据
applicationScopeMap<String,Object>获取application域中的数据
paramMap<String,String>获取请求参数的值
paramValuesMap<String,String[]>获取请求参数的多个值
headerMap<String,String>获取请求头的信息
headerValuesMap<String,String[]>获取请求头,多个值的情况
cookieMap<String,cookie>当前请求的cookie信息
initParamMap<String,String>获取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")%><br />
EL表达式:
${pageScope.values()}
${requestScope.values()}
${sessionScope.values()}
${applicationScope.values()}

2)pageContext

获取jsp九大内置对象。

<%--常见的使用方式--%>
        协议:${pageContext.request.scheme}<br/>
        服务器的ip:${pageContext.request.serverName}<br />
        服务器的端口号:${pageContext.request.serverPort}<br/>
        工程路径:${pageContext.request.contextPath}<br/>
        请求的方式:${pageContext.request.method}<br/>
        获取客户端ip:${pageContext.request.remoteHost}<br/>
        获取会话sessionID:${pageContext.session.id}<hr/>
<%--可以将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}<hr/>
<%--paramValues使用:输出key对应多个值--%>
        ${paramValues.hobby}<br>
${paramValues.hobby[1]}
<%--header和headerValues的使用:获取请求头的信息--%>
        ${header}<hr/>
        ${header['User-Agent']} <%--因为存在特殊符号,所以需要使用[]来进行输出--%>
        ${headerValues['User-Agent'][0]}<hr/>
<%--cookie的使用--%>
        ${cookie.JSESSIONID}<br/>
        ${cookie.JSESSIONID.name} <br/>
        ${cookie.JSESSIONID.value} <hr/>
<%--initParam的使用,获取上下文参数--%>
        ${initParam}<br/>
        ${initParam.username}<hr/>

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=“curi=“http://java.sun.com/jsp/jstl/core” %>

2.4 一些常见的用法
<%--c:set:可以往域中保存数据
    scope属性设置保存到哪个域。
    var属性设置key是多少
    value属性设置值
--%>
保存之前:${requestScope.username}
<c:set scope="request" var="username" value="lisi" />
保存之后:${requestScope.username}<hr/>
<%--c:if:用来做if判断
    test属性用来设置判断的条件,使用EL表达式
--%>
<c:if test="${12>10}">
    <h2>龙哥帅气</h2>
</c:if>
<%--c:choose;c:when;c:otherwise:配合使用实现多路判断。类似为switch--case
    choose标签开始进行判断
    when标签开始判断每一种情况
    otherwise标签表示其他情况
    代码会从上到下开始执行,一旦满足,则执行完代码跳出循环。
    注意点:1.标签内不要使用HTML注释,<!---->;如果需要使用注释,则使用JSP注释/<%----/%>
            2.c:when使用的时候,其父标签一定要是c:choose。可以用来实现嵌套。
--%>
<c:set scope="page" var="height" value="199"/>
<c:choose >
    <c:when test="${pageScope.height>200}">
        <h2>你是姚明</h2>
    </c:when>
    <c:when test="${pageScope.height>180}">
        <h2>你长得真高</h2>
    </c:when>
    <c:otherwise>
        <h2>三级残废</h2>
    </c:otherwise>
</c:choose>
<%--c:foreach:遍历输出使用
    begin属性设置起始值。
    end属性设置结束值。
    var属性表示循环的变量(也是当前正在遍历到的数据)。
    step属性设置步长,如果不设置,默认为1.
--%>
<%--1.遍历1-10 --%>
<table>
    <c:forEach begin="1" end="10" var="i" step="1">
        <tr>
            <td style="border: grey solid 1px">第${i}行</td>
        </tr>
    </c:forEach>
</table>
<hr>
<%--2.遍历Object数组
    items属性设置遍历的数据源.
    var表示当前遍历的数据
    --%>
<%
    request.setAttribute("arr",new String[]{"zhangsan","lisi","wangwu"});
%>
<c:forEach items="${requestScope.arr}" var="item">
    ${item}
</c:forEach>
<hr/>
<%--3.遍历map
--%>
<%
    HashMap<String, Object> map = new HashMap<>();
    map.put("key1","value1");
    map.put("key2","value2");
    map.put("key3","value3");
    request.setAttribute("map",map);
%>
<c:forEach items="${requestScope.map}" var="key">
    ${key}
    ${key.key}==${key.value}
</c:forEach>
<hr/>
<%--4.foreach遍历list集合--%>
<%
    ArrayList<Student> 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);
%>
<table>
    <tr>
        <td>id</td>
        <td>username</td>
        <td>password</td>
        <td>age</td>
        <td>phone</td>
        <td>操作</td>
    </tr>
    <c:forEach items="${stus}" var="item">
        <tr>
            <td>${item.id}</td>
            <td>${item.username}</td>
            <td>${item.password}</td>
            <td>${item.age}</td>
            <td>${item.phone}</td>
            <td><button>修改</button>
                <button>删除</button>
            </td>
        </tr>
    </c:forEach>
</table>
<hr/>
<%--
    var表示遍历到的数据
    items表示遍历的集合
    begin-end表示遍历的开始索引值以及结束索引[begin,end],索引从0开始。
    varStatus:是当前遍历到的数据的状态。输出发现是一个内部类,实现了一个接口。接口口中存在一些方法。
--%>
<table>
    <tr>
        <td>id</td>
        <td>username</td>
        <td>password</td>
        <td>age</td>
        <td>phone</td>
        <td>操作</td>
    </tr>
    <c:forEach begin="1" end="2" items="${stus}" var="item" varStatus="status">
        <tr>
            <td>${item.id}</td>
            <td>${item.username}</td>
            <td>${item.password}</td>
            <td>${item.age}</td>
            <td>${item.phone}</td>
            <td>${status.current}</td>

            <td><button>修改</button>
                <button>删除</button>
            </td>
        </tr>
    </c:forEach>
</table>

其他标签的使用:

<h1>core中常用的标签</h1>
<h2>1.catch标签:</h2>
<%--1.catch:如果代码出现异常,则进行捕获,并存入到page域中 --%>
<c:catch var="e">
	<%=1/0 %>
</c:catch>
${e}<br/>
<h2>2.out标签:</h2>
<%--2.out:输出内容到页面中去 ,escapeXml="true":默认将里面的内容当成字符串进行输出,如果改为false则会对
	其中的内容进行解析。
--%>
<c:out value="1+1" default="" escapeXml=""/> <br />
<c:out value="${e1}" default="暂时还没有这个变量"/> <br />
<h2>3.set标签:</h2>
<%--3.set:往指定的域中添加属性,默认为pageContext中添加属性.scope来指定需要添加到的指定域--%>
<c:set var="aa" value="scope" />
<c:set scope="request" var="bb" value="bbscope"/>
<h2>4.redirect标签:</h2>
<%--4.redirect:重定向,默认路径修改为当前项目下。 --%>
<%-- <c:redirect url="/login.jsp"/> --%>
<h2>5.remove标签:</h2>
<%--5.remove:移除指定域的指定属性,如果不设置则移除所有域中的该属性 --%>
<c:remove var="cc" scope="request"/>
<h2>6.if标签:</h2>
<%--6.if:if判断。test属性添加需要测试的条件 --%>
<c:if test="${not empty requestScope.message}">
	message=${requestScope.message}<br/>	
</c:if>
<h2>7.choose标签:</h2>
<%--7.choose:进行判断。配合c:when,c:otherwise来进行使用 --%>
<c:set scope="page" var="height" value="199"/>
<c:choose >
    <c:when test="${pageScope.height>200}">
        <h2>你是姚明</h2>
    </c:when>
    <c:when test="${pageScope.height>180}">
        <h2>你长得真高</h2>
    </c:when>
    <c:otherwise>
        <h2>三级残废</h2>
    </c:otherwise>
</c:choose>
<h2>8.foreach标签:</h2>
<%--8.foreach:循环 ,将变量i放到pageContext域中--%>
<h4>8.1foreach遍历数:</h4>
<c:forEach var="i" begin="1" end="10" step="2" varStatus="index">
	index=${index.index},i=${i}
</c:forEach><br />
<h4>8.2foreach遍历数组:</h4>
<% int[] arr=new int[]{1,2,3,3,2,1};
	request.setAttribute("arr", arr);
%>
<c:forEach var="i" items="${arr}" varStatus="status">
	${status.index}==${i}
</c:forEach><br />
<h4>8.3foreach遍历对象数组:</h4>
<%
request.setAttribute("names",new String[]{"zhangsan","lisi","wangwu"});
%>
<c:forEach items="${requestScope.names}" var="item" >
	${item}
</c:forEach><br />
<%--遍历map--%>
<h4>8.4foreach遍历map:</h4>
<%
    HashMap<String, Object> map = new HashMap<>();
    map.put("key1","value1");
    map.put("key2","value2");
    map.put("key3","value3");
    request.setAttribute("map",map);
%>
<c:forEach items="${requestScope.map}" var="entry">
    ${entry}
    ${entry.key}==${entry.value}
</c:forEach>
<h2>9.url标签:</h2>
<%--9.url:会自动在前面添加项目的路径--%>
<c:url value="/jstl.jsp"></c:url><br/>
当前的项目路径: ${pageContext.request.contextPath}<br />
<a href="/javaweb_01/jstl.jsp">当前页面路径</a>
<a href="<c:url value='/jstl.jsp'/>">当前页面路径</a>
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值