EL表达式和JSTL标签
使用传统方式获取数据到JSP页面:
缺陷:
1.书写比较繁琐
2.需要导包
3.需要强转
1、 什么是 EL 表达式
全称:
Expression Language,一种写法非常简洁的表达式。语法简
单易懂,便于使用。表达式语言的灵感来自于 ECMAScript 和
XPath 表达式语言
2、 EL 表达式的作用
作用:
让 jsp 书写起来更加的方便。简化在 jsp 中获取作用域或者请
求数据的写法。也会搭配 Jstl 来进行使用。
3、 使用 EL 表达式
语法结构:${expression},提供.和[ ]两种运算符来存取数据。
使用:
a) 使用 EL 表达式获取请求数据
i. 获取用户请求数据
${param.键名} 获取请求实体中一个键一个值的数据
${paramValues.键名} 获取请求实体中同键不通值的数据,返回的是String数组,可以使用角标直接获取 例如:爱好
ii. 获取请求头数据
${header} 返回所有的请求头数据,键值对形式
${header["键名"]} 返回指定的键的请求头数据
${headerValues["键名"]}
iii. 获取 Cookie 数据
${cookie} 获取所有的Cookie对象 键值对
${cookie.Cookie对象的键名} 获取存储了指定cookie数据的Cookie对象
${cookie.Cookie对象的键名.name} 获取存储了指定Cookie数据的Cookie对象的存储的键
${cookie.Cookie对象的键名.value} 获取存储了指定Cookie数据的Cookie对象的存储的值
b) 使用 EL 表达式获取作用域数据
i. 获取作用域数据
作用域对象:pageContext request session application
作用域数据:我们使用setAttribute方法存储的数据
获取:
普通字符串数据 ${键名}
对象数据 ${键名.属性名}
集合数据
list集合 ${键名[角标]}
Map集合 ${map集合作用域存储的键名.map集合存储的数据的键名}
ii. 作用域查找顺序: pageContext–>request–>session–>application
如果找不到了则不再查找,如果找不到,则继续查找下一个作用域,如果四个作用域中都没有则不显示
iii. 获取指定作用域中的数据
${pageScope.键名} 指明获取pageContext作用域中的数据
${requestScope.键名} 指明获取request作用域中的数据
${sessionScope.键名} 指明获取session作用域中的数据
${applicationScope.键名} 指明获取application作用域中的数据
c) 使用 EL 表达式进行运算
i. 算术运算 + - * / 在EL表达式中可直接进行算数运算
* ∗ 算 数 表 达 式 例 如 : * { 算数表达式 } 例如: ∗算数表达式例如: {1 + 2}
注意: + 表示算数运算,不能进行字符串连接
ii. 三目运算 ${条件?值:值}
iii. 逻辑运算 && || ! ${逻辑表达式}
iv.比较运算 == != > < >= <= ${比较表达式}
d) EL 表达式空值判断 empty
${empty 键名}
作用:
判断该键是否有存储有效的数据
####练习源码####
<%@ page language="java" import="java.util.*,com.bjsxt.pojo.*" pageEncoding="utf-8"%>
<!--将流转数据显示到浏览器中:使用传统方式 -->
<h3>传统方式在jsp中获取作用域中的数据</h3>
<%--
缺陷:
1、书写比较繁琐
2、需要导包
3、需要强转
--%>
<hr />
<%=request.getAttribute("str") %>
<%=((User)request.getAttribute("user")).getFav()%><br />
<%=((ArrayList)request.getAttribute("list")).get(2)%><br />
<%=((User)((ArrayList)request.getAttribute("list")).get(3)).getFav()%><br />
<%=((HashMap)request.getAttribute("hs")).get("b1") %><br />
<%= ((User)((HashMap)request.getAttribute("hs")).get("u")).getFav()%>
<h3>使用EL表达式方式获取作用域数据</h3>
<%--
El表达式的语法:
${表达式}
注意:
自带响应功能
El表达式的使用:
El表达式获取请求数据
获取用户请求数据(请求实体)
${param.键名} 获取请求实体中一个键一个值的数据
${paramValues.键名} 获取请求实体中同键不同值的数据,返回的是String数组,可以使用角标直接获取 例如:爱好
获取请求头数据
${header} 返回所有的请求头数据,键值对形式
${header["键名"]} 返回指定的键的请求头数据
${headerValues["键名"]}
获取Cookie数据
${cookie} 获取所有的Cookie对象 键值对
${cookie.Cookie对象的键名} 获取存储了指定Cookie数据的Cookie对象
${cookie.Cookie对象的键名.name} 获取存储了指定Cookie数据的Cookie对象的存储的键
${cookie.Cookie对象的键名.value}获取存储了指定Cookie数据的Cookie对象的存储的值
EL表达式获取作用域数据
作用域对象:pageContext request session application
作用域数据:我们使用setAttribute方法存储的数据
获取:
普通字符串数据 ${键名}
对象数据 ${键名.属性名}
集合数据
list集合 ${键名[角标]}
Map集合 ${map集合作用域存储的键名.map集合存储的数据的键名}
作用域数据查找顺序:如果找到了则不再查找,如果找不到,则继续查找下一个作用域,如果四个作用域中都没有则什么都不显示
pageContext-->request-->session-->application
指定作用域获取数据:
${pageScope.键名} 指明获取pageContext作用域中的数据
${requestScope.键名} 指明获取request作用域中的数据
${sessionScope.键名} 指明获取session作用域中的数据
${applicationScope.键名} 指明获取application作用域中的数据
EL表达式逻辑运算
算术运算:+,-,*,/ 在EL表达式中可以直接进行算术运算
${算术表达式} 例如 :${1+2}
注意:+表示算术运算,不能进行字符串连接
逻辑运算:&& || !
${逻辑表达式}
注意:没有单& 和单|
比较运算:== != >,>=,<,<=
${比较表达式}
三目运算:
${条件?值:值}
EL表达式的empty判断
${empty 键名}
作用:
判断该键是否有存储有效数据
--%>
<hr />
${str} <br />
${user.fav} <br />
${list[2]} <br />
${list[3].fav} <br />
${hs.b1} <br />
${hs.u.fav} <br />
<hr />
<h3>获取用户请求数据(请求实体)</h3>
<%=request.getParameter("uname") %>--${param.uname} <br />
<%=request.getParameterValues("fav")[1] %>--${paramValues.fav[1]}
<h3>获取用户请求头数据</h3>
<%=request.getHeader("User-Agent") %>--${header["User-Agent"]}--${headerValues["Accept-Language"][0]}
<h3>获取Cookie数据</h3>
${cookie} <br />
${cookie.JSESSIONID} <br />
${cookie.JSESSIONID.name}--${cookie.JSESSIONID.value}
<h3>EL获取作用域数据时作用域的查找顺序</h3>
<%
pageContext.setAttribute("hello", "hello pageContext");
request.setAttribute("hello","hello request");
session.setAttribute("hello", "hello session");
application.setAttribute("hello", "hello application");
%>
${requestScope.hello}--${a}
<h3>EL表达式的逻辑运算</h3>
<%
request.setAttribute("a","2");
%>
${1+2}--${2*3}--${a+3}--${1+"5"} <br />
${2>3&&4<5}--${2>3||4<5}--${!(2>3)} <br />
${2==2}--${3>2}<br />
${2>3?"男":"女"}
<h3>EL表达式的empty判断</h3>
<%
request.setAttribute("str","");
User u=new User();
request.setAttribute("u", u);
ArrayList la=new ArrayList();
request.setAttribute("la",la);
%>
${empty str}<br />
${empty u}<br />
${empty la}<br />
JSTL 标签库
1、 什么是 JSTL 标签库
JSTL 是 apache 对 EL 表达式的扩展(也就是说 JSTL 依赖 EL),JSTL 是标签语言!JSTL 标签使用起来非常方便,它与 JSP 动作标签一样,只不过它不是 JSP 内置的标签,需要我们自己导包,以及指定标签库而已!
如果你使用 MyEclipse 开发 JavaWeb,那么在把项目发布到 Tomcat 时,你会发现,MyEclipse 会在 lib 目录下存放 jstl 的 Jar包!如果你没有使用 MyEclipse 开发那么需要自己来导入这个 JSTL的 Jar 包:jstl-1.2.jar。
2、 JSTL 标签库的作用
用来提升在 JSP 页面的逻辑代码的编码效率,使用标签来
替换逻辑代码的直接书写,高效,美观,整洁,易读。
3、 使用 JSTL 标签库
a) 内容:
i. 核心标签库(学习)
ii. 格式化标签库(了解)
iii. 函数标签库(了解)
iv. XML 标签库(了解)
v. SQL 标签库(了解)
b) 使用:
i. 导包
ii. 使用 taglib 标签引入资源
<%@taglib prefix=“c” url=" http://java.sun.com/jsp/jstl/core" %>
iii. 核心标签库
out标签:
<c:out value="${表达式}" default="默认值" ></c:out >
作用:结合EL表达式将数据响应给浏览器,如果EL表达式没有取到数据则可以使用default属性声明默认值。
set标签:<c:out value = “${表达式}” default = “默认值”></c:out >
作用:将数据存储到指定的作用域中,默认是pageContext作用域
注意:
scope的值为: page request session application
remove标签:<c:remove var =“要删除数据的键名” scope=“作用域名”/>
作用:删除作用域中的数据,默认是删除四个作用域中符合要求的数据
但是可以通过Scope属性指明要删除的作用域数据。
注意:使用pageContext.removeAttribute(“键名”).
此方法会将四个作用域中符合要求的数据全部删除
使用pageContext.removeAttribute(String name,int scope).
指明要删除的作用域中的数据scope的值为 1pageContext, 2request,3session,4application
使用request.removeAttribute(“键名”).
删除当前作用域中符合要求的数据
使用session.removeAttribute(“键名”).
删除当前作用域中符合要求的数据
使用application.removeAttribute("键名").
删除当前作用域中符合要求的数据
iv. 格式化标签库
逻辑标签:
单分支判断标签:<c: if text="${表达式}">数据</c: if>
作用:test属性中书写的是EL表达式,或者说是EL表达式的逻辑表达式
该标签只能进行EL表达式相关的逻辑判断,不能进行EL表达式不能获取的数据的逻辑处理
多分支判断标签:
<c: choose>
<c:when test="${表达式} "></c:when >
<c:when test="${表达式} "></c:when >
. .
<c:when test="${表达式} "></c:when >
</c: choose>
注意:符合条件后只会执行一个分支,其他分支不会执行
循环标签:
<c: foreach>
循环体
</c: foreach>
属性:begin: 声明循环的开始位置
end: 声明循环的结束位置
step: 声明循环的步长
varStatus: 声明变量记录循环状态,例如变量名式 i
items: 声明要遍历的数据,可以是集合和数组等
注意:使用EL表达式来获取
var:声明变量每次遍历的结果。可以做循环体中使用EL表达式获取遍历出来的数据
注意:记录的数据存储到了作用域中可以直接使用EL表达式进行获取
示例:${i.index} 获取当次循环的下标
${i.count} 获取当次循环的次数
${i.frist} 判断是否是第一次循环
${i.last} 判断是否是最后一次循环
学习网址:http://www.runoob.com/jsp/jsp-jstl.html
####练习源码####
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
JSTL学习:
作用:在jsp页面使用其可以非常方便的进行数据的处理。较与使用java代码块方法,更加的简单,代码更加的简洁易读。
使用:
核心标签库
流程:
导入jar包
引入标签库
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
内容:
基本标签:
out标签:<c:out value="${表达式}" default="默认值"></c:out>
作用:结合EL表达式将数据响应给浏览器,如果EL表达式没有取到数据则可以使用default属性声明默认值。
set标签: <c:set value="数据" var="键名" scope="作用域名"></c:set>
作用:将数据存储到指定的作用域中,默认是pageContext作用域
注意:
scope的值为:page request session application
remove标签:<c:remove var="要删除数据的键名" scope="作用域名"/>
作用:删除作用域中的数据,默认是删除四个作用域中的符合要求的数据。
但是可以通过scope属性指明要删除的作用域数据。
注意:
使用pageContext.removeAttriute("键名"), 此方法会将四个作用域中的符合要求的数据全部删除
使用pageContext.removeAttriute(String name,int scope)
指明要删除的作用域中的数据 scope的值为 1pageContext,2request ,3 session,4 application
使用request.removeAttibute("键名") 删除当前作用域符合要求的数据
使用session.removeAttibute("键名") 删除当前作用域符合要求的数据
使用application.removeAttibute("键名") 删除当前作用域符合要求的数据
逻辑标签:
单分支判断标签:<c:if test="${表达式}">数据</c:if>
作用:可以根据el表达式进行一定程度的单分支逻辑判断。
注意:
test属性中书写的是EL表达式,或者说是EL表达式的逻辑表达式。
该标签只能进行EL表达式相关的逻辑判断。不能进行EL表达式不能获取的数据的逻辑处理
多分支判断标签:
<c:choose>
<c:when test="${表达式}"></c:when>
<c:when test="${表达式}"></c:when>
..
<c:otherwise></c:otherwise>
</c:choose>
注意:
符合条件后只会执行一个分支,其他分支不会执行。
循环标签:
<c:foreach>
循环体
</c:foreach>
属性:
begin:声明循环的开始位置
end:声明循环的结束位置
step:声明循环的步长
varStatus:声明变量记录循环状态 ,例如变量名:i
注意:记录的数据存储到了作用域中可以直接使用El表达式进行获取
示例: ${i.index} 获取当次循环的下标
${i.count} 获取当次循环的次数
${i.first} 判断是否是第一次循环
${i.last} 判断是否是最后一次循环
items:声明要遍历的数据,可以是集合和数组等
注意:要使用EL表达式来获取
var:声明变量记录每次遍历的结果。可以做循环体中使用使用EL表达式获取遍历出来的数据
--%>
<h3>JSTL学习:</h3>
<hr />
<%
request.setAttribute("str","jstl学习");
%>
<!-- out标签学习 -->
<%=request.getAttribute("str") %>--${str}--<c:out value="${str}" default="我是out标签"></c:out>
<br />
<!-- set标签学习 -->
<%
request.setAttribute("s1","set标签学习");
%>
<c:set value="set标签学习2" var="s2" scope="request"></c:set>
<c:set value="hello pageContext" var="hello" scope="page"></c:set>
<c:set value="hello request" var="hello" scope="request"></c:set>
<c:set value="hello session" var="hello" scope="session"></c:set>
<c:set value="hello application" var="hello" scope="application"></c:set>
${s1}--${requestScope.s2}
<br />
<!-- remove标签学习 -->
<%-- <%
pageContext.removeAttribute("hello",4);
//request.removeAttribute("hello");
//session.removeAttribute("hello");
%> --%>
<c:remove var="hello" scope="request"/>
${hello}
<br />
<!-- 单分支判断标签 -->
<c:set var="a" value="12"></c:set>
<%
int b=4;
int a=Integer.parseInt((String)pageContext.getAttribute("a"));
if(a>8){
%>
<b>今天天气真好,适合学习1</b>
<%} %>
<c:if test="${a>8}">
<b>今天天气真好,适合学习2</b>
</c:if>
<br />
<!--多分支逻辑判断 -->
<c:set var="score" value="40"></c:set>
<c:choose>
<c:when test="${score>=90}">
<i>奖励苹果电脑一台</i>
</c:when>
<c:when test="${score<90&&score>=80}">
<i>奖励苹果手机一部</i>
</c:when>
<c:when test="${score>=70&&score<80}">
<i>无奖励无惩罚</i>
</c:when>
<c:otherwise>
<i>男女混合双打</i>
</c:otherwise>
</c:choose>
<br />
<!--循环标签 -->
<c:forEach begin="0" end="5" step="1" varStatus="i">
<c:if test="${i.count==3}">
<u>我是第三次循环</u>
</c:if>
11111--${i.index}--${i.count}--${i.first}--${i.last}<br />
</c:forEach>
<!-- 遍历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>