【Java 进阶篇】JSP EL 详解

在这里插入图片描述

在 Java Web 开发中,JavaServer Pages(JSP)是一种强大的技术,用于创建动态 Web 应用程序。JSP 的一个关键方面是 Expression Language(EL)表达语言,它允许您在 JSP 页面中嵌入 Java 代码,以便在页面上访问和操作数据。本博客将深入探讨 JSP EL,从入门到精通。

什么是 JSP EL?

EL(Expression Language)是一种用于在 JSP 页面中嵌入动态内容的技术。它提供了一种访问和操作数据的方式,使得在 JSP 页面中可以轻松地嵌入 Java 变量、方法和表达式。使用 EL,您可以更轻松地将数据呈现在 Web 页面上,而无需大量的 Java 代码。

为什么需要 EL?

在传统的 JSP 开发中,要在页面上显示数据,通常需要使用大量的 Java 代码。这可能导致页面变得复杂,不易维护。EL 的引入旨在解决这个问题,它提供了一种更简单和干净的方式来访问和显示数据。

EL 的好处包括:

  • 简洁性:EL 允许您使用简洁的语法来访问和显示数据,而无需编写大量的 Java 代码。
  • 可读性:EL 代码更容易阅读和理解,特别是对于那些不熟悉 Java 的前端开发人员。
  • 可维护性:EL 代码更易于维护,因为它减少了代码的复杂性。
  • 模块化:使用 EL,您可以将数据和表示分开,使代码更易于维护和扩展。

EL 基础

在开始深入研究 JSP EL 之前,让我们先了解 EL 的一些基本概念和语法。

输出表达式

输出表达式用于在页面上显示数据。要使用输出表达式,只需将数据包装在 ${} 中。例如,${user.name} 表达式将显示用户的姓名。

<p>Welcome, ${user.name}!</p>

在这个例子中,${user.name} 的值将替换为用户的姓名,并显示在页面上。

值表达式

值表达式用于获取数据,但不会直接在页面上显示。它通常用于获取数据并将其存储在变量中,以供后续使用。值表达式使用 ${} 语法,如下所示:

<%-- 获取用户姓名并存储在变量中 --%>
<c:set var="userName" value="${user.name}" />

在这个示例中,${user.name} 的值将被存储在名为 userName 的变量中。

操作符

EL 支持多种操作符,用于执行各种操作,例如算术运算、比较运算和逻辑运算。以下是一些常用的 EL 操作符:

  • 算术运算符:+-*/%
  • 比较运算符:==!=<><=>=
  • 逻辑运算符:&&(与)、||(或)、!(非)

例如,您可以使用 == 运算符来比较两个值:

<c:if test="${user.age == 18}">
    You are 18 years old!
</c:if>

在这个示例中,如果用户的年龄等于 18,将显示 “You are 18 years old!”。

集合

EL 允许您访问集合(如列表、映射和数组)中的元素。您可以使用点号 . 和中括号 [] 来访问元素。例如,${items[0]} 将获取列表中的第一个元素。

<ul>
    <c:forEach var="item" items="${items}">
        <li>${item}</li>
    </c:forEach>
</ul>

在这个示例中,使用 <c:forEach> 标签迭代 items 列表中的元素,并将它们显示在无序列表中。

隐式对象

EL 提供了许多隐式对象,您可以在 JSP 页面中直接使用它们。这些隐式对象是预定义的,无需额外配置即可访问。以下是一些常用的 EL 隐式对象:

  • pageContext:表示页面上下文,可用于访问请求、响应和其他页面信息。
  • request:表示 HTTP 请求,可用于获取请求参数和属性。
  • response:表示 HTTP 响应,可用于设置响应属性。
  • session:表示用户会话,可用于在会话中存储和检索数据。
  • application:表示应用程序范围对象,可用于在整个应用程序中共享数据。

转义 HTML

EL 会默认转义输出,以防止跨站点脚本攻击(XSS)。这意味着如果您在 EL 表达式中包含 HTML 特殊字符,它们将被自动转义。例如,<> 将被转义为 &lt;&gt;

如果您需要在页面上显示 HTML 标记,可以使用 ${} 表达式的 fn:escapeXml 函数来取消转义,如下所示:

${fn:escapeXml("<strong>Hello, World!</strong>")}

调用方法

EL 还允许您调用 JavaBean 的方法。要调用方法,只需使用点号 . 语法,并在方法名称后面加上小括号 (),如下所示:

<p>The current date and time is: ${dateUtils.getCurrentDateTime()}</p>

在这个示例中,${dateUtils.getCurrentDateTime()} 将调用名为 getCurrentDateTime 的方法,并显示当前日期和时间。

在 JSP 页面中使用 EL

要在 JSP 页面中使用 EL,只需将 EL 表达式放在 ${} 中,并将它们嵌入到 HTML 或其他文本中。以下是一些示例,展示了如何在 JSP 页面中使用 EL:

<%-- 输出用户的姓名 --%>
<p>Welcome, ${user.name}!</p>

<%-- 获取用户的年龄并进行条件判断 --%>
<c:if test="${user.age == 18}">
    You are 18 years old!
</c:if>

<%-- 循环遍历列表中的元素 --%>
<ul>
    <c:forEach var="item" items="${items}">
        <li>${item}</li>
    </c:forEach>
</ul>

这些示例演示了如何在 JSP 页面中嵌入 EL 表达式,以便显示、比较和遍历数据。

EL 高级用法

除了基本用法之外,EL 还提供了许多高级功能,使其更强大和灵活。以下是一些 EL 的高级用法:

使用条件运算符

EL 支持条件运算符 ? :,允许您根据条件选择不同的值。例如,${user.gender == 'Male' ? 'Mr.' : 'Ms.'} 将根据用户的性别选择称谓。

<p>Hello, ${user.gender == 'Male' ? 'Mr.' : 'Ms.'} ${user.name}!</p>

访问数组和列表元素

EL 允许您访问数组和列表中的元素,并提供强大的功能来处理它们。您可以使用 [index] 来获取特定索引的元素,使用 firstlast 来检查是否是第一个或最后一个元素,以及使用 length 来获取数组或列表的长度。

<%-- 获取第一个和最后一个元素 --%>
<p>First item: ${items[0]}</p>
<p>Last item: ${items[fn:length(items) - 1]}</p>

<%-- 检查是否为空 --%>
<c:if test="${empty items}">
    <p>The list is empty.</p>
</c:if>

使用函数

EL 提供了许多内置函数,可以在 EL表达式中使用。这些函数允许您执行各种操作,从字符串操作到日期格式化,甚至是数学运算。以下是一些常用的 EL 内置函数:

  • fn:length():获取集合的长度。
  • fn:substring():截取字符串的子串。
  • fn:toUpperCase():将字符串转换为大写。
  • fn:toLowerCase():将字符串转换为小写。
  • fn:replace():替换字符串中的文本。
  • fn:split():将字符串拆分为子字符串。

例如,您可以使用 fn:length() 函数来获取列表的长度:

<p>The list has ${fn:length(items)} items.</p>

创建自定义函数

除了内置函数外,您还可以创建自己的自定义函数,以便在 EL 表达式中使用。为此,您需要创建一个 Java 类,并在其中定义您的自定义函数。然后,您可以将该类配置为 JSP 应用程序的一部分,以便在 EL 表达式中访问它。

下面是一个简单的示例,展示了如何创建和使用自定义 EL 函数:

package com.example;

public class StringUtils {
    public static String reverse(String input) {
        StringBuilder result = new StringBuilder();
        for (int i = input.length() - 1; i >= 0; i--) {
            result.append(input.charAt(i));
        }
        return result.toString();
    }
}

在上述示例中,我们创建了一个名为 StringUtils 的 Java 类,其中包含一个名为 reverse 的自定义函数。这个函数用于反转输入的字符串。

要在 JSP 页面中使用这个自定义函数,您需要在 JSP 文件的顶部添加以下配置:

<%@ page language="java" import="com.example.StringUtils" %>

这将导入自定义函数所在的包。接下来,您可以在 EL 表达式中使用自定义函数,如下所示:

<p>Reversed string: ${StringUtils.reverse("Hello, World!")}</p>

在这个示例中,我们调用自定义函数 StringUtils.reverse 来反转字符串,并将结果显示在页面上。

使用 EL 进行表单处理

EL 在处理表单数据时非常有用。您可以使用 EL 来获取用户提交的表单数据,并在 JSP 页面上显示它们。

获取表单参数

要获取用户提交的表单参数,只需使用 ${param} 对象,后跟表单字段的名称。这将返回一个字符串,表示用户在表单字段中输入的值。

<form action="processForm.jsp" method="post">
    <input type="text" name="username" />
    <input type="password" name="password" />
    <input type="submit" value="Submit" />
</form>

<%-- 获取用户提交的用户名和密码 --%>
<p>Username: ${param.username}</p>
<p>Password: ${param.password}</p>

在这个示例中,我们创建了一个简单的登录表单,用户可以在其中输入用户名和密码。使用 ${param.username}${param.password},我们获取用户提交的值,并在页面上显示它们。

提交表单数据

EL 还可用于在表单处理期间将数据传递回服务器。要做到这一点,只需在表单字段的 name 属性中使用相应的属性名称,并使用 EL 表达式将值设置为属性的值。

<%-- 创建一个用户对象 --%>
<jsp:useBean id="user" class="com.example.User" scope="request" />

<form action="processForm.jsp" method="post">
    <input type="text" name="user.username" value="${user.username}" />
    <input type="password" name="user.password" value="${user.password}" />
    <input type="submit" value="Submit" />
</form>

在这个示例中,我们创建了一个名为 user 的用户对象,它具有 usernamepassword 属性。在表单字段的 name 属性中,我们使用 user.usernameuser.password,这将把表单提交的值自动设置为用户对象的属性值。

总结

本博客涵盖了 Java JSP EL 表达语言的基础知识和高级用法。EL 提供了一种简洁和强大的方式来访问和处理数据,以创建动态的 Web 应用程序。无论是显示数据、进行条件判断还是处理表单数据,EL 都是 Java Web 开发中的强大工具。

在您的下一个 Web 项目中,不妨尝试使用 EL,看看它如何简化您的代码并提高可维护性。 EL 的语法简单直观,让您可以更轻松地将数据呈现在页面上。

无论是入门还是精通,EL 都是每个 JSP 开发人员应该熟练掌握的技能。希望这篇博客能够帮助您更好地理解和使用 Java JSP EL 表达语言。祝您编写出优雅而强大的Web应用程序!

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/119603.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React动态生成二维码和毫米(mm)单位转像素(px)单位

一、使用qrcode.react生成二维码&#xff0c;qrcode.react - npm 很简单&#xff0c;安装依赖包&#xff0c;然后引用就行了 npm install qrcode.react或者 yarn add qrcode.react直接上写好的代码 import React, {useEffect, useState} from react; import QRCode from qr…

缓存-Spring Cache 缓存抽象

缓存-Spring Cache 缓存抽象 Spring从版本3.1开始提供非侵入的将Cache集成到Spring应用的方式。Spring Cache提供Cache的统一抽象&#xff0c;支持集成各种不同的缓存解决方案。从4.1版本开始&#xff0c;提供了注解和更多的定制参数。 Spring Cache 抽象提供了对Java方法的缓存…

结合双向LSTM和注意力机制的DQN-CE算法船舶能量调度

Title:Ship Energy Scheduling with DQN-CE Algorithm Combining Bi-directional LSTM and Attention Mechanism 【Applied Energy】结合双向LSTM和注意力机制的DQN-CE算法船舶能量调度(中科院1区Top,IF 11.2) 具体实现方法可以参考原文:论文地址 欢迎大家引用和交流,具体…

C++入门(2)

目录 1. 内联函数1.1概念1.2特性 2. auto关键字2.1 为什么要有auto2.2 auto 简介2.3 auto的使用细则 3.基于范围的for循环(C11)3.1 范围for的语法3.2 范围for的使用条件 4.指针空值nullptr(C11)4.1 C98中的指针空值4.2 用nullptr表示指针空值 1. 内联函数 1.1概念 用inline修饰…

【单链表】无头单项不循环(1)

目录 单链表 主函数test.c test1 test2 test3 test4 头文件&函数声明SList.h 函数实现SList.c 打印SLPrint 创建节点CreateNode 尾插SLPushBack 头插SLPushFront 头删SLPopBck 尾删SLPopFront 易错点 本篇开始链表学习。今天主要是单链表&OJ题目。 单链…

23个优秀开源免费BI仪表盘

BI也称为商业智能&#xff0c;是收集、分析和展示数据以支持决策者做出明智的业务决策的过程。BI帮助组织将其原始的生产数据转化为有意义的见解或者知识&#xff0c;以推动其业务战略。BI能够为组织改善决策、提高效率和提升资源利用率。 BI仪表盘是BI系统的重要组成部分&…

Websocket @ServerEndpoint不能注入@Autowired

在websocket中使用ServerEndpoint无法注入Autowired、Value 问题分析 Spring管理采用单例模式&#xff08;singleton&#xff09;&#xff0c;而 WebSocket 是多对象的&#xff0c;即每个客户端对应后台的一个 WebSocket 对象&#xff0c;也可以理解成 new 了一个 WebSocket&…

安全操作(安卓推流)程序

★ 安全操作项目 项目描述&#xff1a;安全操作项目旨在提高医疗设备的安全性&#xff0c;特别是在医生离开操作屏幕时&#xff0c;以减少非授权人员的误操作风险。为实现这一目标&#xff0c;我们采用多层次的保护措施&#xff0c;包括人脸识别、姿势检测以及二维码识别等技术…

Web逆向-某网络学院学习的”偷懒“思路分析

接到求助&#xff0c;帮朋友完成20课时的网络学习。 我想都没想就接下了&#xff0c;寻思找个接口直接把学习时间提交上去&#xff0c;易如反掌。 最不济最不济&#xff0c;咱还能16x播放&#xff0c;也简单的很 然鹅&#xff0c;当我登陆的时候&#xff0c;发现自己还是太天真…

边缘计算助力低速无人驾驶驶入多场景落地快车道

自动驾驶刮起的风&#xff0c;如今正吹向低速无人驾驶赛道。近期不完全统计显示&#xff0c;当前A股及港股正在排队IPO的自动驾驶相关企业共有12家&#xff0c;其中实现盈利的企业仅两家&#xff0c;而且实现盈利的两家企业最主要的收入并不完全源于自动驾驶领域。 相比之下&am…

mysql数据库的备份和恢复

目录 一、备份和恢复 1、备份&#xff1a; 2、备份的方法&#xff1a; 2.1物理备份&#xff1a; 2.2、逻辑备份 2.3增量备份&#xff1a; 一、备份和恢复 1、备份&#xff1a; 先备份再恢复 备份&#xff1a;完全备份&#xff0c;增量备份 完全备份&#xff1a;将整个…

JAVA中类和对象的认识

1、面向对象的初步认知 1.1 什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面 向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。用面向对象的…

Java的JDBC编程

文章目录 一、数据库编程的必备条件二、Java的数据库编程&#xff1a;JDBC三、JDBC的工作原理四、JDBC的使用4.1 JDBC 开发案例4.2 JDBC 使用步骤总结 五、JDBC常用的接口和类5.1 JDBC API5.2 数据库连接 Connection5.3 Statement 对象5.4 ResultSet 对象 七、内容总结 一、数据…

【调度算法】并行机调度问题遗传算法

问题描述 m台相同的机器&#xff0c;n个工件&#xff0c;每个工件有1道工序&#xff0c;可按照任意的工序为每个工件分配一台机器进行加工 工件ABCDEFGHI工件编号012345678加工时间4765835510到达时间324532186交货期101530241413201810 设备数目&#xff1a;3 目标函数 最…

0X03

红包题第二弹 看到源码里面的提示 ?cmdphpinfo(); 看到源码 kk 关键点就是有两个正则表达式 第一个 preg_match("/[A-Za-oq-z0-9$]/",$cmd) 第二个 preg_match("/\~|\!|\|\#|\%|\^|\&|\*|\(|\)|\&#xff08;|\&#xff09;|\-|\_|\{|\}|\[|\]|\|\&q…

Redis 的缓存击穿,穿透,雪崩及其解决方案

1 缓存穿透 什么是缓存穿透&#xff1f; 大量请求的 key 是不合理的&#xff0c;根本不存在于缓存中&#xff0c;也不存在于数据库中 。导致这些请求直接到了数据库上&#xff0c;根本没有经过缓存这一层&#xff0c;对数据库造成了巨大的压力&#xff0c;可能直接就被这么多…

QT 实现解密m3u8文件

文章目录 概要如何解密M3U8文件呢实现思路和代码序列图网络请求解密 结论 概要 视频文件很多已M3U8文件格式来提供&#xff0c;先复习下什么是M3U8文件&#xff01;用QT的 mutimedia框架来播放视频时&#xff0c;有的视频加载慢&#xff0c;有的视频加载快&#xff0c;为啥&am…

深入了解Jedis:Java操作Redis的常见类型数据存储

目录 前言 一、Jedis介绍 1.Jedis在各方面的功能 2.特点 二、Java连接Redis 1.导入pom依赖 2.建立连接 三、Java操作Redis的常见类型数据存储 1.字符串 2.哈希表 3.列表 4.集合 5.有序集合 四、Redis的实际应用场景实例 1.会议信息实体 2.自定义注解 3.创建切面…

mermaid学习第一天/更改主题颜色和边框颜色/《需求解释流程图》

mermaid 在线官网&#xff1a; https://mermaid-js.github.io/ 在线学习文件&#xff1a; https://mermaid.js.org/syntax/quadrantChart.html 1、今天主要是想做需求解释的流程图&#xff0c;又不想自己画&#xff0c;就用了&#xff0c;框框不能直接进行全局配置&#xff0…

Mac电脑录屏软件 Screen Recorder by Omi 中文最新

Screen Recorder by Omi是一款屏幕录制软件&#xff0c;它可以帮助用户轻松地录制屏幕活动&#xff0c;并将其保存为高质量的视频文件。 该软件提供了多种录制选项&#xff0c;包括全屏录制、选择区域录制和单窗口录制等&#xff0c;同时提供了丰富的设置选项&#xff0c;如视…