El表达式&JSTL
EL表达式介绍
EL(Expression Language):表达式语言。
在JSP2.0规范中加入的内容,也是Servlet规范的一部分
作用:在JSP页面中获取数据,让我们的JSP脱离java代码和JSP表达式
基本语法
EL表达式的语法格式非常简单,写为 ${表达式内容}
例如:在浏览器中输出请求域中名称为message的内容。
假定,我们在请求域中存入了一个名称为message的数据(request.setAttribute("message","EL");
| JSP表达式 | EL表达式 | |
|---|---|---|
<%<br/> <br/> String message = (String)request.getAttribute("message");<br/> out.write(message);<br/>%> |
<%=request.getAttribute("message")%> |
通过上面我们可以看出,都可以从请求域中获取数据,但是EL表达式写起来是最简单的方式。这也是以后我们在实际开发中,当使用JSP作为视图时,绝大多数都会采用的方式。
第一步:创建JavaWeb工程
2.在web目录下创建el01.jsp
3.在文件中向域对象添加数据
4.使用三种方式获取域对象中(java代码块,JSP表达式,EL表达式)
5.部署并启动项目
6.通过浏览器测试
<%--
Created by IntelliJ IDEA.
User: 12270
Date: 2021/3/19
Time: 22:11
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式快速入门</title>
</head>
<body>
<%-- 1.向域对象中添加数据--%>
<%request.setAttribute("username","zhangsan");%>
java代码块"<%out.println(request.getAttribute("username"));%><br>
JSP表达式:<%=request.getAttribute("username")%>
EL表达式:${username}
<%%>
</body>
</html>


在前面的概述介绍中,我们介绍了EL表达式的作用,它就是用于获取数据的,那么它是从哪获取数据呢?
1)获取四大域中的数据
它只能从四大域中获取数据,调用的就是findAttribute(name,value);方法,根据名称由小到大逐个域中查找,找到就返回,找不到就什么都不显示。
它可以获取对象,可以是对象中关联其他对象,可以是一个List集合,也可以是一个Map集合。具体代码如下:
创建一个实体类,Student
package com.itheima.bean;
public class Student {
private String username;
private int age;
private int score;
public Student() {
}
public Student(String username, int age, int score) {
this.username = username;
this.age = age;
this.score = score;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"username='" + username + '\'' +
", age=" + age +
", score=" + score +
'}';
}
}
JSP代码
<%@ page import="com.itheima.bean.Student" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%--
Created by IntelliJ IDEA.
User: 12270
Date: 2021/3/20
Time: 12:32
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式获取不同类型数据</title>
</head>
<body>
<%--1.获取基本数据类型--%>
<% pageContext.setAttribute("num",10);%>
基本数据类型:${num}<br>
<%--2.获取自定义对象类型--%>
<%
Student stu=new Student("zhangsan",20,16);
pageContext.setAttribute("stu",stu);
%>
自定义对象:${stu}<br>
学生姓名:${stu.username}
学生年龄:${stu.age}
学生分数:${stu.score}<br>
<%--3.获取数组类型--%>
<%
String []arr={"hello","world"};
pageContext.setAttribute("arr",arr);
%>
0索引元素${arr[0]};<br>
1索引元素${arr[1]};<br>
<%--4.获取List集合--%>
<%
ArrayList<String> list=new ArrayList<>();
list.add("aaa");
list.add("bbb");
pageContext.setAttribute("list",list);
%>
0索引元素${list.get(0)};<br>
1索引元素${list.get(1)};<br>
<%--5.获取Map集合--%>
<%
HashMap<String,Student> map=new HashMap<>();
map.put("hm01",new Student("张三",18,90));
map.put("hm02",new Student("李四",18,90));
pageContext.setAttribute("map",map);
%>
Map集合
${map}
第一个学生对象的姓名${map.hm01.username}<br>
第一个学生对象的年龄${map.hm01.age}<br>
${map.hm02}
</body>
</html>
运行结果如图:

2)EL表达式的注意事项
<%--2.获取自定义对象类型--%>
<%
Student stu=new Student("zhangsan",20,16);
stu=null;
pageContext.setAttribute("stu",stu);
%>
<%--El表达式没有空指针异常--%>
自定义对象:${stu}<br>
学生姓名:${stu.username}
学生年龄:${stu.age}
学生分数:${stu.score}<br>
<%--3.获取数组类型--%>
<%
String []arr={"hello","world"};
pageContext.setAttribute("arr",arr);
%>
0索引元素${arr[0]};<br>
1索引元素${arr[1]};<br>
<%--el表达式中没有索引越界异常--%>
8索引元素${arr[8]};
<%--EL表达式中没有字符串拼接的效果--%>
0索引拼接1索引的元素:${arr[0]}+${arr[1]}<br>
3)EL表达式的使用细节
EL表达式除了能在四大域中获取数据,同时它可以访问其他隐式对象,并且访问对象有返回值的方法.
4)EL表达式的运算符
EL表达式中运算符如下图所示,它们都是一目了然的:


但是有两个特殊的运算符,使用方式的代码如下:
| 运算符 | 作用 |
| empty |
1.判断对象是否为null 2.判断字符串是否为空字符串 3.判断容器元素是否为0 |
| 条件?表达式1:表达式2 | 三元运算符 |
<%--
Created by IntelliJ IDEA.
User: 12270
Date: 2021/3/20
Time: 20:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式运算符</title>
</head>
<body>
<%-- empty--%>
<%
String str1=null;
String str2="";
int []arr={};
%>
${empty str1}<br>
${empty str2}<br>
${empty arr}<br>
<%-- 三元运算符 ,获取性别数据,在对应的按钮上进行勾选--%>
<% pageContext.setAttribute("gender","women");%>
<input type="radio" name="gender" value="men" ${gender =="men" ? "checked": ""}>男
<input type="radio" name="gender" value="women" ${gender =="women" ? "checked": ""}>女
</body>
</html>
运行结果图:

EL表达式的使用细节
EL表达式能够获取四大域对象的数据,根据名称从小到大在域对象中查找。
还可以获取JSP其他哪个隐式对象,并调用对象中的方法
<%--
Created by IntelliJ IDEA.
User: 12270
Date: 2021/3/20
Time: 21:21
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式使用细节</title>
</head>
<body>
<%--获取四大域对象中的数据--%>
<%
//pageContext.setAttribute("username","张三");
//request.setAttribute("username","张三");
//session.setAttribute("username","张三");
application.setAttribute("username","张三");
%>
${username}<br>
<%--获取jsp中其他八个隐式对象 获取虚拟目录的名称--%>
<%=request.getContextPath()%>
${pageContext.request.contextPath}
</body>
</html>

1.1.3 EL表达式的11个隐式对象
1)隐式对象介绍
EL表达式也为我们提供隐式对象,可以让我们不声明直接来使用,十一个对象见下表,需要注意的是,它和JSP的隐式对象不是一回事:
| 类型 | 对应JSP隐式对象 | 备注 | |
|---|---|---|---|
| PageContext | Javax.serlvet.jsp.PageContext | PageContext | 完全一样 |
| ApplicationScope | Java.util.Map | 没有 | 应用层范围 |
| SessionScope | Java.util.Map | 没有 | 会话范围 |
| RequestScope | Java.util.Map | 没有 | 请求范围 |
| PageScope | Java.util.Map | 没有 | 页面层范围 |
| Header | Java.util.Map | 没有 | 请求消息头key,值是value(一个) |
| HeaderValues | Java.util.Map | 没有 | 请求消息头key,值是数组(一个头多个值) |
| Param | Java.util.Map | 没有 | 请求参数key,值是value(一个) |
| ParamValues | Java.util.Map | 没有 | 请求参数key,值是数组(一个名称多个值) |
| InitParam | Java.util.Map | 没有 | 全局参数,key是参数名称,value是参数值 |
| Cookie | Java.util.Map | 没有 |
<%--
Created by IntelliJ IDEA.
User: 12270
Date: 2021/3/21
Time: 16:26
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>
<%--pageContext对象 可以获取其他三个域对象和JSP中八个隐式对象--%>
${pageContext.request.contextPath} <br>
<%--applicationScope sessionScope requestScope pageScope 操作四大域对象中的数据--%>
<% request.setAttribute("username", "zhangsan"); %>
${username} <br>
${requestScope.username} <br>
<%--header headerValues 获取请求头数据--%>
${header["connection"]} <br>
${headerValues["connection"][0]} <br>
<%--param paramValues 获取请求参数数据--%>
${param.username} <br>
${paramValues.hobby[0]} <br>
${paramValues.hobby[1]} <br>
<%--initParam 获取全局配置参数--%>
${initParam["pname"]} <br>
<%--cookie 获取cookie信息--%>
${cookie} <br> <%--获取Map集合--%>
${cookie.JSESSIONID} <br> <%--获取map集合中第二个元素--%>
${cookie.JSESSIONID.name} <br> <%--获取cookie对象的名称--%>
${cookie.JSESSIONID.value} <%--获取cookie对象的值--%>
</body>
</html>
效果

1.2 JSTL
1.2.1 JSTL概述
1)简介
JSTL的全称是:JSP Standard Tag Libary。它是JSP中标准的标签库。它是由Apache实现的。
开发人员可以利用这些标签取代JSP上的Java代码,从而提高程序的可读性
它由以下5个部分组成:
| 作用 | 说明 | |
|---|---|---|
| Core | 核心标签库。 | 通用逻辑处理 |
| Fmt | 国际化有关。 | 需要不同地域显示不同语言时使用 |
| Functions | EL函数 | EL表达式可以使用的方法 |
| SQL | 操作数据库。 | 不用 |
| XML | 操作XML。 |
2)使用要求
要想使用JSTL标签库,在javaweb工程中需要导入坐标。首先是在工程的WEB-INF目录中创建一个lib目录,接下来把jstl的jar拷贝到lib目录中,最后在jar包上点击右键,然后选择【Add as Libary】添加。如下图所示:

在我们实际开发中,用到的jstl标签库主要以核心标签库为准,偶尔会用到国际化标签库的标签。下表中把我们经常可能用到的标签列在此处,其余标签库请同学们参考【JSTL标签库.doc】文档。
| 标签名称 | 功能分类 | 分类 | 作用 |
|---|---|---|---|
<c:if> |
流程控制 | 核心标签库 | 用于判断 |
<c:choose> ,<c:when>,<c:otherwise> |
流程控制 | 核心标签库 | 用于多个条件判断 |
<c:foreache> |
迭代操作 | 核心标签库 | 用于循环遍历 |
1.2.3 JSTL使用
1.创建一个web项目
2。在web目录下创建一个WEB-INF目录
3.在 WEB-INF目录下创建一个libs目录,将JSTL的jar包导入
4.创建jap文件,通过taglib导入JSTL标签库
5.对流程控制和迭代遍历的标签进行使用
6.部署并启动项目
7.通过浏览器查看
条件判断
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>流程控制</title>
</head>
<body>
<%--向域对象中添加成绩数据--%>
${pageContext.setAttribute("score","T")}
<%--对成绩进行判断--%>
<c:if test="${score eq 'A'}">
优秀
</c:if>
<%--对成绩进行多条件判断--%>
<c:choose>
<c:when test="${score eq 'A'}">优秀</c:when>
<c:when test="${score eq 'B'}">良好</c:when>
<c:when test="${score eq 'C'}">及格</c:when>
<c:when test="${score eq 'D'}">较差</c:when>
<c:otherwise>成绩非法</c:otherwise>
</c:choose>
</body>
</html>

循环遍历
<%@ page import="java.util.ArrayList" %><%--
Created by IntelliJ IDEA.
User: 12270
Date: 2021/3/21
Time: 21:23
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>循环</title>
</head>
<body>
<%--相域对象中添加集合--%>
<%
ArrayList<String> list=new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
pageContext.setAttribute("list",list);
%>
<c:forEach items="${list}" var="str">
${str}<br>
</c:forEach>
</body>
</html>

,

浙公网安备 33010602011771号