1.EL表达式
介绍:是一种非常简洁的表达式,语法简单,便于使用,灵感来源于ECMAScript和Xpath的表达式语言
样式:
${表达式}
作用:简化jsp中获取作用域或者请求数据的写法。
获取请求数据
EL表达式
1)获取请求数据
(1)请求实体数据
${param.键名}
请求实体中同键不同名的数据
${paramValues.键名}//返回的数组,比如复选框。具体获得某个值,数组名[];
(2)获取请求头的数据
${header} //返回的是所有的请求头中的键值对
${header["键名"]}//返回键对应的值
如果一个键对应多个值 ${headerValues["accept-language"]}//返回的是数组
(3)获取cookie数据
${cookie}获取所有的Cookie对象 键值对
${cookie.cookie对象的键名}获取存储了指定Cookie数据的Cookie对象
${cookie.Jcookie对象的键名.name}<br>获取存储了指定Cookie数据的Cookie对象的存储的键
${cookie.Jcookie对象的键名.value}获取存储了指定Cookie数据的Cookie对象的存储的值
获取作用域数据
1)作用域对象:pageContext request session application
2)作用域数据:我们使用setAttribute方法存储的数据
获取:
普通字符串数据 ${键名}
对象数据 ${键名.属性名}
集合数据
list集合 ${键名[角标]}
Map集合 ${map集合作用域存储的键名.map集合存储的数据的键名}
3)作用域数据查找顺序:如果找到了则不再查找,如果找不到,则继续查找下一个作用域,如果四个作用域中都没有则什么都不显示
pageContext-->request-->session-->application
4)指定作用域获取数据:
${pageScope.键名} 指明获取pageContext作用域中的数据
${requestScope.键名} 指明获取request作用域中的数据
${sessionScope.键名} 指明获取session作用域中的数据
${applicationScope.键名} 指明获取application作用域中的数据
EL逻辑表达式运算
算术运算:+,-,*,/ 在EL表达式中可以直接进行算术运算
${算术表达式} 例如 :${1+2}
注意:+表示算术运算,不能进行字符串连接
逻辑运算:&& || !
${逻辑表达式}
注意:没有单& 和单|
比较运算:== != >,>=,<,<=
${比较表达式}
三目运算:
${条件?值:值}
EL表达式的empty判断
${empty 键名}
作用:
判断该键是否有存储有效数据
注意:如果普通的数据是空,用empty返回true
如果是对象数据,调用无参构造方法创建实例,用empty返回的是false,因为对象中属性会默认赋值给null.
JSTL标签库:
1.是EL表达式的扩展,它是一个标签语言
1) 作用:提升jsp页面的逻辑代码的编码效率
2)在jsp中引入
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
prefix:前缀
2.核心标签库:
基本标签:
1)out标签:
样式: <prefix:out value="${表达式}" default="默认值"></prefix:out>
作用:结合EL表达式,将数据响应到浏览器,如果EL表达式没有取到数据,会 采用默认的属性的值
2)set标签
样式:
<prefix:set var="键名" value="数据" scope="作用域"></prefix:set>
作用:将数据存储到指定的作用域中
scope:的值 page request session application
没有scope默认往pagecontext中放
3)remove 标签
<prefix:remove var="键名“ scope="作用域名"></prefix:remove>
作用:将作用域的数据数据。如果没有scope的属性,默认是删除4个作用域的含有相同的键名的数据,scope可以指定作用域
使用pageContext.removeAttriute(String name,int scope)删除指定的作用域
scope: 1 pagecontext 2request 3 session 4application
注意:pageContext.removeAttribute("键名")会删掉所有作用域含有的相同键名的数据
逻辑标签:
单分支标签:
1)if 标签:
样式:
<prefix:if text="EL表达式">
输出的标签
</prefix:if >
作用:可以根据el表达式进行一定程度的单分支逻辑判断。
注意:
test属性中书写的是EL表达式,或者说是EL表达式的逻辑表达式。
该标签只能进行EL表达式相关的逻辑判断。不能进行EL表达式不能获取的数据的逻辑处理
多分支标签:
样式:
<prefix:choose>
<prefix:when text="EL表达式"></prefix:when >
<prefix:when text="EL表达式"></prefix:when >
……
<prefix:otherwise ></prefix:otherwise >
</prefix:choose>
注意:多分支标签只能执行一个,类似于if(){} else if(){} else {}
例子:
<c:choose> <c:when test="${score>=90}"> <b>赏美女</b> </c:when>
<c:when test="${score>=80 &&score<90 }"> <b>赏萝莉</b> </c:when> <c:otherwise> <b>赏丑八怪加大胖子一个</b> </c:otherwise></c:choose>
注意:EL表达式的数据,只能是EL能获取的数据。
循环标签:
样式:
<prefix:forEach begin="" end="" step="" varstatus="">
循环体
<prefix:forEach>
标签中的属性:begin:从声明循环开始的位置
end:循环结束的位置
step:循环跨越的步数
varstatus:声明变量记录循环的状态,例如:变量名=i;
注意:记录的数据,存储到了作用域,可以直接用EL表达式获取
实例:
${ i.index} :获取循环的下标
${i.count} :获取当前的循环的次数
${i.first}:判断是否是第一次循环
${i.last}:判断是否是最后一次循环
例子:
<c:forEach begin="1" end="5" step="2" varStatus="i"> <c:if test="${i.count==3}"> <b>哇偶你是大帅锅</b>
</c:if>
</c:forEach>
当遍历数组的长度不知道的时候比如集合,map:
<prefix:foreach items="" var="" varstatus="" >
</prefix:foreach>
items:要遍历的集合或者数组或者map,在作用域中的键名,用EL表达式获取。
从索引为0的位置开始遍历
var:指向集合或者数组的元素。在循环体中,用EL表达式获取,
注意如果是map的话,在循环体中用EL表达式获取的是键值对关系,获得具体的key
用${var中的变量名.key}
获取值得话${var中的变量名.value}
注意:var声明的变量存储到了作用域,得用EL表达式获取
实例:
<!-- 遍历List集合 -->
<%
//创建测试数据list
ArrayList<String> list=new ArrayList<String>();
list.add("苹果"); list.add("榴莲");
list.add("荔枝");
//将list存储到作用域中
request.setAttribute("list",list); %>
<c:forEach items="${list}" var="s" varStatus="i"> ${s}--${i.index}--${i.count}<br />
</c:forEach>
<!--遍历map集合 -->
<% //声明Map集合测试数据
HashMap<String,String> hs=new HashMap<String ,String>();
hs.put("s1","唱歌");
hs.put("s2", "跳舞");
hs.put("s3", "敲代码");
//将数据存储到作用域中
request.setAttribute("hs", hs);
%>
<c:forEach items="${hs}" var="s">
${s.key}--${s.value}<br />
</c:forEach>