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表达式的语法有两个要素:`
EL表达式EL表达式的语法有两个要素:‘和{},两者缺一不可。 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>