EL表达式和JSTL标签

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>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值