1.EL表达式
a)什么是EL表达式,作用?
全称:Expression language,是表达式语言
作用:代替jsp页面中的表达式脚本在jsp页面进行数据的输出。
<body>
<%
request.setAttribute("key","111");
%>
表达式脚本输出值:<%=request.getAttribute("key")%><br>
EL表达式输出值:${key}
</body>
EL表达式的格式是:${表达式}
EL表达式在输出null值的时候为空串;jsp表达式在输出null值的时候,输出的是null字符串。
b)EL表达式搜索域数据的顺序
EL表达式主要是在jsp页面输出数据。
主要是输出域对象数据
当四个域有相同key的数据的时候,按四个域大小顺序从小到大搜索输出
<body>
<%
// pageContext.setAttribute("key","PageContext");
request.setAttribute("key","request");
session.setAttribute("key","session");
application.setAttribute("key","application");
%>
${key}
</body>
c)EL表达式输出Bean的普通属性、数组属性、List集合属性,map属性
<body>
<%
Person person = new Person();
person.setName("lili");
person.setPhone(new String[]{"1231","12323"});
ArrayList<String> strings = new ArrayList<>();
strings.add("北京");
strings.add("上海");
strings.add("天津");
person.setCities(strings);
HashMap<String, Object> stringObjectHashMap = new HashMap<>();
stringObjectHashMap.put("key1","value1");
stringObjectHashMap.put("key2","value2");
person.setMap(stringObjectHashMap);
pageContext.setAttribute("p",person);
%>
输出Person:${p};<br>
输出Person的name属性:${p.name};<br>
输出Person的Phone数组个别属性值:${p.phone[0]};<br>
输出Person的cities集合中的元素值:${p.cities};<br>
输出Person的cities集合中的个别元素值:${p.cities[0]};<br>
输出Person的Map集合:${p.map};<br>
输出Person的Map集合的value值:${p.map.values()};<br>
</body>
d)EL表达式——运算
1)关系运算
${1 == 2} 或 ${12 eq 12}<br>
${12 != 1} 或 ${12 ne 12}<br>
${12 < 12} 或 ${12 lt 12}<br>
${12 > 12} 或 ${12 gt 12}<br>
${12 <= 12} 或 ${12 le 12}<br>
${12 >= 12} 或 ${12 ge 12}<br>
2)逻辑运算
${12 == 12 && 12< 12} or ${12 == 12 and 12<12} <br>
${12 == 12 || 12<12} or ${12 == 12 or 12<12} <br>
${!true} or ${not true}<br>
3)算数运算
${12 + 12}<br>
${12 - 12}<br>
${12 * 12}<br>
${12 / 12} or ${12 div 12}
${18 % 12} or ${18 mod 12}<br>
4)empty运算
empty运算可以判断一个数据是否为空,如果为空,则输出true,不空输出false。
以下几种情况为空:
- 值为null值时为空
- 值为空串时为空
- 值是object类型数组,长度为0时为空
- list集合,元素个数为空
- map集合,元素个数为0
${empty emptyNull}<br>
${empty emptyStr}<br>
${empty emptyArr}<br>
${empty emptyList}<br>
${empty emptyMap}<br>
5)三元运算
${1==2?"yes":"no"}
6) .点运算和[]中括号运算
.点运算,可以输出Bean对象中某个属性的值。
[]中括号运算,可以输出有序集合中某个元素的值,且可以输出map集合中key里含有特殊字符的key的值。
<body>
<%
HashMap<String, String> map = new HashMap<>();
map.put("a","aValue");
map.put("a.a.a","aaaValue");
map.put("b+b+b","bbbValue");
map.put("c-c-c","cccValue");
request.setAttribute("map",map);
%>
${map.a}<br>
${map["a.a.a"]}<br>
${map["b+b+b"]}<br>
${map["c-c-c"]}<br>
</body>
e)EL表达式的11个隐含对象
变量 | 类型 | 作用 |
pageContext | PageContextImpl | 可以获取jsp中的九大内置对象 |
pageScope | Map<String,Object> | 可以获取pageContext域中的数据 |
requestScope | Map<String,Object> | 可以获取Request域中的数据 |
sessionScope | Map<String,Object> | 可以获取Session域中的数据 |
applicationScope | Map<String,Object> | 可以获取ServletContext域中的数据 |
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中配置的<context.param>上下文参数 |
i.EL获取四个特定域中的属性
<body>
<%
pageContext.setAttribute("key","pageContext1");
request.setAttribute("key","request");
session.setAttribute("key","session");
application.setAttribute("key","application");
%>
${pageScope.key}<br>
${requestScope.key}<br>
${sessionScope.key}<br>
${applicationScope.key}<br>
</body>
ii.pageContext对象的使用
- 协议
- 服务器ip
- 服务器端口
- 获取工程路径
- 获取请求方法
- 获取用户ip
- 获取会话的id编号
<%--
request.getScheme()获取请求的协议
request.getServerName() 获取请求的服务器ip或域名
request.getServerPort() 获取请求服务器端口号
request.getContextPath() 获取请求服务器的工程路径
request.getMethod() 获取请求的方式
request.getRemoteHost() 获取客户端ip
session.getId() 获取会话的唯一标识
--%>
<%=request.getScheme()%>
<%=request.getServerName()%>
<%=request.getServerPort()%>
<%=request.getContextPath()%>
<%=request.getMethod()%>
<%=request.getRemoteHost()%>
<%=session.getId()%>
<br>
协议: ${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>
获取会话的id编号:${pageContext.session.id}<br>
iii.EL表达式其他隐含对象的使用
<body>
<%--
?username=lili&password=111&hobby=p&hobby=h
--%>
输出请求参数的值:${param.hobby}<br>
输出请求参数的值(有多个值):${paramValues.hobby[1]}<br>
<hr>
输出请求头信息:${header}<br>
<hr>
输出请求头【User-Agent】信息:${header['User-Agent']}<br>
<hr>
输出请求头【User-Agent】信息(有多个值):${headerValues['User-Agent'][0]}<br>
<hr>
输出cookie对象:${cookie.JSESSIONID}<br>
输出cookie名称:${cookie.JSESSIONID.name}<br>
输出cookie值:${cookie.JSESSIONID.value}<br>
<hr>
<%--
<context-param>
<param-name>yuyu</param-name>
<param-value>1213</param-value>
</context-param>
--%>
获取web.xml文件中的<context-param>:${initParam}
</body>
2. JSTL标签库
EL表达式主要是替代jsp中的表达式脚本,标签库则是替代代码脚本
JSTL有五个不同功能的标签库组成:
功能范围 | URI(taglib指令导入使用) | 前缀 |
核心标签库 | <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> | c |
格式化 | <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> | fmt |
函数 | <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> | fn |
数据库(不使用) | <%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %> | sql |
XML(不使用) | <%@taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %> | x |
f)JSTL标签库的使用步骤
- 先导入jstl标签库的jar包
- 使用taglib指令导入标签库
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
e) core核心库使用
i.<c:set />
<body>
存数据前:${requestScope.abc}<br>
<c:set scope="request" var="abc" value="abcValue"/>
存数据后:${requestScope.abc}<br>
</body>
作用:set标签可以在域中存数据,即域对象.setAttribute(key,value);
scope属性设置保存到哪个域:page表示pageContext域(默认),request表示Request域,session表示Session域,application表示ServletContext域
var属性表示key设置键,value表示value设置值
ii.<c:if />
if标签做if判断,test属性表示判断的条件(使用EL表达式):
<c:if test="${12 == 12}">
<h1>
12 == 12
</h1>
</c:if>
iii.<c:choose><c:when><c:otherwise>标签
作用:多路判断,跟switch...case...default非常接近
choose标签开始选择,when标签表示一种判断情况,test属性写入判断(EL表达式),otherwise标签为剩下情况。
<c:choose><c:when><c:otherwise>使用时需注意:
1.标签里不能使用html注释,要使用jsp注释
2.when标签的父标签一定要是父标签
<c:choose>
<c:when test="${requestScope.height > 190}">
<h1>非常高</h1>
</c:when>
<c:when test="${requestScope.height > 180}">
<h1>很高</h1>
</c:when>
<c:when test="${requestScope.height>170}">
<h1>还可以</h1>
</c:when>
<c:otherwise>
<c:choose>
<c:when test="${requestScope.height>160}">
<h2>大于160</h2>
</c:when>
<c:when test="${requestScope.height>150}">
<h2>大于150</h2>
</c:when>
<c:otherwise>
<h2>小于150</h2>
</c:otherwise>
</c:choose>
</c:otherwise>
</c:choose>
iv.<c:forEach/>
作用:遍历输出使用
1.遍历1到10输出,begin属性设置开始索引,end属性设置结束索引,var表示循环的变量(也是当前正在遍历的数据)
<table>
<c:forEach begin="1" end="10" var="i">
<tr>
<td>第${i}行</td>
</tr>
</c:forEach>
</table>
2.遍历Object数组,items属性表示遍历的数据源,var属性表示当前遍历到的数据,即
for(Object var:items)
<c:forEach items="${requestScope.arr}" var="item">
${item}<br>
</c:forEach>
3.遍历map集合
<c:forEach items="${requestScope.map}" var="entry">
<h1>${entry.key} = ${entry.value} </h1>
</c:forEach>
4.遍历List集合,LIst中存放Student类
<table>
<tr>
<th>编号</th>
<th>姓名</th>
<th>密码</th>
</tr>
<c:forEach items="${requestScope.stus}" var="stu">
<tr>
<td>${stu.id}</td>
<td>${stu.username}</td>
<td>${stu.password}</td>
</tr>
</c:forEach>
</table>
5.属性组合使用
<c:forEach begin="0" end="2" step="2" varStatus="status" items="${requestScope.stus}" var="stu">
<tr>
<td>${stu.id}</td>
<td>${stu.username}</td>
<td>${stu.password}</td>
</tr>
</c:forEach>
varStatus标签: