1.EL表达式
定义
全称是Expression Language,表达式语言。
作用
主要是代替jsp页面中的表达式脚本在jsp页面中进行数据的输出,因为EL表达式在输出数据的时候要比jsp表达式脚本更加简洁。
格式
${表达式}
- EL表达式在输出null值的时候,输出的是空串;
- jsp表达式脚本在输出null值的时候,输出的是null字符串。
<body>
<%
request.setAttribute("key", "value");
%>
jsp表达式脚本输出key的值是:
<%=request.getAttribute("key")%><br/>
EL表达式输出key的值是:${key}
</body>
EL表达式搜索域数据的顺序
当四个域中都有相同key的数据的时候,EL表达式会按照四个域从大到小的顺序去搜索,找到就输出。
<body>
<%
//向四个域中都保存相同的key的数据
request.setAttribute("key", "request");
session.setAttribute("key", "session");
application.setAttribute("key", "application");
pageContext.setAttribute("key", "pageContext");
%>
${key}
</body>
EL表达式输出Bean的普通、数组、List集合、map集合属性
- 例:输出Person类中普通属性、数组属性、List集合属性、map集合属性
- Person类:
public class Person {
private String name;
private String[] phone;
private List<String> cities;
private Map<String,Object> map;
private int age = 18;
public int getAge() {
return age;
}
}
- jsp页面代码:
<body>
<%
Person person = new Person();
person.setName("张三");
person.setPhone(new String[]{"123456"});
ArrayList<String> cities = new ArrayList<>();
cities.add("北京");
cities.add("上海");
cities.add("深圳");
person.setCities(cities);
Map<String,Object> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
person.setMap(map);
pageContext.setAttribute("person", person);
%>
输出Person:${person}<br/>
输出Person的name属性:${person.name}<br/>
输出Person的phone属性的第一个值:${person.phone[0]}<br/>
输出Person的cities属性的第一个值:${person.cities[0]}<br/>
输出Person的map属性的key1的值:${person.map.key1}<br/>
输出Person的age属性:${person.age}<br/>
</body>
EL表达式的运算
EL表达式支持如下运算符:
1.关系运算
关系运算符 | 说明 | 示例 |
---|---|---|
“== 或 eq” | 等于 | ${1 == 1} 或 ${1 eq 1} |
“!= 或 ne” | 不等于 | ${1 != 1} 或 ${1 ne 1} |
“< 或 lt” | 小于 | ${1 < 2} 或 ${1 lt 2} |
“> 或 gt” | 大于 | ${2 > 1} 或 ${2 gt 1} |
“<= 或 le” | 小于等于 | ${1 <= 2} 或 ${1 le 2} |
“>= 或 ge” | 大于等于 | ${2 >= 1} 或 ${2 ge 1} |
2.逻辑运算
逻辑运算符 | 说明 | 示例 |
---|---|---|
“&& 或 and” | 与运算 | ${1 == 1 && 1< 2} 或 ${1 == 1 and 1< 2} |
“|| 或 or” | 或运算 | ${1 == 1 || 1< 2} 或 ${1 == 1 or 1< 2} |
“! 或 not” | 取反运算 | ${!true} 或 ${not true} |
3.算术运算
算术运算符 | 说明 | 示例 |
---|---|---|
“+” | 加法 | ${1 + 1} |
“-” | 减法 | ${1 - 1} |
“*” | 乘法 | ${1 * 1} |
“/ 或 div” | 除法 | ${1 /1} 或 ${1 div 1} |
“% 或 mod” | 取模 | ${14 % 10} 或 ${ 14 mod 10} |
4.empty运算
-
empty运算可以判断一个数据是否为空,如果为空,则输出true,不为空则输出false。
-
以下几种情况为空:
- 值为null时,为空;
- 值为空串时,为空;
- 值是Object类型数组,长度为0时,为空;
- list集合,元素个数为0时,为空;
- map集合,元素集合为0时,为空。
例:
<body>
<%
// 1、值为 null 值的时候,为空
request.setAttribute("emptyNull", null);
// 2、值为空串的时候,为空
request.setAttribute("emptyStr", "");
// 3、值是 Object 类型数组,长度为零的时候
request.setAttribute("emptyObj", new Object[]{});
// 4、list 集合,元素个数为零
List<String> list = new ArrayList<>();
request.setAttribute("emptyList",list);
// 5、map 集合,元素个数为零
Map<String,Object> map = new HashMap<String, Object>();
request.setAttribute("emptyMap", map);
%>
${empty emptyNull}<br>
${empty emptyStr}<br>
${empty emptyObj}<br>
${empty emptyList}<br>
${empty emptyMap}<br>
</body>
5.三元运算
- 表达式1 ? 表达式2 : 表达式3
- 如果表达式1的值为真,则返回表达式2的值;
- 如果表达式1的值为假,则返回表达式3的值。
例:
${1 != 1 ? "1为真","为假"}
6.“.”运算和[]中括号运算符
- 点运算可以输出Bean对象中某个属性的值。
- []中括号运算,可以输出有序集合中某个元素的值,并且[]中括号运算,还可以输出map集合中key里含有特殊字符的key的值。
EL表达式的11个隐含对象
EL表达式中的11个隐含对象,是EL表达式本身已定义,可以直接使用。
变量 | 类型 | 作用 |
---|---|---|
pageContext | pageContextImpl | 可以获取jsp中的九大内置对象 |
pageScope | Map<String,Object> | 可以获取PageContext域中的数据 |
requestScope | Map<String,Object> | 可以获取Request域中的数据 |
sessionScope | Map<String,Object> | 可以获取session域中的数据 |
applicationScope | Map<String,Object> | 可以获取ServletContext域中的数据 |
param | Map<String,String> | 可以获取请求参数的值 |
paramValues | Map<String,String[]> | 可以获取多个请求参数的值 |
header | Map<String,String> | 可以获取请求头的信息 |
headerValues | Map<String,String[]> | 可以获取多个请求头的信息 |
cookie | Map<String,Cookie> | 可以获取当前请求的Cookie信息 |
initParam | Map<String,String> | 可以获取在web.xml中配置的context-param上下文参数 |
1.EL获取四个特定域中的属性
- pageScope————pageContext域
- requestScope————Request域
- sessionScope————Session域
- applicationScope————ServletContest域
例:
<body>
<%
pageContext.setAttribute("key1", "pageContext1");
pageContext.setAttribute("key2", "pageContext2");
request.setAttribute("key1", "request1");
request.setAttribute("key2", "request2");
%>
${pageScope.key1}<br>
${requestScope.key1}
</body>
2.pageContext对象的使用
- request.getScheme()————可以获取请求的协议
- request.getServerName()————可以获取请求的服务器ip或域名
- request.getServerPort()————可以获取请求的服务器端口号
- request.getContextPath()————可以获取当前工程路径
- request.getMethod()————可以获取请求的方式
- request.getRemoteHost()————可以获取客户端的ip地址
- session.getId()————可以获取会话的唯一标识
例:
<body>
<%
pageContext.setAttribute("req", request);
%>
1. 协议:${req.scheme}<br>
2. 服务器ip:${req.serverName}<br>
3. 服务器端口:${req.serverPort}<br>
4. 获取工程路径:${req.contextPath}<br>
5. 获取请求方法:${req.method}<br>
6. 获取客户端 ip 地址:${req.remoteHost}<br>
7. 获取会话的 id 编号:${req.session.id}<br>
</body>
3.EL表达式其他隐含对象的使用
变量 | 类型 | 作用 |
---|---|---|
param | Map<String,String> | 可以获取请求参数的值 |
paramValues | Map<String,String[]> | 可以获取多个请求参数的值 |
例:
输出请求参数username的值:${param.username}
输出请求参数hobby的值:${paramValues.hobby[0]}
输出请求参数hobby的值:${paramValues.hobby[1]}
变量 | 类型 | 作用 |
---|---|---|
header | Map<String,String> | 可以获取请求头的信息 |
headerValues | Map<String,String[]> | 可以获取多个请求头的信息 |
例:
输出请求头【User-Agent】的值:${header['User-Agent']}
输出请求头【Connection】的值:${header.Connection}
输出请求头【User-Agent】的值:${headerValues['User-Agent'][0]}
变量 | 类型 | 作用 |
---|---|---|
cookie | Map<String,Cookie> | 可以获取当前请求的Cookie的信息 |
例:
获取Cookie的名称:${cookie.JESSIONID.name}
获取Cookie的值:${cookie.JESSIONID.value}
变量 | 类型 | 作用 |
---|---|---|
initParam | Map<String,String> | 可以获取在web.xml中配置的context-param上下文参数 |
例:
- web.xml中的配置:
<context-param>
<param-name>username</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql:///test</param-value>
</context-param>
- 代码:
Context-param中username的值:${initParam.username}
Context-param中url的值:${initParam.url}
2.JSTL标签库
定义
- JSTL标签库全称是指JSP Standard Tag Library,是一个不断完善的开放源代码的JSP标签库。
作用
- 为了替代代码脚本,使jsp页面更加简洁。
组成
- JSTL标签库由五个不同功能的标签库组成。
功能范围 | 前缀 |
---|---|
核心标签库 | c |
格式化 | fmt |
函数 | fn |
数据库 | sql |
XML | x |
使用步骤
- 先导入JSTL标签库的jar包
- 使用taglib指令引入标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
core核心库使用
1.< c:set/ >
- 作用:set标签可以往域中保存数据。
- 格式:
保存之前:${requestScope.abc}<br>
<c:set scope="request" var="abc" value="abcValue"/>
保存之后:${requestScope.abc}<br>
- 说明:
- scope属性设置保存到哪个域,默认是保存到pageContext域;
- var属性设置key;
- value属性设置值。
2.< c:if / >
- 作用:用来做if判断。
- 格式:
<c:if test="${12 == 12}">
<h1>12等于12</h1>
</c:if>
- 说明:
- test属性表示判断的条件,使用EL表达式输出。
3.< c:choose >< c:when >< c:otherwise >标签
- 作用:进行多路判断。
- 格式:
<%
request.setAttribute("height", 148);
%>
<c:choose>
<c:when test="${requestScope.height > 190}">
<h2>巨人</h2>
</c:when>
<c:when test="${requestScope.height > 180}">
<h2>小巨人</h2>
</c:when>
<c:when test="${requestScope.height > 170}">
<h2>正常</h2>
</c:when>
<c:otherwise>
<c:choose>
<c:when test="${requestScope.height > 160}">
<h3>大于160</h3>
</c:when>
<c:when test="${requestScope.height > 150}">
<h3>大于150</h3>
</c:when>
<c:when test="${requestScope.height > 140}">
<h3>大于140</h3>
</c:when>
<c:otherwise>
<h3>小于140</h3>
</c:otherwise>
</c:choose>
</c:otherwise>
</c:choose>
- 说明:
- choose标签开始选择判断;
- when标签表示每一种判断情况;
- test属性表示当前这种判断情况的值;
- otherwise标签表示剩下的情况。
- 注意事项:
- 标签里不能使用html注释,要使用jsp注释;
- when标签的父标签一定是choose标签。
4.< c:forEach />
- 作用:遍历输出使用。
遍历1到10并输出
- 格式:
<c:forEach begin="1" end="10" var="i">
${i}
</c:forEach>
- 说明:
- begin属性设置开始的索引;
- end属性设置结束的索引;
- var属性表示循环的变量。
遍历Object数组
- 格式:
<%
request.setAttribute("arr", new String[]{"123","456"});
%>
<c:forEach items="${requestScope.arr}" var="item">
${item}
</c:forEach>
- 说明:
- items属性表示遍历的数据源(集合);
- var属性表示循环的变量。
遍历Map集合
- 格式:
<%
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">
${entry.key} = ${entry.value}<br>
</c:forEach>
- 说明:
- items属性表示遍历的数据源;
- var属性表示循环的变量。
遍历List集合
- 格式:
- Student类:
public class Student {
private Integer id;
private String username;
private String password;
private Integer age;
private String phone;
}
- jsp代码:
<%
List<Student> studentList = new ArrayList<Student>();
for (int i = 1; i <= 10; i++) {
studentList.add(new Student(i,"username" + i,"password" + i,18 + i,"phone" + i));
}
request.setAttribute("stus", studentList);
%>
<c:forEach begin="2" end="7" step="2" varStatus="status" items="${requestScope.stus}" var="stu">
<tr>
<td>${stu.id}</td>
<td>${stu.username}</td>
<td>${stu.password}</td>
<td>${stu.age}</td>
<td>${stu.phone}</td>
<td>${status.step}</td>
</c:forEach>
- 说明:
- items属性表示遍历的数据源;
- var属性表示循环的变量;
- begin属性表示遍历开始的索引值;
- end属性表示遍历结束的索引值;
- step属性表示遍历的步长值;
- varStatus属性表示当前遍历到的数据的状态。