4. EL和JSTL核心技术
4.1 EL表达式
4.1.1 基本概念
EL(Expression Language)表达式提供了在JSP中简化表达式的方法,可以方便地访问各种数据并输出。
4.1.2 主要功能
依次访问pageContext、request、session和application作用域对象存储的数据。
获取请求参数值。
访问Bean对象的属性。
访问集合中的数据。
输出简单的运算结果。
4.1.3 访问内置对象的数据
(1)访问方式
<%=request.getAttribute(“ varName”)%>
用EL实现: ${ varName }
(2)执行流程
4.1.4 访问请求参数的数据
在EL之前使用下列方式访问请求参数的数据
request.getParameter(name);
request.getParameterValues(name);
在EL中使用下列方式访问请求参数的数据
param:接收的参数只有一个值。
paramValues:接受的参数有多个值。
<!-- 获取指定参数的数值 -->
${param.name}
<!-- 获取指定参数中指定下标的数值 -->
${paramValues.hobby[0]}
<body>
<%
request.setCharacterEncoding("utf-8");
%>
<%-- 使用JSP语法中的原始方式获取请求参数值 --%>
<%--<%= "姓名是:" + request.getParameter("name") %><br/>
<%= "爱好是:" + Arrays.toString(request.getParameterValues("hobby")) %><br/>--%>
<%-- 使用EL表达式中的方式获取请求参数值 --%>
姓名是:${param.name}<br/>
爱好是:${paramValues.hobby[0]}<br/>
</body>
4.1.5 访问Bean对象的属性
(1)访问方式
方式一: $ { 对象名 . 属性名 },例如:${user.name}
方式二: $ { 对象名 [“属性名”] },例如:${user[“name”]}
(2)主要区别
当要存取的属性名中包含一些特殊字符,如: . 或 ,等并非字母或数字的符号,就一定要使用 [ ]而不是.的方式
使用[]的方式可以动态取值,具体方式如下:
<%
request.setAttribute(“prop”,“age”);
%>
<!-- 相当于表达式中写一个变量 -->
${ user[prop] }
<body>
<%-- 使用JSP语法规则中的原始方式实现对象的创建和设置以及输出 --%>
<%
Person person = new Person();
person.setName("zhangfei");
person.setAge(30);
pageContext.setAttribute("person", person);
pageContext.setAttribute("var1", "name");
pageContext.setAttribute("var2", "age");
%>
<%--<%= "获取到的姓名为:" + person.getName() %><br/>
<%= "获取到的年龄为:" + person.getAge() %><br/>--%>
<%-- 使用EL表达式实现属性的获取和打印 --%>
<%--获取到的姓名是:${person.name}<br/>
获取到的年龄是:${person.age}<br/>--%>
<%-- 另外一种写法 --%>
<%--${person["name"]}<br/>
${person["age"]}<br/>--%>
<%-- 测试一下动态取值的效果 --%>
动态取值的结果为:${person[var1]}
</body>
4.1.6 访问集合中的数据
<!-- student为ArrayList类型的对象 -->
${student[0].name}
<body>
<%
// 准备一个List集合并添加数据内容
List<String> list = new LinkedList<>();
list.add("two");
list.add("one");
list.add("three");
// 将整个集合放入指定的内置对象中
pageContext.setAttribute("list", list);
// 准备一个Map集合并添加数据
Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", 2);
map.put("th.ree", 3);
// 将整个集合放入指定的内置对象中
pageContext.setAttribute("map", map);
%>
<%-- 使用EL表达式实现集合中数据内容的获取 --%>
集合中下标为0的元素是:${list[0]}<br/> <%-- two --%>
集合中下标为1的元素是:${list[1]}<br/> <%-- one --%>
集合中下标为2的元素是:${list[2]}<br/> <%-- three --%>
<hr/>
<%-- 使用EL表达式实现Map集合中数据内容的获取 不支持下标 --%>
整个Map集合中的元素有:${map}<br/>
获取带有特殊字符key对应的数值为:${map["th.ree"]}<br/> <%-- 3 --%>
</body>
4.1.7 常用的内置对象
类别 | 标识符 | 描述 |
---|---|---|
JSP | pageContext | PageContext 处理当前页面 |
作用域 | pageScope | 同页面作用域属性名称和值有关的Map类 |
requestScope | 同请求作用域属性的名称和值有关的Map类 | |
sessionScope | 同会话作用域属性的名称和值有关的Map类 | |
applicationScope | 同应用程序作用域属性的名称和值有关的Map类 | |
请求参数 | param | 根据名称存储请求参数的值的Map类 |
paramValues | 把请求参数的所有值作为一个String数组来存储的Map类 | |
请求头 | header | 根据名称存储请求头主要值的Map类 |
headerValues | 把请求头的所有值作为一个String数组来存储的Map类 | |
Cookie | cookie | 根据名称存储请求附带的cookie的Map类 |
初始化参数 | initParam | 根据名称存储Web应用程序上下文初始化参数的Map类 |
<body>
<%
/*pageContext.setAttribute("name1", "pageContext对象中的属性值:zhangfei");
request.setAttribute("name2", "request对象中的属性值:guanyu");
session.setAttribute("name3", "session对象中的属性值:liubei");
application.setAttribute("name4", "session对象中的属性值:zhaoyun");*/
//pageContext.setAttribute("name", "pageContext对象中的属性值:zhangfei");
//request.setAttribute("name", "request对象中的属性值:guanyu");
//session.setAttribute("name", "session对象中的属性值:liubei");
application.setAttribute("name", "session对象中的属性值:zhaoyun");
%>
<%-- 使用JSP中原始方式获取数据和打印 --%>
<%--<%= "name1的数值为:" + pageContext.getAttribute("name1") %><br/> <%– zhangfei –%>
<%= "name2的数值为:" + request.getAttribute("name2") %><br/> <%– guanyu –%>
<%= "name3的数值为:" + session.getAttribute("name3") %><br/> <%– liubei –%>
<%= "name4的数值为:" + application.getAttribute("name4") %><br/> <%– zhaoyun –%>--%>
<%-- 使用EL表达式实现获取数据和打印 --%>
<%--<h1>name1的数值为:${name1}</h1><br/>
name2的数值为:${name2}<br/>
name3的数值为:${name3}<br/>
name4的数值为:${name4}<br/>--%>
<h1>name的数值为:${name}</h1><br/>
</body>
4.1.8 常用的运算符
(1)常用的算术运算符
算术运算符 | 说 明 | 范 例 | 运算结果 |
---|---|---|---|
+ | 加 | ${1+2} | 3 |
- | 减 | ${2-1} | 1 |
* | 乘 | ${2*3} | 6 |
/ 或 div | 除 | 16 / 5 或 {16/5}或 16/5或{16div5} | 3.2 |
% 或 mod | 取余 | KaTeX parse error: Expected '}', got 'EOF' at end of input: {16%5}或{16mod5} | 1 |
(2)常用的关系运算符
关系运算符 | 说 明 | 范 例 | 运算结果 |
---|---|---|---|
==或eq | 等于 | 1 = = 2 或 {1==2}或 1==2或{1 eq 2} | false |
!= 或ne | 不等于 | 2 ! = 1 或 {2!=1}或 2!=1或{1 ne 2} | true |
< 或lt | 小于 | 2 < 3 或 {2<3}或 2<3或{2 lt 3 } | true |
> 或 gt | 大于 | 16 > 5 或 {16>5}或 16>5或{16 gt 5} | true |
<= 或 le | 小于等于 | 16 < = 5 或 {16<=5}或 16<=5或{16 le 5} | false |
>= 或 ge | 大于等于 | 16 > = 5 或 {16>=5}或 16>=5或{16 ge 5} | true |
(3)常用的逻辑运算符
逻辑运算符 | 说 明 | 范 例 | 运算结果 |
---|---|---|---|
&& 或 and | 与运算 | KaTeX parse error: Expected '}', got '&' at position 6: {true&̲&true}或{true and true} | true |
|| 或or | 或运算 | t r u e ∥ ∥ f a l s e 或 {true\|\|false}或 true∥∥false或{true or false} | true |
! 或not | 非运算 | ! t r u e 或 {!true}或 !true或{not true } | false |
(4)条件运算符
${条件表达式? 语句1 : 语句2}
(5)验证运算符
${empty 表达式}
返回布尔值判断表达式是否为"空"值,null值、无元素的集合或数组、长度为零的String被认为是空值。
4.2 JSTL标签
4.2.1 基本概念
JSTL( JSP Standard Tag Library ) 被称为JSP标准标签库。
开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
4.2.2 使用方式
下载JSTL的jar包并添加到项目中,下载地址为:https://tomcat.apache.org/download-taglibs.cgi
在JSP页面中使用taglib指定引入jstl标签库,方式为:
<!-- prefix属性用于指定库前缀 -->
<!-- uri属性用于指定库的标识 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
4.2.3 常用核心标签
(1)输出标签
<c:out> </c:out> 用来将指定内容输出的标签
(2)设置标签
<c:set></c:set> 用来设置属性范围值的标签
<body>
<%-- 表示设置一个名字为name的属性,对应的数值为zhangfei,有效范围为:page --%>
<%-- pageContext.setAttibute("name", "zhangfei") --%>
<c:set var="name" value="zhangfei" scope="page"></c:set>
<%-- 使用out标签打印出来 --%>
<c:out value="${name}"></c:out>
<hr/>
<%-- 设置一个对象的属性值并打印出来 --%>
<jsp:useBean id="person" class="com.lagou.demo01.Person" scope="page"></jsp:useBean>
<c:set property="name" value="guanyu" target=&