JavaWeb笔记整理+图解——服务器渲染技术之EL表达式与JSTL

上一篇我们讲解了什么是服务器渲染技术和jsp,今天我来整理一下EL表达式和JSTL的笔记与图解,让我们的jsp页面更加的简洁与可维护。

没看过上一期的小伙伴可以看上一期的笔记:

JavaWeb笔记全整理——JSP服务器渲染技术-CSDN博客

一、EL表达式

1、EL表达式快速入门

EL表达式(Expression language),是种表达式语言。它是为了代替jsp中的<%=%>表达式脚本而出现的。

它使用 ${表达式} 来表示一个参数,或表达式。

jsp的表达式
EL表达式

看起来这两个式子区别并不大呀,为什么EL表达式可以取代jsp的表达式脚本呢? 

别急,后面你就知道它的大用处。

现在我们设置一个参数:

显示结果:

可以看到,我们如果想要在jsp页面上打印出来这个值,那么我们就需要调用request.getAttribute方法,这样的代码是有些繁琐的。

现在我们改用EL表达式:

显示结果:

 可以看到,两个表达式的显示是一模一样的,但是EL表达式显然更简洁一些。因为在EL表达式中可以识别到request中设置的参数——key,所以我们直接在EL表达式中填入key即可,而不需要再调用request.getAttribute()方法,所以代码就简单了许多。

 还有一点,如果jsp表达式脚本中获取的Attribute值不存在,那么会输出null字符串,而EL表达式则不会输出任何东西(即输出一个 “” 空字符串):

EL表达式输出类信息和集合信息

下面我演示EL表达式的其他输出方式。首先定义Student类和集合用于演示:

import java.util.List;public class Student {private String name;private int age;private List<Course> courses;public Student(String name, int age, List<Course> courses) {this.name = name;this.age = age;this.courses = courses;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public List<Course> getCourses() {return courses;}public void setCourses(List<Course> courses) {this.courses = courses;}
}

Course课程类:

public class Course {private String title;private String instructor;public Course(String title, String instructor) {this.title = title;this.instructor = instructor;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getInstructor() {return instructor;}public void setInstructor(String instructor) {this.instructor = instructor;}
}

我们在jsp页面中创建一些对象,一边后续的输出:

 这里如果我们没有设置Attribute的值,而是想使用EL表达式直接输出,那么是不可行的:

结果: 

并没有显示Student的信息,所以我们需要调用setAttribute方法先设置一下,才能使用EL表达式来输出:

输出结果:

 我们也可以将属性一个一个的输出:

显示结果:

2、EL运算操作 

EL表达式中还可以填入运算式子,运算符和Java一致:

EL表达式的empty运算

EL表达式使用empty运算来判断一个值是否为空或0值,以下情况都会返回true

3、EL表达式的隐含对象

我们可以通过以下四个对象来获取jsp页面的域对象的值:

演示一下:注意要写一个字符串 

而pageScope中有许多方法,列在下面有个印象即可:

通过 request 对象来获取和 HTTP 协议相关的数据

request.getScheme() 它可以获取请求的协议

request.getServerName() 获取请求的服务器 ip 或域名

request.getServerPort() 获取请求的服务器端口号

getContextPath() 获取当前工程路径

request.getMethod() 获取请求的方式(GET 或 POST)

request.getRemoteHost() 获取客户端的 ip 地址

session.getId() 获取会话的唯一标识

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>pageContext 对象的使用</title>
</head>
<body>
<h1>pageContext 对象的使用</h1>
<%--
//通过 request 对象来获取和 HTTP 协议相关的数据
request.getScheme() 它可以获取请求的协议
request.getServerName() 获取请求的服务器 ip 或域名
request.getServerPort() 获取请求的服务器端口号
getContextPath() 获取当前工程路径
request.getMethod() 获取请求的方式(GET 或 POST)
request.getRemoteHost() 获取客户端的 ip 地址
session.getId() 获取会话的唯一标识
--%>
<hr/>
协议: ${ 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>
<h1>使用 jsp 表达式脚本获取如上信息</h1>
ip 地址: <%=request.getRemoteHost() %> <br>
<h1>使用 el 表达式形式获取信息</h1>
<%
pageContext.setAttribute("req", request);
%>
ip 地址: ${req.remoteHost} <br>
获取请求方法: ${req.method} <br>
</body>
</html>

二、JSTL

1、JSTL快速入门

EL表达式是为了替换jsp中的表达式脚本,那么JSTL就是为了替换掉jsp中的代码脚本

JSTL由五个标签库组成:

为了使用jstl我们还需要导入jstl的jar包。

快速入门演示

网页输出:

导入 jstl jar 包后,要重新发布 web 工程,否则不识别!!!会出现500错误代码。

2、jstl核心库

<c:set />标签

这个标签可以设置一些数据相当于setAttribute(key,value);

scope 属性设置保存到哪个域
page 表示 PageContext 域(默认值)
request 表示 Request 域
session 表示 Session 域
application 表示 ServletContext 域

var 属性设置 key 是什么

value 属性设置值

演示一下:

用EL表达式看看是否设置成功:

设置成功:

 

如果想要设置一个数字作为value而不是字符串,那么需要填入一个EL表达式。

<c:if />标签

if 标签用来做 if 判断。

test 属性表示判断的条件(用 EL表达式)

演示 快速入门演示过了:

<c:choose> <c:when> <c:otherwise>标签

多路判断标签,相当于Java中的Switch case

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>jstl</title>
</head>
<body>
<h3>jstl演示</h3><%--这里注意,如果想要将value设置为一个数字,则需要使用EL表达式,不能直接使用字符串--%>
<c:set scope="request" var="key" value="${10001}"/><c:choose><c:when test="${requestScope.key > 10000}">工资过万</c:when><c:when test="${requestScope.key > 20000}">工资过两万</c:when><c:otherwise><c:choose><c:when test="${requestScope.key > 30000}">工资过三万</c:when></c:choose></c:otherwise>
</c:choose></body>
</html>

结果:

这里的<c:choose> 相当于Switch语句

<c:when>相当于case 语句 

<c:otherwise>相当于default

<c:foreach>标签

用于遍历输出 i 到 j 、遍历一个数组、遍历一个集合:

<c:forEach items="${ requestScope.sports }" var="item"/>
这里的items相当于Java中的增强for循环中需要遍历取出的集合,而var相当于取出来的其中一个元素。

演示:

<%@ page import="java.util.HashMap" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>jstl</title>
</head>
<body>
<h3>jstl演示</h3><%HashMap<String, String> map = new HashMap<>();map.put("红楼梦", "曹雪芹");map.put("西游记", "吴承恩");map.put("水浒传", "施耐庵");map.put("三国演义", "罗贯中");request.setAttribute("books",map);
%>
<c:forEach items="${books}" var="book">${book.key} - ${book.value} <br/>
</c:forEach></body>
</html>

演示结果:

这里有几点需要注意:

在使用foreach标签来遍历的时候,需要先把map放入request中,即,先调用request的setAttribute方法,从而让EL表达式识别,然后再用foreach访问。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git 小白入门到进阶—(基本概念和常用命令)

一.了解 Git 基本概念和常用命令的作用 (理论) 基本概念 1、工作区 包含.git文件夹的目录&#xff0c;主要用存放开发的代码2、仓库 分为本地仓库和远程仓库&#xff0c;本地仓库是自己电脑上的git仓库(.git文件夹);远程仓库是在远程服务器上的git仓库git文件夹无需我们进行操…

Minio实现大文件切片上传

在进行视频、压缩包等大文件上传时&#xff0c;我们有时会遇到上传速度过慢、上传到一半失败等问题。这时我们可以将一个大文件切成若干个小文件依次上传&#xff0c;这样不仅可以看到上传进度&#xff0c;当上传到一半失败时也可以继承上一次的上传进度&#xff0c;而避免了每…

【Unity】 HTFramework框架(四十九)新建脚本时,自动向脚本添加【引用命名空间】

更新日期&#xff1a;2024年5月28日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 自动向脚本添加【引用命名空间】1.新建一个编辑器脚本2.静态构造方法3.标记 InitializeOnLoad4.添加【默认引用命名空间】的规则5.再次新建脚本 自动向脚…

MaxKB,基于 LLM 大语言模型的知识库问答系统,开箱即用,支持快速嵌入到第三方业务系统。

MaxKB 是一款基于 LLM 大语言模型的知识库问答系统。MaxKB Max Knowledge Base&#xff0c;旨在成为企业的最强大脑。开箱即用&#xff0c;支持快速嵌入到第三方业务系统。 项目链接 github.com/1Panel-dev/MaxKB 项目介绍 MaxKB 是一款基于 LLM 大语言模型的知识库问答系统…

opencv学习备份

2019年3月9日 指针地址向后走 int a[5] {1,100,200,300} int *pa –>*p1 –>*p100 指针移动 –> p0x00000000 内存地址 int a1 int *p&a 指针赋值常量&#xff0c;需要加寻址符号 –>*p1 –>*p CV_8UC1&#xff0c;CV_8UC2&#xff0c;CV_8UC3。 (最后的…

Sping源码(九)—— Bean的初始化(非懒加载)— EmbeddedValueResolver

序言 上一篇文章介绍了ConversionService,顺着finishBeanFactoryInitialization主流程继续往下走&#xff0c;这篇文章介绍EmbeddedValueResolver。 源码 源码中关于EmbeddedValueResolver有说到&#xff0c;如果没有BeanPostProcessor则创建一个默认的内嵌的值解析器。那我…

【C++】d1

关键字&#xff1a; 运行、前缀、输入输出、换行 运行f10 前缀必须项&#xff1a; #include <iostream> using namespace std; 输入/输出&#xff1a; cin >> 输入 cout << 输出 语句通过>>或<<分开 换行 endl或者"\n"

了解CSS中的link和@import引入CSS的区别

CSS中的link和import引入CSS的主要区别如下: 1&#xff1a;引入方式: link是HTML标签,用于在HTML文档中引入外部资源,如CSS文件。import是CSS语法,用于在CSS文件中引入其他CSS文件。2&#xff1a;加载顺序: link引入的CSS文件会与HTML文档并行加载,不会阻塞HTML文档的解析。im…

VMware报平台不支持虚拟化Win10家庭版关闭Hyper-V及内核隔离

1.BIOS中开启虚拟化功能 2.启动或关闭程序中找不到Hyper-v 停止 hypervisorlaunchtype&#xff08;Windows Hyper-V 启动加载器&#xff09; 以管理员的身份打开命令行窗口&#xff0c;运行如下命令&#xff0c;关闭停止 Windows Hyper-V 启动加载器 开启 Windows Hyper-V 启…

防火墙基础技术篇:ensp配置防火墙ssh方式登录

防火墙基础技术篇&#xff1a;ensp配置防火墙ssh方式登录 一、SSH 是什么 历史上&#xff0c;网络主机之间的通信是不加密的&#xff0c;属于明文通信。这使得通信很不安全&#xff0c;一个典型的例子就是服务器登录。登录远程服务器的时候&#xff0c;需要将用户输入的密码传…

TECHNIUM INTERNATIONAL: 利用 AI 和 TECHNIUM 矩阵协议引领区块链创新

在充满活力的加密货币和区块链技术领域&#xff0c;Technium International 以领军者的姿态迅速崛起&#xff0c;跻身科技巨头的顶尖行列。Technium International 成立于 2018 年&#xff0c;总部设于塞席尔&#xff0c;透过人工智慧&#xff08;AI&#xff09;和区块链技术的…

智能跳绳的产品体验与思考(一)

我&#xff0c;虽称不上跳绳高手&#xff0c;却对这项运动怀有深厚的热爱&#xff0c;也曾在某电商平台上选购过一款智能跳绳&#xff0c;希望能借此提升我的跳绳技巧。今天&#xff0c;咱们就来聊聊我和这条绳子的发生的一些故事&#xff0c;外加我的一些思考。 此刻&#xf…

揭秘python模块导入的“隐身术”:如何控制模块代码的执行?

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;两个下划线的奥秘 二、案例展示&#xff1a;模块导入与代码执行 1. 导…

win11中文文件名称乱码解决方案

解压后出现以下的乱码 解决方案 步骤1.winR 输入intl.cpl 或 windows 自带的搜索搜“intl.cpl”&#xff0c;打开这个面板控制项 步骤2.在新打开的区域面板中&#xff0c;选择“管理”标签页&#xff0c;点击下方的“更改系统区域设置”按钮 步骤3.取消"Beta版…"选…

4步成功将三方库——speexdsp移植到OpenHarmony

四步实现三方库移植&#xff1a; 1、在Linux下编译要移植的三仓库&#xff0c;分析编译过程&#xff1b; 2、将要移植的三方库加入编译框架中以及产品引用&#xff1b; 3、增量编译出动态链接库和可执行文件推送到开发板上&#xff1b; 4、在开发板上验证移植是否成功、API接口…

greendao实现增删改查

说明&#xff1a;最近碰到一个需求&#xff0c;在安卓上使用greendao框架&#xff0c;实现增删改查数据 效果图&#xff1a; step1: // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript {repositories {go…

Kubernetes——监听机制与调度约束

目录 前言 一、监听机制 1.Pod启动创建过程 2.调度过程 1.指定调度节点 1.1强制匹配 1.2强制约束 二、硬策略和软策略 1.键值运算关系 1.硬策略——requiredDuringSchedulingIgnoredDuringExecution 2.软策略——preferredDuringSchedulingIgnoredDuringExecution …

QTreeWidget 详解

QTreeWidget 详解 QTreeWidget 是 PyQt5 框架中的一个重要部件&#xff0c;它提供了树形结构的视图&#xff0c;可以用于显示层级数据。以下是 QTreeWidget 的详细讲解&#xff0c;包括基本用法、主要方法和属性以及如何与其他组件进行交互。 基本用法 导入模块 要使用 QTree…

UE4编辑器End键Actor贴近地面

void UXXXEditorFunctionLibrary::SnapToFloor(AActor* Actor) { if (Actor) { Actor->Modify(); GEditor->SnapObjectTo(FActorOrComponent(Actor), false, false, false, false); Actor->InvalidateLightingCache(); Actor->UpdateComponentTransforms(); } }

SAP_MM_物料主数据

在SAP的物料管理模块&#xff08;MM&#xff0c;Materials Management&#xff09;中&#xff0c;主数据&#xff08;Master Data&#xff09;是系统中管理物料相关信息的核心。主数据在整个物料管理的生命周期中起到了至关重要的作用&#xff0c;从采购到库存管理&#xff0c;…