EL和JSTL


EL主要用来做取值操作。
JSTL主要用来做逻辑判断。

EL

在日常开发当中写JS中嵌入java代码容易导致结果复杂,使得程序可读性差,不易维护。而EL就可以解决这样的问题,使得代码更加简洁。

什么是EL表达式

EL表达式是一种借鉴了javaScript和XPath的表达式语言。EL表达式定义了一系列的隐含对象和操作符,使开发人员能够很方便地访问页面上的上下文,以及不同作用域内的对象,而无须在JSP页面嵌入java代码,从而使(前端)开发人员即使不熟悉java也能轻松地编写JSP程序。
这也算是一种半前后端分离,后端人员告诉前端人员预留的一个名字,或者接口来做排版等操作实现共同开发。

EL表达式的特点和使用范围

EL表达式提供了在java代码之外,访问和处理应用程序数据的功能,通常用于在某个作用域(page、request、session、application等)内取得属性,或者做简单的运算和判断。EL表达式有以下特点:
1.自动转换类型。不用想写脚本时那么麻烦转来转去,减少代码量。
2.使用更加简单。

EL表达式的语法

E L 表 达 式 E L 表 达 式 的 语 法 有 两 个 要 素 : ‘ {EL 表达式} EL表达式的语法有两个要素:` ELEL和{},两者缺一不可。 1.点操作符 EL表达式通常由两部分组成:对象和属性。就像在java代码中一样,在EL表达式中也可以用点操作符“.”来访问对象的某个属性。例如,通过${requestScope.User.name}可以访问User对象的name属性。 2.[ ]操作符 [ ]操作符在EL表达式中有两种作用。 1.当属性名当中包含了特殊字符,如:“.”或“-”等情况,就不能用点操作符来访问,这时候只能用"[]"操作符。例如: r e q u e s t S c o p e . U s e r [ n a m e ] ‘ 和 {requestScope.User[name]}`和 requestScope.User[name]{requestScope.User.name}是同一个效果,都是访问User对象的name属性。
2.访问数组,假设有一个对象名为array的数组,那么就可以根据索引值来访问其中的元素,如:${array[0]}、${array[1]}等。
3.关系操作符
在这里插入图片描述
4.逻辑操作符
在这里插入图片描述
5.Empty操作符
Empty操作符用于检测一个变量值是否为null或者为empty(如长度为0的字符串变量或集合变量)。例如,变量a不存在,则${empty a}返回结果为true,${not empty a}${! empty a}返回false。

EL表达式隐式对象

在这里插入图片描述
例如:在之前页面已经保存了一个session访问域,其中有一个user对象
name是user对象的姓名属性。habits是user对象的兴趣集合。

用户名: ${sessionScope.user.name}<br/>
  	兴趣:${sessionScope.user.habits}<br/>

获取到的效果:
在这里插入图片描述
注意这里是可以直接输出集合的,不需要遍历,但是它是由一个“[]”并以“,”隔开的。
如果不想要这个“[]”就不能直接输出集合了,可以一个一个输出或者使用逻辑代码遍历。

${sessionScope.user.habits[0]}<br/>

效果:
在这里插入图片描述
逻辑遍历需要使用JSTL配合使用。
注意:EL表达式只能获取保存在内置对象中的对象,如果不指定某一个内置对象它就会自己一个一个内置对象中寻找

JSTL

前面学习了EL表达式简化了JSP页面开发的复杂度。但是由于EL表达式不能实现逻辑控制、循环遍历等功能,那么这个时候就要使用JSTL标签了。
要使用JSTL首先要导入jar包:jstl.jar 和standard,jar。
然后在头部引入<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>

通用标签

1.<c:set>标签
两个作用:
(1)设置已存在的对象(取值)
<c:set value=“李四” target="${sessionScope.user}" property=“name” />
target属性是操作的对象
property属性是操作对象的属性名
value属性是取值
(2)自定义对象
<c:set var=“b” value=“hello” scope=“session”/>
var属性是设置的变量名
value属性是取值
scope属性对应的是变量的作用域,可省略。
2.<c:out>标签
作用:输出。其实和EL表达式效果上没什么区别,就是多了一个功能是EL表达式没有的,就是如果这个属性值为空的时候给一个默认值。
<c:out value=“value” default=“默认值” />
3.<c:remove>
作用:删除一个变量
<c:remove var=“b” scope=“session”/>
var属性指删除变量的名称
scope属性指删除变量所在范围,可省略。
示例:
A页面

User user=new User();
    	user.setName("张三");
    	session.setAttribute("user", user);
    	int i=1;
    	session.setAttribute("i", i);
    	response.sendRedirect("zeshi.jsp");

zeshi.jsp页面

<body>
  	<!-- 设置已存在的对象 -->
     脚本输出表达式:<%=((User)session.getAttribute("user")).getName() %>
	<br/>
	<c:set value="李四" target="${sessionScope.user}" property="name" /><!-- 设置user对象的name属性  -->
   EL表达式:${sessionScope.user.name }<br/>
   JSTL:姓名:<c:out value="${sessionScope.user.name }" />
   <br/>
   i原本的值:${sessionScope.i}<br/>
   <c:set value="3" target="${sessionScope}" property="i" />
   i设置之后的值: ${sessionScope.i}<br/>
   <!-- 自定义对象 -->
   <c:set var="a" value="value"/>
   自定义的对象a=${a}<br/>
   <c:set var="b" value="hello" scope="session"/><!-- 把值为"hello"的b变量保存到session中 -->
   自定义的session对象b=${sessionScope.b}<br/>
   <!-- 移除指定作用域的指定变量 -->
   <c:remove var="a"/>
   移除后自定义的对象a=<c:out value="${a}" default="null"/><br/>
   <c:remove var="b" scope="session"/><!-- 删除session对象中的b -->
   移除后自定义的session对象b=<c:out value="${sessionScope.b}" default="null"/>
  </body>

运行效果:
在这里插入图片描述

条件标签库

<c:if>

语法:
<c:if test="${…}" var=“a” scope=“作用域”>
主体内容
</c:if>
test属性放的是判断条件,其中放置的必须是EL表达式,如果为true执行主体内容,false则不会执行。
var属性定义一个变量,这个变量存放判断的结果(true,false),该属性可以省略。
scope属性是指var定义变量存储范围,可选值有page、request、session、application,该属性可以省略。
示例:

<c:if test="${2>1}" var="test1" scope="session">
   		真<br/>
   </c:if>

如果是真的就显示真,否则什么也不做。并且把判断结果用一个"test1"变量保存起来,并放置在session中。test1为session键,${2>1}是session值。在真实开发当中,可以把是否登录的结果保存在一个变量中,并保存在session作用域中,后面就不用重复判断是否登录了。

<c:choose>

<c:choose>、<c:when>和<c:otherwise>需要配合使用,类似于java语言的if-else if-else语句。
语法:
<c:choose>
<c:when test=" . . . " > 主 体 内 容 < / c : w h e n > < c : w h e n t e s t = " {...}"> 主体内容 </c:when> <c:when test=" ..."></c:when><c:whentest="{…}">
主体内容
</c:when>
<c:otherwise>
主体内容
</c:otherwise>
</c:choose>
<c:choose>是作为<c:when>和<c:otherwise>的父标签使用,除了空白字符外,只能包含这两个标签。
<c:when>相当于if
<c:otherwise>相当于else,必须是<c:choose>标签中最后一个嵌套的标签。
在运行时,只执行一个标签的内容。如果前面一个不满足条件一直往后面找,如果都不满足就执行<c:otherwise>标签体内内容。
示例:

  <c:if test="${2>1}" var="test1" >
   		真<br/>
   </c:if>
   <c:choose>
   		<c:when test="${!sessionScope.test1}">
   			不满足条件
   		</c:when>
   		<c:when test="${2>3}">
   			不满足条件
   		</c:when>
   		<c:otherwise>
   			满足条件
   		</c:otherwise>
   </c:choose>

前面判断了${2>1},并保存在test1变量当中这个时候就可以用test1这个变量代替${2>1},如果前面的都不满足,就执行<c:otherwise>标签体内内容。
执行结果:
在这里插入图片描述

迭代标签

<c:forEach>
语法:
<c:forEach var=“临时变量” items=“集合或者数组” varStatus=“索引” begin=“开始位置” end=“结束位置” step=“步长”>
主体内容
</c:forEach>
其中varStatus、begin、end、step都是可以省略的。并且顺序没有规定。
示例:
在A页面保存了一个数组到session当中

	int[] index={1,2,3};
   	session.setAttribute("index", index);

B页面输出数组:
脚本方式:

<%
int[] index1=(int[])session.getAttribute("index");
   	for(int i : index1){
   		out.print(i);
   		out.print("<br/>");
   	}
    %>

JSTL方式:

<c:forEach items="${sessionScope.index}" var="i">
    	${i}<br/>
    </c:forEach>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值