EL表达式
概念:Expression Language 表达式语言
作用:替换和简化jsp页面中java代码的编写
语法:${表达式}
注意:jsp默认支持el表达式的。如果要忽略el表达式:
-
设置jsp中page指令中:
isELIgnored="true"
忽略当前jsp页面中所有的el表达式 -
\{表达式}
:忽略当前这个el表达式
使用:
-
运算:
运算符:- 算数运算符:
+
-
*
/ (div)
% (mod)
- 比较运算符:
>
<
>=
<=
==
!=
- 逻辑运算符:
&& (and)
|| (or)
! (not)
- 空运算符:
empty
功能:用于判断字符串、集合、数组对象是否为
null
或者长度是否为 0
语法格式: - 算数运算符:
${empty list}
当list对象引用为null
或者长度为 0时,返回true。${not empty obj}
:返回true时,表示判断字符串、集合、数组对象是否不为null并且长度>0
-
获取值
el表达式只能从域对象中获取值
语法:-
${域名称.键名} :从指定域中获取指定键的值
域名称:- pagescope --> pageContext
- requestScope --> request
- sessionScope --> session
- applicationScope --> application (ServletContext)
举例:在 request域中存储了 name=anonymous
request.setAtrribute("name","anonymous");
获取方式:${requestScope.name}
-
${键名}
:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。pagescope -> requestScope -> sessionScope -> applicationScope (域范围从小到大)
-
-
获取对象、List集合、Map集合的值
-
对象:
${域名称.键名.属性名}
本质上会去调用对象的getter方法
-
List集合:
${域名称.键名[索引]}
-
Map集合:
${域名称.键名.key名称}
${域名称.键名["key名称"]}
逻辑视图:
getName()
方法名中Name没有对应的成员变量,而该方法返回值是对某个相关成员变量进行变换的形式。 -
隐式对象:el表达式中有11个隐式对象
-
pageContext:获取jsp其他八个内置对象
${pageContext.request.contextpath{}
:动态获取虚拟目录
在JSP页面的JavaScript代码中EL表达式仍然可以使用。
JSTL标签库
概念:JavaServer Pages Tag Library JSP标准标签库(是由Apache组织提供的开源的免费的jsp标签 < 标签>)
作用:用于简化和替换jsp页面上的java代码
使用步骤:
- 导入jstl相关jar包
- 引入标签库: taglib指令:
<%@ taglib %>
- 使用标签
常用的JSTL标签:
-
if:相当于Java代码的 if语句
- 属性:
- test必须属性,接受boolean表达式
- 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
- 一般情况下,test属性值会结合el表达式一起使用
注意:<c:if标签没有else情况,想要else情况,则可以再定义一个<c:if标签.
<%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ page contentType="text/html;charset=UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <title>JSTL Demo</title> </head> <body> <c:if test="true"> <h1>Anonymous</h1> </c:if> <% //判断request域中的一个list集合是否为空,如果不为null则遍历显示集合内容 List<String> list = new ArrayList<>(); list.add("anonymous"); list.add("joker"); request.setAttribute("list", list); request.setAttribute("number", 6); %> <c:if test="${not empty requestScope.list}"> <%-- 遍历集合操作 --%> </c:if> <c:if test="${requestScope.number%2==0}"> ${requestScope.number} is a even </c:if> <c:if test="${requestScope.number%2!=0}"> ${requestScope.number} is a odd </c:if> </body> </html>
- 属性:
-
choose:相当于Java代码中 switch语句
- 使用choose标签声明 相当于switch声明
- 使用when标签做判断 相当于case
- 使用otherwise标签做其他情况的声明 相当于default
<%@ page contentType="text/html;charset=UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <title>JSTL Demo</title> </head> <body> <%-- 完成数字编号对应星期几案例 1.域中存储——数字 2.使用 choose标签取出数字 相当于switch声明 3.使用 when标签做数字判断 相当于case 4.otherwise标签做其他情况的声明 相当于default --%> <% request.setAttribute("weekNum",0); %> <c:choose> <c:when test="${requestScope.weekNum==0}">星期天</c:when> <c:when test="${requestScope.weekNum==1}">星期一</c:when> <c:when test="${requestScope.weekNum==2}">星期二</c:when> <c:when test="${requestScope.weekNum==3}">星期三</c:when> <c:when test="${requestScope.weekNum==4}">星期四</c:when> <c:when test="${requestScope.weekNum==5}">星期五</c:when> <c:when test="${requestScope.weekNum==6}">星期六</c:when> <c:otherwise>输入有误!</c:otherwise> </c:choose> </body> </html>
-
foreach :相当于Java代码中 for语句
-
完成重复的操作:
for(int i=0; i<10; i++){ //... }
属性:
- begin:开始值
- end:结束值
- var:临时变量
- step:步长
- varStatus:循环状态对象
- index:容器中元素的索引,从0开始
- count:循环次数,从1开始
-
遍历容器
List<User> list; for(User user : list){ //... }
属性:
- items:容器对象
- var:容器中元素的临时变量
- varStatus:循环状态对象
- index:容器中元素的索引,从0开始
- count:循环次数,从1开始
<%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ page contentType="text/html;charset=UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <title>JSTL Demo</title> </head> <body> <c:if test="true"> <h1>Anonymous</h1> </c:if> <c:forEach begin="1" end="10" var="i" step="2" varStatus="s"> ${i} ${s.index} ${s.count}<br> </c:forEach> <% List<String> list = new ArrayList<>(); list.add("anonymous"); list.add("joker"); request.setAttribute("list", list); %> <c:forEach items="${requestScope.list}" var="str" varStatus="s"> ${s.index} ${s.count} ${str}<br> </c:forEach> </body> </html>
-
练习
需求:在request域中有一个存有Person对象的List集合。需要使用jstl+el将list集合数据展示到jsp页面的表格table中。
<%@ page import="java.util.List" %>
<%@ page import="com.example.domain.Person" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>JSTL Table</title>
</head>
<body>
<%
List<Person> list = new ArrayList<>();
list.add(new Person("anonymous",18,new Date()));
list.add(new Person("joker",18,new Date()));
list.add(new Person("flow",17,new Date()));
request.setAttribute("list",list);
%>
<table border="1" width="500px" align="center">
<tr>
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>生日</td>
</tr>
<c:forEach items="${requestScope.list}" var="person" varStatus="s">
<c:if test="${s.count%2!=0}">
<tr style="background-color: coral">
<td>${s.count}</td>
<td>${person.name}</td>
<td>${person.age}</td>
<td>${person.birthStr}</td>
</tr>
</c:if>
<c:if test="${s.count%2==0}">
<tr style="background-color: royalblue">
<td>${s.count}</td>
<td>${person.name}</td>
<td>${person.age}</td>
<td>${person.birthStr}</td>
</tr>
</c:if>
</c:forEach>
</table>
</body>
</html>