1.EL表达式
1.EL表达式概述
EL(Expression Language):表达式语言
在 JSP 2.0 规范中加入的内容,也是 Servlet 规范的一部分
作用:在 JSP 页面中获取数据。让我们的 JSP 脱离 java 代码块和 JSP 表达式
语法:${ 表达式内容 }
EL表达式快速入门
1.创建一个web项目
2.在web目录下创建el01.jsp
3.在文件中向域对象添加数据
4.使用三种方式获取域对象中的数据(java代码块,jsp表达式,EL表达式)
5.部署并启动项目
6.通过浏览器测试
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式快速入门</title>
</head>
<body>
<%--1.向域对象中添加数据--%>
<% request.setAttribute("username","zhangsan"); %>
<%--2.获取数据--%>
Java代码块:<% out.println(request.getAttribute("username")); %> <br>
JSP表达式:<%= request.getAttribute("username")%> <br>
EL表达式:${username}
</body>
</html>
2.EL表达式获取数据
1.获取基本数据类型的数据
2.获取自定义对象类型的数据
3.获取数组类型的数据
4.获取List集合类型的数据
5.获取Map集合类型的数据
<%@ page import="bean.Student" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式获取不同类型数据</title>
</head>
<body>
<%--获取基本数据类型--%>
<% pageContext.setAttribute("num",10); %>
基本数据类型: ${num} <br>
<%--获取自定义对象类型--%>
<%--提前创建一个Student类--%>
<%
Student stu = new Student("张三",23);
pageContext.setAttribute("stu",stu);
%>
自定义对象: ${stu} <br>
<%--stu.name实现原理 getName()--%>
学生姓名: ${stu.name}
学生年龄: ${stu.age} <br>
<%--获取数组类型--%>
<%
String[] arr = {"hello","world"};
pageContext.setAttribute("arr",arr);
%>
数组: ${arr} <br>
0索引元素: ${arr[0]} <br>
1索引元素: ${arr[1]} <br>
<%--获取List集合--%>
<%
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
pageContext.setAttribute("list",list);
%>
List集合: ${list} <br>
0索引元素: ${list[0]} <br>
<%--获取Map集合--%>
<%
HashMap<String,Student> map = new HashMap<>();
map.put("ljb01",new Student("张三",23));
map.put("ljb02",new Student("李四",24));
pageContext.setAttribute("map",map);
%>
Map集合: ${map} <br>
第一个学生对象: ${map.ljb01} <br>
第一个学生对象的姓名: ${map.ljb01.name}
</body>
</html>
注意事项
EL 表达式没有空指针异常
EL 表达式没有索引越界异常
EL 表达式没有字符串的拼接
3.EL表达式的运算符
关系运算符
运算符 | 作用 | 示例 | 结果 |
---|---|---|---|
== 或 eq | 等于 | ${5 == 5} 或 ${5 eq 5} | true |
!= 或 ne | 不等于 | ${5 != 5} 或 ${5 ne 5} | false |
< 或 lt | 小于 | ${3 < 5} 或 ${3 lt 5} | true |
> 或 gt | 大于 | ${3 > 5} 或 ${3 gt 5} | false |
<= 或 le | 小于等于 | ${3 <= 5} 或 ${3 le 5} | true |
>= 或 ge | 大于等于 | ${3 >= 5} 或 ${3 ge 5} | false |
逻辑运算符
运算符 | 作用 | 示例 | 结果 |
---|---|---|---|
&& 或 and | 并且 | ${A && B} 或 ${A and B} | true/false |
|| 或 or | 或者 | ${A || B} 或 ${A and B} | true/false |
! 或 not | 取反 | ${ !A } 或 ${ not A } | true/false |
其他运算符
运算符 | 作用 |
---|---|
empty | 1.判断对象是否为null 2.判断字符串是否为空字符串 3.判断容器元素是否为0 |
条件 ? 表达式1 : 表达式2 | 三元运算符 |
<%@ 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","men");%>
<input type="radio" name="gender" value="men" ${gender == "men" ? "checked" : ""}>男
<input type="radio" name="gender" value="women" ${gender == "women" ? "checked" : ""}>女
</body>
</html>
4.EL表达式使用细节
EL 表达式能够获取四大域对象的数据,根据名称从小到大在域对象中查找
还可以获取 JSP 其他八个隐式对象,并调用对象中的方法
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式使用细节</title>
</head>
<body>
<%--获取四大域对象中的数据--%>
<%
//pageContext.setAttribute("username","zhangsan");
request.setAttribute("username","zhangsan");
//session.setAttribute("username","zhangsan");
//application.setAttribute("username","zhangsan");
%>
${username} <br>
<%--获取JSP中其他八个隐式对象 获取虚拟目录名称--%>
<%= request.getContextPath()%>
${pageContext.request.contextPath}
</body>
</html>
5.EL表达式隐式对象
EL中的隐式对象 | 类型 | 对应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获取请求消息头,值是一个 | |
HeaderValues | Java.util.Map | 根据key获取请求消息头,值是多个(数组) | |
Param | Java.util.Map | 根据key获取请求参数,值是一个 | |
ParamValues | Java.util.Map | 根据key获取请求参数,值是多个(数组) | |
InitParam | Java.util.Map | 根据key获取全局参数,value是参数值 | |
Cookie | Java.util.Map | 根据key获取cookie的值 |
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式11个隐式对象</title>
</head>
<body>
<%--pageContext对象 可以获取其他三个域对象和JSP中八个隐式对象--%>
${pageContext.request.contextPath} <br>
<%--applicationScop 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} <br> <%--获取cookie对象的值--%>
</body>
</html>
获取全局配置参数时需在web.xml中写入
<!--配置全局参数-->
<context-param>
<param-name>pname</param-name>
<param-value>bbb</param-value>
</context-param>
2.JSTL
1.JSTL概述
JSTL(Java Server Pages Standarded Tag Library):JSP 标准标签库
主要提供给开发人员一个标准通用的标签库
开发人员可以利用这些标签取代 JSP 页面上的 Java 代码,从而提高程序的可读性,降低程序的维护难度
组成 | 作用 | 说明 |
---|---|---|
core | 核心标签库 | 通用的逻辑处理 |
fmt | 国际化 | 不同地域显示不同语言 |
functions | EL函数 | EL表达式可以使用的方法 |
sql | 操作数据库 | 用于操作数据库 |
xml | 操作XML | 用于操作XML |
2.JSTL的核心标签使用
JSTL核心标签库
实际开发中,用到的jstl标签库主要以核心标签库为准,偶尔会用到国际化标签库的标签
标签名称 | 功能分类 | 分类 | 作用 |
---|---|---|---|
<标签名:if> | 流程控制 | 核心标签库 | 用于判断 |
<标签名:choose> <标签名:when> <标签名:otherwise> | 流程控制 | 核心标签库 | 用于多个条件判断 |
<标签名:forEach> | 迭代操作 | 核心标签库 | 用于循环遍历 |
基本使用
1.创建一个web项目
2.在web目录下创建一个WEB-INF目录
3.在WEB-INF目录下创建一个libs目录,将JSTL的jar包导入
4.创建JSP文件,通过taglib导入JSTL标签库
5.对流程控制和迭代遍历的标签进行使用
6.部署本启动项目
7.通过浏览器查看
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!--prefix给jstl core核心库起个前缀名,使用的标签就以c开头-->
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>流程控制</title>
</head>
<body>
<%--向域对象中添加成绩数据--%>
${pageContext.setAttribute("score","B")}
<%--对成绩进行判断--%>
<c:if test="${score eq 'E'}">
优秀
</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>
<br>
<%--向域对象中添加集合--%>
<%
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>