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类和集合用于演示:

java 复制代码
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课程类:

java 复制代码
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() 获取会话的唯一标识

html 复制代码
<%@ 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

html 复制代码
<%@ 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相当于取出来的其中一个元素。

演示:

html 复制代码
<%@ 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访问。

相关推荐
m0_74825003几秒前
【STM32】F103ZET6开发板----笔记01
笔记·stm32·嵌入式硬件
huipeng926几秒前
第三章线性表+第四章ArrayList与顺序表
java·开发语言
1101 11013 分钟前
STM32-笔记16-定时器中断点灯
笔记·stm32·单片机
ThetaarSofVenice8 分钟前
带着国标充电器出国怎么办? 适配器模式(Adapter Pattern)
java·适配器模式
酷讯网络_24087016013 分钟前
【全开源】Java多语言tiktok跨境商城TikTok内嵌商城送搭建教程
java·开发语言·开源
旺旺大力包31 分钟前
【 Git 】git 的安装和使用
前端·笔记·git
蓝天星空1 小时前
spring cloud gateway 3
java·spring cloud
罗政1 小时前
PDF书籍《手写调用链监控APM系统-Java版》第9章 插件与链路的结合:Mysql插件实现
java·mysql·pdf
一根稻草君1 小时前
利用poi写一个工具类导出逐级合并的单元格的Excel(通用)
java·excel
kirito学长-Java1 小时前
springboot/ssm网上宠物店系统Java代码编写web宠物用品商城项目
java·spring boot·后端