EL表达式
什么是El表达式
Expression Language:表达式语言, jsp2.0之后内置在jsp里面
域对象:
request:一次请求中有效
session:一次会话中有效【多次请求】
ServletContext:整个应用中有效【全局共享】
存储:request.setAttribute(key,value);
取值:request.getAttribute(key);
jsp页面上获取request作用域中的数据:<%= request.getAttribute(key);%>
EL表达式:${key}
目的:为了使JSP写起来更加简单, 取值(取的域对象里面存的值)更加简单。(代替脚本 <%= %>)
EL语法
${el表达式}
EL表达式的用途
1.获取数据. 获取的是域(request,session,ServletContext)对象中存储的数据
2.EL执行运算(算术运算及逻辑运算)
El获取数据
获取简单数据类型数据
语法:${requestScope|sessionScope|applicationScope.属性名};
快捷写法:==${属性名}, 属性名就是存在域对象里面的key==
<%-- Created by IntelliJ IDEA. User: shuaige Date: 2022/1/23 Time: 8:55 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> <%-- 需求:使用EL获取简单类型数据 解决: 1.先要将数据存入到域对象中 2.在使用EL表达式获取 --%> <%--java脚本 可以在里面编写java代码--%> <% //request、session、application是jsp的内置对象 内置对象:生来就有 已经创建好了 可以直接使用 //request.setAttribute("name","admin"); session.setAttribute("age",18); //jsp中的application对象就是Servlet中的ServletContext对象 application.setAttribute("address","深圳"); //在session作用域中也存储了一个name 三个选项:A:报错 B:获取request中 C:获取session中 session.setAttribute("name","king"); /* * 注意: * 使用简化方式获取域对象中存储的数据,会从域对象范围小的到大的进行查找[request-->session-->application(ServletContext)],找到就停止,找不到就继续查找,如果最终也没有找到,就返回空字符串"" * * */ %> <%--获取域对象中存储的数据--%> <h1>request-老方式:<%=request.getAttribute("name") %></h1> <h1>request-EL获取:${requestScope.name}</h1> <h1>简化方式:${name}</h1> <h1>session-老方式:<%=session.getAttribute("age") %></h1> <h1>session-EL获取:${sessionScope.age}</h1> <h1>简化方式:${age}</h1> <h1>application-老方式:<%=application.getAttribute("address") %></h1> <h1>application-EL获取:${applicationScope.address}</h1> <h1>简化方式:${address}</h1> </body> </html>
获取数组
语法: ${key[下标]} key就是域对象里面存的key
获取list
语法:${list属性名[index]}或者${list属性名.get(index)};list属性名就是存入域对象里面的key
获取Map
语法:${map属性名.键} 或 ${map属性名.get("键")} 或${map属性名[键],map属性名就是存入域对象里面的key }
注意:当map的键比较特殊(eg:"1"、"a.ba.c")时,此时使用点的方式会报错,可以选择使用[]的方式。
<%@ page import="java.util.ArrayList" %> <%@ page import="java.util.List" %> <%@ page import="java.util.HashMap" %> <%@ page import="java.util.Map" %><%-- Created by IntelliJ IDEA. User: shuaige Date: 2021/7/29 Time: 8:54 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> <%-- 需求:使用EL获取简单类型数据 解决: 1.先要将数据存入到域对象中 2.在使用EL表达式获取 --%> <%--java脚本 可以在里面编写java代码--%> <% //1.在域对象中存储数据 //1.1:使用request域对象存储数组数据 String[] names = {"张三","李四","王五"}; request.setAttribute("names",names); //1.2:使用request域对象存储list集合 List list = new ArrayList<>(); list.add("篮球"); list.add("足球"); list.add("混球"); request.setAttribute("list",list); //1.3:使用request域对象存储map集合 Map<String,Object> map = new HashMap<>(); map.put("cn","中国"); map.put("jp","小日本"); map.put("usa","漂亮国"); //request.setAttribute("map",map); //1.4:特殊情况 key中包含特殊字符. 此时使用["key"]进行获取 request.setAttribute("a.b.c","hahaha"); map.put("big.cn","大中国"); session.setAttribute("map",map); %> <%--获取域对象中存储的数据--%> <%--需求1:获取names数组中的第二个元素 语法:${key[下标]} 下标从0开始--%> <h1>${names[1]}</h1> <%--需求2:获取list集合中的第三个元素 语法:${key[下标]} 或 ${key.get(下标)}--%> <h1>${list[2]}</h1> <h1>${list.get(2)}</h1> <%--需求3:获取map集合中key为cn所对应的值value 语法:${key["map的key"]} 或者 ${key.get("map的key") 或者 ${key.map的key}--%> <h1>${map["cn"]}</h1> <h1>${map.get("cn")}</h1> <h1>${map.cn}</h1> <%--需求4:获取特殊key所对应存储的值--%> <h1>${requestScope["a.b.c"]}</h1> <h1>${map["big.cn"]}</h1> <h1>${map.get("big.cn")}</h1> <h1>${map.big.cn}</h1> </body> </html>
获取bean
==语法:${key.javabean属性}==
依赖getxxx()方法; eg: getPassword()---去掉get-->Password()----首字母小写--->password
<%@ page import="java.util.ArrayList" %> <%@ page import="java.util.List" %> <%@ page import="java.util.HashMap" %> <%@ page import="java.util.Map" %> <%@ page import="com.itheima.bean.User" %><%-- Created by IntelliJ IDEA. User: shuaige Date: 2021/7/29 Time: 8:54 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> <%-- 需求:使用EL获取简单类型数据 解决: 1.先要将数据存入到域对象中 2.在使用EL表达式获取 --%> <%--java脚本 可以在里面编写java代码--%> <% //1.创建一个javabean对象 存入到request作用域中 User user = new User(); user.setName("张三"); user.setPwd("123"); request.setAttribute("user",user); %> <%--获取域对象中存储的数据--%> <%--需求:获取user中的name属性值 语法:${key.javabean属性名称}--%> <h1>${user.name}</h1> </body> </html>
语法
-
获得简单类型的
${key}
-
获得数组类型的
${key[下标]}
-
获得List类型的
${key[index]} 或者${key.get(index)}
-
获得Map类型的
${key[map的键]} 或者 ${key.get(map的键)} 或者${key.map的键} key是存到域对象里面的key
-
获得JavaBean类型的
//get方法 去除get之后的单词首字母小写 得到的就是javabean的属性 当然 规范使用时,javabean字段和属性一致 ${key.javaBean属性}
注意:
使用getAttribute()方法获取域对象中不存在的数据返回null,使用EL表达式获取域对象中不存在的数据返回"", 因此在页面显示时,通过EL表达式获取数据显示,客户体验感较好。
注意事项
[]和.方式的区别: 有特殊字符的要用[]
-
获取的是三个域对象范围的值,存入三个域中
-
能获取到则获取,获取不到返回" "字符串 ,不是返回null
-
${域中属性名}:依次从requestScope|sessionScope|applicationScope中查找指定的属性
若找到,立即返回,且结束该次查找
若找不到返回""
-
若属性名中出现了".""+""-"等特殊的符号的时候,快捷获取的方式不好使,必须使用以下方式:
${xxxScope["属性名"]}
特殊情况:
<% request.setAttribute("a.b.c.d","rrr"); Map<String,String> map = new HashMap<String,String>(); map.put("a.akey","aaa"); map.put("bkey","bbb"); map.put("ckey","ccc"); request.setAttribute("m",map); %> ${a.b.c.d} ${requestScope['a.b.c.d']}<br/> #{m['a.akey']} <br/>
EL执行运算
算术运算
+,-,*,/
+:加号在EL表达式中代表加运算,不作拼接使用,如果是数字的字符串形式,则EL表达式会自动进行类型转换,然后再进行算术运算
关系运算
< >= <= != ==
逻辑运算
&& || !
非空判断【重点】
empty,
1. 判断一个对象是否为null,为null返回true
2. 判断集合长度是否为0,集合为null或长度为0返回true
3. 判断一个字符串是否为 null或"",如果是则返回true
not empty
语法: ${empyt 属性名};属性名 就是域对象里面的key值
<%@ page import="java.util.ArrayList" %> <%@ page import="java.util.List" %> <%@ page import="java.util.HashMap" %> <%@ page import="java.util.Map" %> <%@ page import="com.itheima.bean.User" %><%-- Created by IntelliJ IDEA. User: shuaige Date: 2021/7/29 Time: 8:54 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> <%-- 需求:使用EL获取简单类型数据 解决: 1.先要将数据存入到域对象中 2.在使用EL表达式获取 --%> <%--java脚本 可以在里面编写java代码--%> <% request.setAttribute("age","100"); request.setAttribute("name","admin"); //1.1:存储一个null字符串或者空串"" request.setAttribute("str1",""); request.setAttribute("str2",null); //1.2:存储一个对象为null User user1 = null; User user2 = new User(); request.setAttribute("user1",user1); request.setAttribute("user2",user2); //1.3:存储一个list集合 list集合长度为0 或者为null List list1 = null; List list2 = new ArrayList(); request.setAttribute("list1",list1); request.setAttribute("list2",list2); %> <%--获取域对象中存储的数据--%> <%--EL会进行自动类型转换 +号表示加法运算 如果+号两边都是数字 则可以正常进行加法运算--%> <h1>${age+1}</h1> <%--+号在EL表达式中表示加法运算 不代表字符串拼接 如果+号两边有一方不能转换为数字 则执行运算报错--%> <%--<h1>${name+1}</h1>--%> <%--情况1:当字符串为null或""时,使用empty进行判断 返回true--%> <h3>${empty str1}</h3> <h3>${empty str2}</h3> <%--情况2:当对象为null时,使用empty进行判断 返回true--%> <h3>${empty user1}</h3> <h3>${empty user2}</h3> <%--情况3:当list集合为null或长度为0时 使用empty进行判断 返回true--%> <h3>${empty list1}</h3> <h3>${empty list2}</h3> <%--not empty 不为空返回true,为null返回false--%> <h3>${not empty list1}</h3> </body> </html>
JSTL标签库
什么是JSTL标签库
JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。这个JSTL标签库没有集成到JSP的, 要使用的话, 需要导jar包.
JSTL标签库的作用
为了简化在jsp页面上操作数据; eg: 遍历数据 判断数据等
JSTL标签库的类别
2.1核心标签库使用步骤
-
导入jar包
-
在JSP页面上导入核心标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
if标签
-
语法
<c:if test="el表达式${..}" [var="给之前的表达式的结果起个名字"] [scope="将结果保存在那个域中 默认page"]> </c:if>
-
实例
<%-- Created by IntelliJ IDEA. User: shuaige Date: 2021/7/29 Time: 10:40 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%--在指定页面引入jstl标签库 prefix:前缀 uri:jstl核心标签库的地址--%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Title</title> </head> <body> <%--先在域对象中存储一个数据--%> <% request.setAttribute("age",6); %> <%--使用if标签 判断年龄 如果年龄>7岁 可以上小学了--%> <%--test:必选项 表示if判断的条件,在里面可以使用el表达式进行判断 结果为true则执行c:if标签体中的内容 var:可选属性 表示声明一个变量 用于存储test中条件判断的结果 scope:表示将var这里声明的变量存入到指定的作用域中 但是实际使用时,一般只会设置test属性,var和scope几乎不用 --%> <c:if test="${age>7}" var="flag" scope="request"> <h1>可以上小学了</h1> </c:if> <h2>回家玩泥巴去吧</h2> <h3>requestScope:${requestScope.flag}</h3> <h3>sessionScope:${sessionScope.flag}</h3> </body> </html>
choose标签
-
实例
<body> <% request.setAttribute("age","6"); %> <%--if只能做简单判断 如果想实现if-else,或者多重if判断 就需要使用到c:choose标签了--%> <%--需求:年龄大于7岁 可以上小学 年龄大于13岁 可以上中学 年龄大于18岁 可以上大学 如果年龄不满7岁 回家玩泥巴--%> <%--c:choose就是类似于多重if或switch判断--%> <c:choose> <c:when test="${age>18}"> <h1>上大学</h1> </c:when> <c:when test="${age>13}"> <h1>上中学</h1> </c:when> <c:when test="${age>7}"> <h1>上小学</h1> </c:when> <c:otherwise> <h1>回家玩泥巴</h1> </c:otherwise> </c:choose> </body>
foreach标签
简单的使用:
<%-- var:增强for循环的迭代遍历 for(String str : strs){} var==str begin:起始值 end:结束值 step:步长,间隔 --%> <c:forEach var="i" begin="1" end="10" step="2"> ${i} </c:forEach>
复杂的使用:
c:forEach中的varStatus属性。
指向一个字符串,该字符串引用一个对象。 map.put("vs",一个对象);
这个对象记录着当前遍历的元素的一些信息:
index:返回索引。从0开始
count:返回计数。从1开始
last:是否是最后一个元素
first:是否是第一个元素
<%--foreach实际使用 复杂使用--%> <%--使用场景:查询所有用户的场景:前台页面发起请求,到达后台处理,后台查询数据库得到所有用户的集合数据 将用户集合数据存入到request作用域中,然后跳转到指定的jsp页面,最后在jsp页面获取到数据进行遍历显示--%> <% //模拟后台查询到所有用户列表数据 存储到request作用域中 User user1 = new User(); user1.setName("张三"); user1.setPwd("123"); User user2 = new User(); user2.setName("李四"); user2.setPwd("123"); User user3 = new User(); user3.setName("王五"); user3.setPwd("123"); List<User> users = new ArrayList<>(); users.add(user1); users.add(user2); users.add(user3); request.setAttribute("users",users); %> <%--前台使用表格展示所有用户 的姓名 需要用到foreach--%> <table border="1px" cellpadding="0" cellspacing="0" width="400px"> <tr> <td>序号</td> <td>用户名</td> </tr> <%--每遍历一次 就执行一次foreach标签体中的内容 也就是输出一行用户记录--%> <%--items:要遍历的集合 使用el表达式获取 var:集合中的元素 迭代变量 集合中元素内容的展示 在html标签中获取也要使用EL表达式--%> <c:forEach items="${users}" var="user" varStatus="status"> <tr> <td>${status.index +1}</td> <td>${user.name}</td> </tr> </c:forEach> </table>