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>
,