EL表达式&JSTL表达式
1.EL表达式
1.1 概述
EL表达式格式 : ${}
- 获取数据
- 执行运算
- 获取web开发的常用对象
EL表达式在输出null值的时候,输出的是空字符串,而jsp表达式输出的是null
EL 提供“.“和“[ ]“两种运算符来存取数据。
当要存取的属性名称中包含一些特殊字符,如 . 或 - 等并非字母或数字的符号,就一定要使用“[ ]“。
1.2 EL表达式搜索域数据的顺序
EL表达式主要是在jsp页面中输出数据。主要是输出域对象中的数据。
<%
request.setAttribute("key","value2");
pageContext.setAttribute("key","value1");
session.setAttribute("key","value3");
application.setAttribute("key","value4");
%>
${ key }
测试发现:当四个域中都有相同的key的数据的时候 ,EL表达式会按照四个域的从小到大的顺序去进行输出。
1.3 EL表达式输出JavaBean的普通属性,数组属性。List集合属性,Map集合属性。
<body>
<%
Person person = new Person();
person.setName("张三");
person.setPhones(new String[]{
"12345678",
"12121212",
"19060207110"
});
ArrayList<String> cities = new ArrayList<>();
cities.add("西安");
cities.add("北京");
cities.add("上海");
person.setCities(cities);
HashMap<String, Object> map = new HashMap<>();
map.put("key1","value1");
map.put("key2",2);
map.put("key3","value3");
person.setMap(map);
pageContext.setAttribute("person",person);
%>
输出Person:${person}<\br>
输出Person name:${person.name}<br>
输出Person 数组phones:${person.phones}<br>
输出Person phones[1]:${person.phones[1]}<br>
输出Person List集合cities:${person.cities}<br>
输出Person cities[1]:${person.cities}<br>
输出Person Map集合map:${person.map}<br>
输出Person map key1:${person.map.get("key1")}<br>
</body>
输出:
原理:EL表达式里面,找到的JavaBean的相应的值其实是调用了get方法,所以当一个实体类没有get方法,EL表达式获取不到相应的属性值。
1.4 EL表达式来进行运算
术语 | 定义 |
---|---|
算术型 | +、-(二元)、*、/、div、%、mod、-(一元) |
逻辑型 | and、&&、or、||、!、not |
关系型 | ==、eq、!=、ne、<、lt、>、gt、<=、le、>=、ge。可以与其他值进行比较,或与布尔型、字符串型、整型或浮点型文字进行比较。 |
空 | empty 空操作符是前缀操作,可用于确定值是否为空。 |
条件型 | A ?B :C。根据 A 赋值的结果来赋值 B 或 C。 |
1.5 EL表达式的11个隐含对象
隐式对象
JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP scriplet 和表达式中可用:
术语 | 定义 |
---|---|
pageContext | JSP 页的上下文。它可以用于访问 JSP 隐式对象,如请求、响应、会话、输出、servletContext 等。例如,${pageContext.response} 为页面的响应对象赋值。 |
此外,还提供几个隐式对象,允许对以下对象进行简易访问:
术语 | 定义 |
---|---|
param | 将请求参数名称映射到单个字符串参数值(通过调用 ServletRequest.getParameter (String name) 获得)。getParameter (String) 方法返回带有特定名称的参数。表达式 ${param . name}相当于 request.getParameter (name)。 |
paramValues | 将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues. name} 相当于 request.getParamterValues(name)。 |
header | 将请求头名称映射到单个字符串头值(通过调用 ServletRequest.getHeader(String name) 获得)。表达式 ${header. name} 相当于 request.getHeader(name)。 |
headerValues | 将请求头名称映射到一个数值数组(通过调用 ServletRequest.getHeaders(String) 获得)。它与头隐式对象非常类似。表达式 ${headerValues. name} 相当于 request.getHeaderValues(name)。 |
cookie | 将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表达式 $ { cookie. name .value} 返回带有特定名称的第一个 cookie 值。如果请求包含多个同名的 cookie,则应该使用 $ {headerValues. name} 表达式。 |
initParam | 将上下文初始化参数名称映射到单个值(通过调用 ServletContext.getInitparameter(String name) 获得)。 |
除了上述两种类型的隐式对象之外,还有些对象允许访问多种范围的变量,如 Web 上下文、会话、请求、页面:
术语 | 定义 |
---|---|
pageScope | 将页面范围的变量名称映射到其值。例如,EL 表达式可以使用 ${pageScope.objectName} 访问一个 JSP 中页面范围的对象,还可以使用 ${pageScope .objectName. attributeName} 访问对象的属性。 |
requestScope | 将请求范围的变量名称映射到其值。该对象允许访问请求对象的属性。例如,EL 表达式可以使用 $ { requestScope. objectName} 访问一个 JSP 请求范围的对象,还可以使用 ${requestScope. objectName. attributeName} 访问对象的属性。 |
sessionScope | 将会话范围的变量名称映射到其值。该对象允许访问会话对象的属性。例如:${sessionScope. name} |
applicationScope | 将应用程序范围的变量名称映射到其值。该隐式对象允许访问应用程序范围的对象。 |
示例
<%
request.setAttribute("key","value2");
pageContext.setAttribute("key","value1");
session.setAttribute("key","value3");
application.setAttribute("key","value4");
%>
<%--获取key1的值--%>
${pageScope.key}
${requestScope.key}
${sessionScope.key}
${applicationScope.key}
输出:value1 value2 value3 value4
pageContext示例:
<body>
协议:${pageContext.request.scheme}<br>
服务器ip:${pageContext.request.serverName}<br>
服务器端口号:${pageContext.request.serverPort}<br>
获取工程路径:${pageContext.request.contextPath}<br>
获取请求方法:${pageContext.request.method}<br>
获取客户端ip地址:${pageContext.request.remoteHost}<br>
获取会话的id编号:${pageContext.session.id}<br>
</body>
输出:
2.JSTL标签库
2.1概述
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别。
- 核心标签
- 格式化标签
- SQL 标签
- XML 标签
- JSTL 函数
JSP 标准标签库(JSTL) | 菜鸟教程 (runoob.com)
JSTL标签库的使用就是弥补HTML标签的不足;它自定义许多标签,可以供我们使用,标签的功能和java代码一样
2.2 导入的包或者maven配置
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
2.3 使用步骤:
- 引入相应的taglib
- 使用其中的方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-skx1YOcD-1633703734453)(D:/Java/note/image-20211004152651848.png)]
c:if
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入JSTL核心标签库,我们才能使用JSTL标签--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h4>if测试</h4>
<form action="coreif.jsp" method="get">
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登录">
</form>
<%--判断提交的用户名是管理员,登陆成功--%>
<c:if test="${param.username == 'admin'}" var="
isAdmin">
<c:out value="欢迎"></c:out>
</c:if>
c:when c:chhose c:otherwise
<%--定义一个变量score,值85--%>
<c:set var="score" value="50"/>
<c:choose>
<c:when test="${score >= 90}">
你的成绩为优秀
</c:when>
<c:when test="${score >= 80}">
你的成绩为良好
</c:when>
<c:when test="${score >= 70}">
你的成绩为中等
</c:when>
<c:when test="${score >= 60}">
你的成绩为及格
</c:when>
<c:otherwise>
你的成绩为不及格
</c:otherwise>
</c:choose>
c:forEach
<%
ArrayList<String> people = new ArrayList<>();
people.add(0,"张三");
people.add(1,"李四");
people.add("王五");
request.setAttribute("list",people);
%>
<%--
var:每一次遍历出来的变量
items:要遍历的对象
begin:开始
end:结束
step:步长
--%>
<c:forEach var="people" items="${list}">
<c:out value="${people}"/><br>
</c:forEach>
<hr>
<c:forEach begin="1" end="3" step="2" var="people" items="${list}">
<c:out value="${people}"/><br>
</c:forEach>
c:set
<%--
c:set
作用:往域中保存数据
scope:域
var:key名
value:value值
--%>
保存之前:${ pageContext.abc }<br>
<c:set scope="page" var="abc" value="value1"/>
保存之后:${ pageContext.abc }