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个隐含对象
变量 | 类型 | 作用 |
---|---|---|
pageContext | pageContextImpl | 获取jsp中的九大内置对象 |
pageScope | Map<String,Object> | 获取pageContext域中的数据 |
requestScope | Map<String,Object> | 获取request域中的数据 |
sessionScope | Map<String,Object> | 获取session域中的数据 |
applicationScope | Map<String,Object> | 获取application域中的数据 |
param | Map<String,String> | 获取请求参数的值 |
paramValues | Map<String,String[]> | 获取请求参数的多个值 |
header | Map<String,String> | 获取请求头的信息 |
headerValues | Map<String,String[]> | 获取请求头,多个值的情况 |
cookie | Map<String,cookie> | 当前请求的cookie信息 |
initParam | Map<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=“c” uri=“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标签库的源码