EL 表达式的全称是:Expression Language。是表达式语言
使用在 jsp 文件中
EL 表达式的作用:
EL 表达式主要是代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出
因为 EL 表达式在输出数据的时候,要比 jsp 的表达式脚本要简洁很多。
有值的情况下输出的结果:
<% request.setAttribute("key","值"); %>
表达式脚本输出 key 的值是:<%=request.getAttribute("key")%><br/>
EL 表达式输出 key 的值是:${key}<br/>
<% request.setAttribute("key","值"); %>
表达式脚本输出 key1 的值是:<%=request.getAttribute("key1")%><br/>
EL 表达式输出 key1 的值是:${key1}<br/>
EL 表达式的格式是:${表达式}
EL 表达式在输出 null 值的时候,输出的是空串
jsp 表达式脚本输出 null 值的时候,输出的是 null 字符串,要想 jsp 表达式脚本输出空串,要用到三元表达式
<%=request.getAttribute("key1")==null?"":request.getAttribute("key1")%>
EL 表达式主要是在 jsp 页面中输出数据, 主要是输出域对象中的数据
当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出
从小到大的范围的顺序 pageContext
====>>> request
====>>> session
====>>> application
<body>
<%
//往四个域中都保存了相同的 key 的数据。
request.setAttribute("key", "request");
session.setAttribute("key", "session");
application.setAttribute("key", "application");
pageContext.setAttribute("key", "pageContext");
%>
<%--使用 EL表达式获取域参数值 --%>
${ key } <%--此时输出结果是pageContext--%>
body>
注意 session 是在浏览器页面有效,所以就算将设置参数的代码注释掉,还要重新打开浏览器页面才有效
同理, application 是在整个 web 工程有效,注释掉赋值的代码之后,还要重启 web 工程才有效
需求:
输出 Person 类中普通属性、数组属性、list 集合属性、map 集合属性
Person 类
public class Person {
private String name;
private String[] phones;
private List<String> cities;
private Map<String,Object> map;
public int getAge() {
return 18;
}
}
jsp 中代码:
<body>
<%
//创建对象
Person ps = new Person();
//给属性赋值
ps.setName("小草莓");
ps.setPhones(new String[]{"18610541354", "18688886666", "18699998888"});
List<String> cities = new ArrayList<String>();
cities.add("北京");
cities.add("上海");
cities.add("深圳");
ps.setCities(cities);
Map<String, Object> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
ps.setMap(map);
//将对象设置为域参数
pageContext.setAttribute("p", ps);
%>
输出 Person:${ p }<br/>
输出 Person 的 name 属性:${p.name} <br>
输出 Person 的 pnones 数组属性值:${p.phones[2]} <br>
输出 Person 的 cities 集合中的元素值:${p.cities} <br>
输出 Person 的 List 集合中个别元素值:${p.cities[2]} <br>
输出 Person 的 Map 集合: ${p.map} <br>
输出 Person 的 Map 集合中某个 key 的值: ${p.map.key3} <br>
body>
此处输出 Person 对象的属性、map中指定的value,使用的是.运算符
输出数组、集合中的某个元素,使用的是[]运算符
输出不是根据对象的属性名,而是根据对象中创建的 get()
方法
比如:在 Person 类中没有 age 属性名,但是提供一个 getAge() 的方法,然后使用 EL 表达式来获取
Person 类中代码:
public int getAge() { return 18; }
jsp 中代码:
输出 Person 的 age 属性:${p.age}
语法:${ 运算表达式 }
算数运算符 | 说 明 | 范 例 | 结果 |
---|---|---|---|
+ | 加法 | ${ 12 + 18 } | 30 |
- | 减法 | ${ 18 - 8 } | 10 |
* | 乘法 | ${ 12 * 12 } | 144 |
/ 或 div | 除法 | ${ 144 / 12 } 或 ${ 144 div 12 } | 12 |
% 或 mod | 取模 | ${ 144 % 10 } 或 ${ 144 mod 10 } | 4 |
empty 运算可以判断一个数据是否为空
如果为空,则输出 true;不为空,则输出 false
以下几种情况为空:
注意:
传入参数是一个对象的话,不为空
<body>
<%
List<String> list = new ArrayList<>();
request.setAttribute("key1", list);
request.setAttribute("key2", new ArrayList<String>());
request.setAttribute("key3", new Object());
%>
list 集合,元素个数为零:${empty key1}<br/>
一个集合对象:${empty key2}<br/>
一个 Object 对象:${empty key3}<br/>
body>
${表达式 1?表达式 2:表达式 3}
如果表达式 1 的值为真,返回表达式 2 的值
如果表达式 1 的值为假,返回表达式 3 的值
${ 12 != 12 ? "正确的":"错误的" }
.点运算
可以输出 Bean 对象中某个属性的值
[ ]中括号运算
可以输出有序集合中某个元素的值
并且[ ]中括号运算,还可以输出 map 集合中 key 里含有特殊字符的 key 的值
示例:
输出 map 集合中 key 里含有特殊字符的 key 的值
需要在中括号内使用单引号或双引号将 key 值包起来
<body>
<%
Map<String,Object> map = new HashMap<String, Object>();
map.put("a.a.a", "aaaValue");
map.put("b+b+b", "bbbValue");
map.put("c-c-c", "cccValue");
request.setAttribute("map", map);
%>
${ map['a.a.a'] } <br>
${ map["b+b+b"] } <br>
${ map['c-c-c'] } <br>
body>
EL 个达式中 11 个隐含对象,是 EL 表达式中自己定义的,可以直接使用
变量 | 类型 | 作用 |
---|---|---|
pageContext | PageContextImpl | 它可以获取 jsp 中的九大内置对象 |
pageScope | Map |
它可以获取 pageContext 域中的数据 |
requestScope | Map |
它可以获取 Request 域中的数据 |
sessionScope | Map |
它可以获取 Session 域中的数据 |
applicationScope | Map |
它可以获取 ServletContext 域中的数据 |
param | Map |
它可以获取请求参数的值 |
paramValues | Map |
它也可以获取请求参数的值,获取多个值的时候使用。 |
header | Map |
它可以获取请求头的信息 |
headerValues | Map |
它可以获取请求头的信息,它可以获取多个值的情况 |
cookie | Map |
它可以获取当前请求的 Cookie 信息 |
initParam | Map |
它可以获取在 web.xml 中配置的上下文参数 |
属性 | |
---|---|
pageScope | pageContext 域 |
requestScope | Request 域 |
sessionScope | Session 域 |
applicationScope | ServletContext 域 |
<body>
<%
pageContext.setAttribute("key1", "pageContext1");
pageContext.setAttribute("key2", "pageContext2");
request.setAttribute("key2", "request");
session.setAttribute("key2", "session");
application.setAttribute("key2", "application");
%>
获取application单个域属性的value值:${ applicationScope.key2 }<br/>
获取request域参数整个的键值对:${ requestScope }<br/>
body>
<%=request.getScheme()%>
jsp 表达式脚本获取请求的协议${ pageContext.request.scheme }
EL 表达式获取协议request.getServerName()
获取请求的服务器 ip 或域名${ pageContext.request.serverName }
request.getServerPort()
获取请求的服务器端口号${ pageContext.request.serverPort }
request.getContextPath()
获取当前工程路径${ pageContext.request.contextPath }
request.getMethod()
获取请求的方式(GET 或 POST)${ pageContext.request.method }
request.getRemoteHost()
获取客户端的 ip 地址${ pageContext.request.remoteHost }
session.getId()
获取会话的唯一标识${ pageContext.session.id }
变量 | 类型 | 作用 |
---|---|---|
param | Map |
它可以获取请求参数的值 |
paramValues | Map |
它也可以获取请求参数的值,获取多个值的时候使用 |
示例代码:
${ param }
在没有设置参数的情况下,获取请求参数只输出一对 花括号
有多个参数可以都获取,但若参数有多个值,就要使用 paramValues
示例代码:
<body>
<%--获取指定参数名的值--%>
输出请求参数 username 的值:${ param.username } <br>
输出请求参数 password 的值:${ param.password } <br>
<%--获取指定参数的指定位置的值--%>
输出请求参数 username 指定位置的值:${ paramValues.username[0] } <br>
输出请求参数 hobby 指定位置的值:${ paramValues.hobby[0] } <br>
输出请求参数 hobby 指定位置的值:${ paramValues.hobby[1] } <br>
<%-- ${ paramValues.hobby } 这种情况只会输出地址值 [Ljava.lang.String;@6bb1cfb --%>
body>
变量 | 类型 | 作用 |
---|---|---|
header | Map |
它可以获取请求头的信息 |
headerValues | Map |
它可以获取请求头的信息,它可以获取多个值的情况 |
示例代码:
<%--获取请求头信息--%>
输出请求头信息:${ header } <br>
<body>
<%-- 参数里有特殊值,需要用[]括号 --%>
输出请求头【User-Agent】的值:${ header['User-Agent'] } <br>
输出请求头【Connection】的值:${ header.Connection } <br>
输出请求头【User-Agent】的值:${ headerValues['User-Agent'][0] } <br>
<%-- headerValues 的类型是Map<String,String[]> --%>
<%-- ${ headerValues['User-Agent'] } 输出数组String[]的地址值 [Ljava.lang.String;@78ff1384 --%>
body>
变量 | 类型 | 作用 |
---|---|---|
cookie | Map |
它可以获取当前请求的 Cookie 信息 |
Cookie 对象里面可以存放一对键值对
因为 cookie 的类型是Map${ cookie }
输出的是Map
{Idea-9ddd6c63=javax.servlet.http.Cookie@3c1e879f, JSESSIONID=javax.servlet.http.Cookie@35b121ae}
里面Cookie对象的 key 就是JSESSIONID,对应的 value 就是 javax.servlet.http.Cookie@35b121ae
示例代码:
<body>
获取 Cookie 的名称:${ cookie.JSESSIONID.name } <br>
获取 Cookie 的值:${ cookie.JSESSIONID.value } <br>
body>
变量 | 类型 | 作用 |
---|---|---|
initParam | Map |
它可以获取在 web.xml 中配置的上下文参数 |
示例代码:
<body>
输出<Context-param>key1 的值:${ initParam.key1 } <br>
输出<Context-param>key2 的值:${ initParam.key2 } <br>
${ initParam }
body>
JSTL 标签库
全称是指 JSP Standard Tag Library JSP 标准标签库
是一个不断完善的开放源代码的 JSP 标 签库
EL 表达式主要是为了替换 jsp 中的表达式脚本,而标签库则是为了替换代码脚本。 这样使得整个 jsp 页面 变得更佳简洁
JSTL 由五个不同功能的标签库组成
要使用标签库就必须先使用 taglib 指令引入标签库
在 jsp 标签库中使用 taglib 指令引入标签库
CORE 标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
FMT 标签库
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
FUNCTIONS 标签库
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
SQL 标签库
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
XML 标签库
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
引入标签库: 作用: set 标签可以往域属性中保存数据 java中操作保存数据: if 标签用来做 if 判断,只能是单个判断 若成立,就执行前后标签之间的内容,若不成立,就不执行 作用: 多路判断。跟 switch … case … default 非常接近 注意: 作用: 遍历输出使用 Map 中包含着多个键值对,键 key 值 value ,单个键值对组合就是 entry 在 EL 表达式中,要想调用某个类中的实例方法 Y.getxxx(),可以试着调用 注意 begin、end 设置的是索引值,所以以上代码输出的是 id 为 3 - 8 部分 varStatus 继承了LoopTagStatus接口,所以可以使用里面的方法
可以输入 2.2、core 核心库使用
2.2.1、
域对象.setAttribute(key,value);
scope
属性设置保存到哪个域
page 表示 PageContext 域(默认值)
request 表示 Request 域
session 表示 Session 域
application 表示 ServletContext 域var
属性设置key是多少value
属性设置值value保存之前:${ sessionScope.abc } <br>
<c:set scope="session" var="abc" value="abcValue"/>
保存之后:${ sessionScope.abc } <br>
2.2.2、
test
属性表示判断的条件(使用 EL 表达式)
相当于 if()<c:if test="${ 12 == 12 }">
<h1>12 等于 12h1>
c:if>
2.2.3、
choose
标签开始选择判断when
标签表示每一种判断情况
test 属性表示当前这种判断情况的值otherwise
标签表示剩下的情况<%
request.setAttribute("score", 59);
%>
<c:choose>
<c:when test="${ requestScope.score > 90 }">
<h2>优秀h2>
c:when>
<c:when test="${ requestScope.score > 60 }">
<h2>及格h2>
c:when>
<c:otherwise>
<h2>不及格h2>
c:otherwise>
c:choose>
1、标签里不能使用 html 注释,要使用 jsp 注释
2、when 标签的父标签一定要是 choose 标签<%
request.setAttribute("score", 59);
%>
<c:choose>
<%-- 这是 jsp 注释 --%>
<c:when test="${ requestScope.score > 90 }">
<h2>优秀h2>
c:when>
<c:otherwise>
<%-- c:otherwise 标签里面再嵌套一整套的 c:choose --%>
<c:choose>
<c:when test="${ requestScope.score > 80 }">
<h2>良好h2>
c:when>
<c:when test="${ requestScope.score > 60 }">
<h2>及格h2>
c:when>
<c:otherwise>
<h2>不及格h2>
c:otherwise>
c:choose>
c:otherwise>
c:choose>
2.2.4、
遍历 1 到 10,输出
begin
属性设置开始的索引end
属性设置结束的索引var
属性表示循环的变量(也是当前正在遍历到的数据)<%-- for (int i = 1; i < 10; i++) --%>
<c:forEach begin="1" end="10" var="i">
第${i}行<br>
c:forEach>
遍历 Object 数组
items
表示遍历的数据源(遍历的集合)var
表示当前遍历到的数据<%-- for (Object o: arr) --%>
<%
request.setAttribute("arr", new String[]{"18610541354","18688886666","18699998888"});
%>
<c:forEach items="${ requestScope.arr }" var="o">
${ o } <br>
c:forEach>
遍历 Map 集合
<%-- Map.Entry<String,Object>是指Map类中的内部类Entry --%>
<%-- for(Map.Entry<String,Object> entry : map.entrySet()){} --%>
<%
Map<String,Object> map = new HashMap<String, Object>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
request.setAttribute("map", map);
%>
<c:forEach items="${ requestScope.map }" var="entry">
<h1>${entry.key} = ${entry.value}h1>
c:forEach>
entry.key
的含义就是调用 entry 对象中 getKey() 方法
entry.value
的含义就是调用 entry 对象中 getValue() 方法${ Y.xxx }
遍历 List 集合—list 中存放 Student 类,有属性:编号,用户名,密码,年龄, 电话信息
items
表示遍历的集合var
表示遍历到的数据begin
表示遍历的开始索引值end
表示结束的索引值step
属性表示遍历的步长值varStatus
属性表示当前遍历到的数据的状态public class Student {
private Integer id;
private String username;
private String password;
private Integer age;
private String phone;
}
<%
List<Student> studentList = new ArrayList<Student>();
for (int i = 1; i <= 10; i++) {
studentList.add(new Student(i,"username"+i ,"pass"+i,18+i,"phone"+i));
}
request.setAttribute("stus", studentList);
%>
<%--
可以将前面的begin、end、items、var结合起来
注意 begin、end 设置的是索引值,所以以下代码输出的是id为3-8部分
--%>
<c:forEach begin="2" end="7" items="${requestScope.stus}" var="stu">
${stu.id}<br/>
${stu.username}<br/>
${stu.password}<br/>
${stu.age}<br/>
${stu.phone}<br/>
${status.step}<br/>
c:forEach>
step
属性表示遍历的步长值 ,默认为 0step="2"
相当于 for(int i = 1; i < 10; i+=2)里面的 i+=2
输出是隔行输出:1、3、5、7…<c:forEach begin="2" end="7" step="2" varStatus="status" items="${requestScope.stus}" var="stu">
${stu.id}<br/>
${stu.username}<br/>
${stu.password}<br/>
${stu.age}<br/>
${stu.phone}<br/>
${status.step}<br/>
c:forEach>
varStatus
属性表示当前遍历到的数据的状态
比如:
status.step
调用的就是 getStep() 方法,获取 step 属性值<c:forEach varStatus="status" items="${requestScope.stus}" var="stu">
${status.step}
c:forEach>