文章目录
举例一个简单的用户信息展示场景,包含用户的姓名和年龄。
下面分别用 JSP 脚本和 EL 表达式两种方式实现这个功能。
使用 JSP 脚本
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.*" %>
<html>
<head><title>用户信息</title></head>
<body>
<%
Map<String, Object> user = new HashMap<>();
user.put("name", "张三");
user.put("age", 25);
request.setAttribute("user", user);
%>
<p>用户名: <%= ((Map)request.getAttribute("user")).get("name") %></p>
<p>年龄: <%= ((Map)request.getAttribute("user")).get("age") %></p>
</body>
</html>
创建Map模拟用户数据,并将其作为请求属性设置。然后使用
<%= ... %>
语法从Map中获取并显示用户的姓名和年龄。
使用 EL 表达式
isELIgnored="false"
开启 EL 表达式(idea2023自动开启)
<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false" language="java" %>
<%@ page import="java.util.*" %>
<html>
<head><title>用户信息</title></head>
<body>
<%
Map<String, Object> user = new HashMap<>();
user.put("name", "张三");
user.put("age", 25);
request.setAttribute("user", user);
%>
<p>用户名: ${user.name}</p>
<p>年龄: ${user.age}</p>
</body>
</html>
该例同样设置了用户数据为请求属性,但使用了
${...}
这样的EL表达式来引用这些属性。
EL表达式
EL(Expression Language)表达式是JavaServer Pages (JSP) 技术的一部分,它提供了一种方便的方法来访问和处理存储在JavaBeans组件中的数据。使用EL表达式的优点包括简化页面上的代码、提高可读性以及更好地分离业务逻辑与表示层。
EL 表达式标准格式:${expression}
expression
可以是任何有效的表达式,包括变量、方法调用等。
操作符 | 描述 | 示例 |
---|---|---|
点操作符(. ) | 访问对象的属性 | ${news.title} |
方括号操作符([] ) | 访问对象的属性 访问属性或集合元素 | ${news["title"]} == ${news.title} ${newsList[0]} & ${map['key']} |
EL严格区分大小写,严格按规范书写,养成良好编码习惯
运算符
EL 不仅提供了访问和操作数据的方法,还包含了一系列运算符来支持基本的算术、比较和逻辑操作。这些运算符使得可以在 JSP 页面中直接进行简单的计算和条件判断。
运算符 | 说明 |
---|---|
( ) | 改变执行的优先级,例如 ${3\*(4+5)} |
+,-,*,/,% | 算术运算符 |
==,!=,>,>=,<,<= | 关系运算符 |
&&,||,! | 逻辑运算符 |
?: | 条件运算符,例如 ${a>b?1:2} |
empty,not empty | 用来检查变量是否(不)为空或null,例如 ${empty user.name} |
in,not in | 检查左边的操作数是否(不)是右边集合的一个元素,例如 ${'admin' in roles} |
为了避免 JSP 混淆运算符和页面关键字,很多运算符都有替代写法。
关系运算符 | 范例 | 结果 |
---|---|---|
== 或 eq | 5 = = 5 或 {5 == 5}或 5==5或{5 eq 5} | true |
!= 或 ne | 5 ! = 5 或 {5 != 5}或 5!=5或{5 ne 5} | false |
< 或 lt | 3 < 5 或 {3 < 5}或 3<5或{3 lt 5} | true |
> 或 gt | ${3 > 5}或{3 gt 5} | false |
<= 或 le | 3 < = 5 或 {3 <= 5}或 3<=5或{3 le 5} | true |
>= 或 ge | 3 > = 5 或 {3 >= 5}或 3>=5或{3 ge 5} | false |
逻辑运算符 | 范例 | |
&& 或 and | ${user.age >= 18 && user.isAdmin == true} | |
||或 or | ${user.isAdmin == true || user.isModerator == true} | |
! 或 not | ${!empty user.name} |
错误示范
${param.password1} == ${param.password2}
${ ${param.password1 } == ${ param.password2 } }
- 分别解析
${param.password1}
和${param.password2}
为字符串,且==
将被视为纯文本而不是比较运算符 - EL 表达式不允许嵌套使用花括号
{}
正确示例
在 JSP 页面中根据密码是否匹配来执行某些逻辑,可使用 <c:if>
标签结合 EL 表达式实现
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>密码比较示例</title></head>
<body>
<c:if test="${param.password1 == param.password2}">
<p>两次输入的密码一致。</p>
</c:if>
<c:if test="${param.password1 != param.password2}">
<p>两次输入的密码不一致,请重新输入。</p>
</c:if>
</body>
</html>
EL功能
获取对象属性
使用EL表达式可以直接访问JavaBean对象的属性,前提是该对象已经通过某种方式(如request.setAttribute
、session.setAttribute
或application.setAttribute
)设置到了作用域中。
${bean.propertyName}
<%
News news = new News();
news.setTitle("今日新闻");
request.setAttribute("news", news);
%>
<p>新闻标题: ${news.title}</p>
获取集合元素
对于数组、列表和映射,可以通过索引来访问特定的元素。
-
数组/列表:
${list[0]}
-
映射:
${map['key']}
<%
List<String> list = Arrays.asList("第一条新闻", "第二条新闻");
Map<String, String> map = new HashMap<>();
map.put("first", "第一条新闻");
request.setAttribute("list", list);
request.setAttribute("map", map);
%>
<p>列表中的第一条新闻: ${list[0]}</p>
<p>映射中的第一条新闻: ${map['first']}</p>
数据处理运算
EL支持基本的算术运算符,可以用来进行简单的计算。假设需要计算总页数:
<%
int totalRecordCount = 100;
int pageSize = 10;
request.setAttribute("totalRecordCount", totalRecordCount);
request.setAttribute("pageSize", pageSize);
%>
<p>总页数: ${totalRecordCount / pageSize}</p>
屏蔽常见异常
如果尝试访问一个不存在的属性或空对象,EL默认不会抛出异常,而是返回空字符串或null
。这有助于提高程序的健壮性。
<% // 没有设置username %>
<p>用户名: ${username}</p>
<!-- 输出为空 -->
自动类型转换
EL会根据上下文自动进行类型转换。例如,如果从作用域中获取的对象是News
类型,那么${news}
会自动转换为News
类型的对象。
<%
News news = new News();
news.setTitle("今日新闻");
request.setAttribute("news", news);
%>
<% // 相当于 (News) request.getAttribute("news") %>
<p>新闻对象: ${news}</p>
<!-- 这里通常会输出news对象的toString()方法的结果 -->
EL访问作用域
作用域 | Java代码取值 | EL取值 |
---|---|---|
请求作用域 | request.getAttribute(“news”); | ${ requestScope.news } |
会话作用域 | session.getAttribute(“username”); | ${ sessionScope.username } |
程序作用域 | application.getAttribute(“count”); | ${ applicationScope.count } |
页面作用域 | pageContext.getAttribute(“userNum”); | ${ pageScope.userNum } |