EL表达式和JSTL标签
1. EL表达式
1.1 概念
Expression Language表达式语言
1.1 作用
简化JSP中书写Java代码的代码量
1.3 语法
${表达式}
1.4 注意
jsp默认是支持el表达式,如果要忽略el表达式,则可以使用以下两种方法:
- 设置jsp中page指令,isELIgnored=“true”,忽略当前页面中所有的el表达式
\${表达式}
忽略当前这个el表达式
1.5 使用
- 运算:
-
算数运算符:+ - * /(div) %(mod)
-
比较运算符:> < >= <= != ==
-
逻辑运算符:&& (and) || (or) ! (not)
-
空运算符:empty
- 功能:用于判断字符串,集合,数组对象是否为null或长度是否为0
- ${empty list}
<% List list = new ArrayList(); list.add("aaa"); request.setAttribute("list",list); %> <% String str = ""; request.setAttribute("str",str); %> ${ empty list}<br>//如果list为空时输出true,反之false ${ not empty list}<br>//如果list不为空时输出true,反之false ${ not empty str}<br> //“”属于长度=0,但是不为空
<%-- Created by IntelliJ IDEA. User: lzy Date: 2020/3/6 Time: 17:48 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h3>算术运算符</h3> ${ 3+4}<br> ${ 3%4}<br> ${ 3 div 4}<br> <h3>比较运算符</h3> ${ 5 > 6}<br> ${ 5 == 6}<br> <h3>逻辑运算符</h3> ${ 3 > 5 && 3>2}<br> ${ 3 > 5 or 3>2}<br> </body> </html>
-
1.6 获取值
-
EL表达式只能从域对象中获取值
-
语法:
-
${域名称.键名}:从指定域名称中获取指定键的值
域名称(由上至下 域的范围变大):- pageScope - - - - ->pageContext
- requestScope - - - - >request
- sessionScope - - - - ->session
- applicationScope - - - - >application(ServletContext)
-
${键名}:表示依次从最小域中查找是否又该键对应的值,知道找到为止
举例1:在request域中存储了 name = liuzeyu 获取:${ requstScope.name}
举例2:在application域,request域中,pageContext域中分别存储了name 的值 <% application.setAttribute("name","lisi"); request.setAttribute("name","zhangsan"); pageContext.setAttribute("name","wangwu"); %> ${ name} 最后输出:wangwu 验证了依次从最小域中查找是否又该键对应的值,知道找到为止
-
获取实体类对象,List集合,Map的值
- 对象:${域名称.键名.属性名},本质上会去调用getter方法
- List集合:${域名称.键名[索引]}
- Map集合:
${域名称.键名.key名称}
${域名称.键名[“key名称”]}
User.java
public class User { private String username; private String password; private Date birthday; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Date getBirthday() { return birthday; } public String getBirthdayFormat() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String format = sdf.format(birthday); return format; } public void setBirthday(Date birthday) { this.birthday = birthday; } }
el3.jsp
<%@ page import="domain.User" %> <%@ page import="java.util.*" %><%-- Created by IntelliJ IDEA. User: lzy Date: 2020/3/6 Time: 17:48 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%--1.测试el表达式获取对象得值--%> <% User user = new User(); user.setUsername("liuzeyu"); user.setPassword("809080"); user.setBirthday(new Date()); request.setAttribute("u",user); %> <%--2.测试el表达式获取List对象得值--%> <% List list = new ArrayList(); list.add("aaa"); list.add("bbb"); list.add(user); request.setAttribute("list",list); %> <%--2.测试el表达式获取Map对象的值--%> <% Map map = new HashMap(); map.put("sname","liuzeyu"); map.put("gender",32); map.put("user",user); request.setAttribute("map",map); %> <%-- ##############################################--%> <h3>el表达式获取对象的属性</h3> <%--通过对象的【属性】来获取 如:获取username,找到getUsername,找到不到为空--%> ${ requestScope.u.username}<br> ${ requestScope.u.password}<br> ${ requestScope.u.birthday}<br> ${ requestScope.u.birthday.year}<br> ${ requestScope.u.birthday.month}<br> ${ requestScope.u.birthdayFormat}<br> <h3>el表达式获取List对象的内容</h3> ${ requestScope.list}<br> ${ requestScope.list[0]}<br> ${ requestScope.list[2].username}<br> <h3>el表达式获取Map对象的内容</h3> ${ requestScope.map}<br> ${ requestScope.map["gender"]}<br> ${ requestScope.map.sname}<br> ${ requestScope.map.user.username}<br> </body> </html>
-
1.7 隐式对象
- el表达式中有11个隐式对象
- pageContext:
- 获取jsp其他八个内置对象
- ${pageContext.request.contextPath}:动态获取虚拟目录,常用于表单的action
- 获取jsp其他八个内置对象
el表达式隐式对象:https://blog.csdn.net/hjl815/article/details/71123545
- pageContext:
2. JSTL标签
2.1 概念
Java Server Tag Library
是由appach组织提供的免费开源jsp标签
2.2 作用
用于简化和替换jsp页面上的Java代码
2.3 使用步骤
- 导入jstl相关的jar包
- 引入标签库:taglib指令:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- 使用标签
- 常用的jstl标签
-
if:相对于java代码的if语句
- 属性:
test必须属性,接受boolean值- 如果表达式为true,则显示if标签体内容,反之则不显示
- 一般情况下,test属性会和el表达式配合使用
注意:c:if标签没有else情况,想要else情况,则可以再定义一个c:if标签
<%-- 需求: 1.判断集合是否为空,如果不为空,则显示if标签体内容 2.结合el表达式判断是否奇数 --%> <% List list = new ArrayList(); list.add("liuzeyu"); request.setAttribute("list",list); request.setAttribute("num",31); %> <c:if test="${not empty list}">list不为空 可以遍历</c:if><br> <c:if test="${requestScope.num mod 2 == 0}">${ requestScope.num}是偶数</c:if><br> <c:if test="${requestScope.num mod 2 != 0}">${ requestScope.num}是奇数</c:if><br>
- 属性:
-
chose:相当于Java代码的switch语句
- 使用chose标签取出数字 相当于switch
- 使用when标签做数字判断 相当于case
- 使用otherwise 做出其他情况声明 相当于default
<%-- 需求: 完成数字编号对应星期几的案例 1.域中存储一数字 2.使用chose标签取出数字 相当于switch 3.使用when标签做数字判断 相当于case 4.使用otherwise 做出其他情况声明 相当于default --%> <% request.setAttribute("number",33); %> <c:choose> <c:when test="${requestScope.number == 1}">星期一</c:when> <c:when test="${requestScope.number == 2}">星期二</c:when> <c:when test="${requestScope.number == 3}">星期三</c:when> <c:when test="${requestScope.number == 4}">星期四</c:when> <c:when test="${requestScope.number == 5}">星期五</c:when> <c:when test="${requestScope.number == 6}">星期六</c:when> <c:when test="${requestScope.number == 7}">星期日</c:when> <c:otherwise>请输入正确的数字!!</c:otherwise> </c:choose> ```
-
foreach:相当于Java代码的for语句
-
完成重复操作
for(int i = 0;i < 10; i++){
//操作
}
*属性:
begin:开始值
end:结束值
step:步长
var:临时变量
varStatus:循环状态对象
index:容器中的元素索引,从0开始
count:循环次数,从1开始 -
遍历容器
List users;
for(User user : users){
//操作
}
*属性
item:容器对象
var:容器元素的临时变量
varStatus:循环状态对象
index:容器中的元素索引,从0开始
count:循环次数,从1开始
<%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %><%-- Created by IntelliJ IDEA. User: lzy Date: 2020/3/6 Time: 21:55 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>测试jstl的if</title> </head> <body> <%-- 1.完成重复操作--%> <c:forEach begin="0" end="5" step="1" var="i" varStatus="s"> ${ i}<h1>${ s.index}</h1><h2>${ s.count}</h2><br> </c:forEach> <hr> <%-- 2.遍历容器--%> <% List list = new ArrayList(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("ddd"); request.setAttribute("list",list); %> <c:forEach items="${list}" var="str" varStatus="s"> ${ str}<h1>${ s.index}</h1><h2>${ s.count}</h2><br> </c:forEach> </body> </html>
-
-
2.4 案例
需求:在request域中存有一个User对象的List集合,需要使用jstl+el将List集合数据展示到jsp页面的table表格中
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Date" %>
<%@ page import="domain.User" %><%--
Created by IntelliJ IDEA.
User: lzy
Date: 2020/3/6
Time: 21:55
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>案例</title>
</head>
<body>
<%
List list = new ArrayList();
list.add(new User("zhangsan","1998",new Date()));
list.add(new User("lisi","2001",new Date()));
list.add(new User("wangwu","2520",new Date()));
list.add(new User("xiaohua","1530",new Date()));
list.add(new User("taizi","5540",new Date()));
request.setAttribute("list",list);
%>
<table border="1" width="500" align="center">
<tr>
<th>编号</th>
<th>姓名</th>
<th>出生年份</th>
<th>生日</th>
</tr>
<c:forEach items="${requestScope.list}" var="user" varStatus="s">
<c:if test="${s.count % 2 != 0}">
<tr bgcolor="red">
<td>${
s.count}</td>
<td>${
user.username}</td>
<td>${
user.password}</td>
<td>${
user.birthdayFormat}</td>
</tr>
</c:if>
<c:if test="${s.count % 2 == 0}">
<tr bgcolor="green">
<td>${
s.count}</td>
<td>${
user.username}</td>
<td>${
user.password}</td>
<td>${
user.birthdayFormat}</td>
</tr>
</c:if>
</c:forEach>
</table>
</body>
</html>
实现结果:
注意:
test="${s.count % 2 == 0}"不可以写成test="${s.count % 2 == 0} "
多出一个空格,
老眼昏花,一个空格排错半天。