六、JSP06 使用 EL 和 JSTL 简化 JSP

六、使用 EL 和 JSTL 简化 JSP

6.1 使用 EL 表达式

EL 表达式借鉴了 JavaScript 和 XPath 的表达式语言

EL 表达式提供了一种在 JSP 中简化表达式的方法

EL 表达式通常用于在某个作用域 {page、request、session、application等} 内取得属性值

6.1.1 使用 EL 表达式

  • EL 表达式语法
${表达式}
  • EL 表达式一般操作的是域对象,操作不了局部变量
  • 域对象的概念在 JSP 中存在的有: pageContext、request、session、application
  • 作用范围依次为 本页面、一次请求、一次会话、整个应用程序
  • 使用时通过给域对象设置的 name 值来调用值
  • 如果四个域对象的 name 值都相同时,EL 默认的查找方式是从小到大查找
  • 示例
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>JSP</title>
</head>
<body>
<%--设置数据--%>
<%
    pageContext.setAttribute("uname","pageContext");
    request.setAttribute("uname", "request");
    session.setAttribute("uname", "session");
    application.setAttribute("uname", "application");

//    局部变量
    String str="你好";
%>
局部变量${str}<br>
域变量${uname}
</body>
</html>
  • 输出结果
局部变量
域变量pageContext
  • 因为 EL 表达式操作的是域对象,所以调用局部变量并没有找到值
  • 因此也可以看出,当 EL 表达式操作的值为空时,会返回一个空的字符串,而不是 null

6.1.2 使用 EL 表达式操作对象

  • EL 表达式经常用来访问两类内容: 对象和属性

1、用 点 (.) 操作符

  • 与 Java 语言类似,在 EL 表达式中,也可以用点操作符来访问对象的属性
  • 用 点 (.) 操作符访问对象属性 示例
${对象名.属性}

2、 [] 操作符

  • 与点操作符类似,[] 操作符也可以访问对象的属性
  • 它也可以用来访问一些包含了特殊字符的 如 .- 等的属性名
  • 也可以用来访问数组
  • [] 操作符示例
${对象名[属性]}
${数组[下标]}

3、 EL 表达式的简单用于,操作 Map 集合

  • 将用户信息存储在 Map 中,并通过 EL 表达式输出
  • 代码示例
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>JSP</title>
</head>
<body>
<%--设置数据--%>
<%
    Map<String, String> map=new HashMap<String, String>();
    map.put("name","巧克力");
    map.put("hobby","胡思乱想");
    request.setAttribute("user",map);
%>
用户名:${user.name}<br>
用户爱好:${user.hobby}<br>
</body>
</html>
  • 输出结果

image-20230604132354909

6.1.3 Empty 运算符

  • Empty 运算符是一个前缀操作符,用于检测一个变量是否为空
  • 如引用为 null,字符串或集合的长度为 0 等,结果都会返回为 true
  • 如果不为空则返回 false
  • 代码示例
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>JSP</title>
</head>
<body>
<%--设置数据--%>
<%
  String str=null;
  String str1="";
  Map map=null;
  Map map1=new HashMap();
  Map map2=new HashMap();
  map2.put("str","123");
 request.setAttribute("str",str);
 request.setAttribute("str1",str1);
 request.setAttribute("map",map);
 request.setAttribute("map1",map1);
 request.setAttribute("map2",map2);

%>
空字符串:${empty str}<br>
值为空格的字符串:${empty str1}<br>
空 map:${empty map}<br>
长度为0的 map:${empty map1}<br>
有值的 map:${empty map2}<br>
</body>
</html>
  • 运行结果

image-20230604133317344

6.1.4 EL 表达式的隐式对象

  • EL 表达式提供了若干隐式对象,以便 JSP 的开发
  • EL 表达式的隐式对象按照使用途径的不同分为 作用域访问对象、参数访问对象、JSP 隐式对象、首部访问对象和初始化参数访问对象
  • EL 表达式的隐式对象

image-20230604135233081

1、作用域访问对象

  • 在 Java Web 中存储变量时,共有 page、request、session、application 四个作用域选项
  • 但是如果四个作用域内存储的值的 name 都相同时,可以使用作用域对象,指定在某个作用域查找的值
  • 将作用域内的所有属性转为 Map 类,通过 key 值来调用
  • EL 表达式提供了四个作用域访问对象
对象名称说明
pageScope与 page 作用域中的属性相关联的 Map 类
requestScope与 request 作用域中的属性相关联的 Map 类
sessionScope与 session 作用域中的属性相关联的 Map 类
applicationScope与 application 作用域中的属性相关联的 Map 类
  • 当使用 EL 表达式访问某个变量时,应该指定查找范围,如 ${rquestScope.pageObje}
  • 代码示例
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>JSP</title>
</head>
<body>
<%--设置数据--%>
<%
    pageContext.setAttribute("uname","pageContext");
    request.setAttribute("uname", "request");
    session.setAttribute("uname", "session");
    application.setAttribute("uname", "application");
%>
PageContext作用域:${pageScope.uname}<br>
requset作用域:${requestScope.uname}<br>
session作用域:${sessionScope.uname}<br>
application作用域:${applicationScope.uname}<br>

</body>
</html>
  • 输出结果

image-20230604140604914

6.2 JSTL

对于实现逻辑控制、循环遍历等功能的 Java 脚本,需要使用 JSTL 标签来替代

6.2.1 初识 JSTL

  • JSTL 全称为 Java Server Pages Standard Tag Library即 JSP 标准标签库
  • 包含了一组在开发 JSP 时常见功能的标准标签
  • 这些标签提供了一种不用嵌入 Java 代码就可以实现 JSP 页面逻辑的途径
  • 以下主要是 JSTL 的核心标签库
  • 核心标签库又分为:通用标签库、条件标签库、迭代标签库等

image-20230605083707055

6.2.2 引入 JSTL

项目开发使用 JSTL 需要执行以下两个步骤的准备工作

1、在项目中引入 JSTL 的包

  • 在 maven 仓库中下载
  • 可将以下代码直接复制到 maven 中下载
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl-api</artifactId>
    <version>1.2</version>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
        </exclusion>
        <exclusion>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jstl-impl</artifactId>
    <version>1.2</version>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
        </exclusion>
        <exclusion>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
        </exclusion>
        <exclusion>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.2</version>
</dependency>

image-20230605084650068

2、在 JSP 中使用 taglib 指令导入标签库

  • 需要使用核心标签库,还需要在 JSP 中添加 taglib 指令
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  • taglib 指令通过 uri 属性引用某个标签库的配置文件
  • JSP 中可以通过 prefix 属性指定的前缀访问该标签库中的某个标签功能
  • 访问标签语法
<c:标签名>

6.2.3 通用标签库

  • 通用标签库包含 <c:out> <c:set> <c:remove> 三个标签
  • 主要用于在 JSP 内显示、设置和删除变量

1、<c:out> 标签

  • <c:out> 标签用于输出表达式的结果,类似于 JSP 中的表达式 <%=%>
  • 语法格式如下
<c:out value="<String>" default="<String>" escapeXml="<true|false>"/>
  • <c:out> 标签属性说明
属性说明是否必须
value需要输出的表达式的运算结果,可以通过 EL 表达式获取
defaultvalue 属性的值为空时输出的默认值
escapeXml表示是否转换特殊字符,用于指定在 <c:out> 标签输出在 HTML 和 XML 中具有
特殊意义的字符 如(<>& 等)时是否应该进行转义

2、<c:set> 标签

  • 用于设置作用域变量的值或作用域变量的属性值
  • 语法格式如下
<c:set
   var="<String>"
   value="<String>"
   target="<String>"
   property="<String>"
   scope="<string>"/>
  • <c:set> 标签的属性说明
属性说明是否必须
var设置的变量名
value要存储的值
scope变量的作用域,可选值有 page、request、session 和 application。
默认为 page
target要设置的 JavaBean 对象或 Map 对象,可以使用 EL 表达式表示
property在 JavaBean 对象或 Map对象的情况下要设置的对象的属性或 key
  • 如果指定了 target 属性,则 property 属性也需要被指定
  • 使用 target 属性给对象赋值时,对象的方法中必须包含一个 setter() 方法
  • 代码演示

用户实体类 User

package com.example.demo;

public class Uset {
    private String userName;
    private String userPwd;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPwd() {
        return userPwd;
    }

    public void setUserPwd(String userPwd) {
        this.userPwd = userPwd;
    }
}

JSP 代码

<%@ page import="com.example.demo.User" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %><%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2023/6/5
  Time: 9:25
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <title>JSTL 通用标签</title>
</head>
<%
    Map map=new HashMap();
    User user=new User();
    request.setAttribute("user", user);
    request.setAttribute("map", map);
%>
<%--将 value 值存储在 session 中--%>
<c:set var="userName" value="session张三" scope="session"/>
<c:out value="${sessionScope.userName}"/> <br>
<%--将 value 值设置到 User 对象的 userName属性--%>
<c:set  value="User李四" target="${user}" property="userName"/>
<c:out value="${user.userName}"/>  <br>
<%--将 value 值设置到 Map 集合中--%>
<c:set value="map王五" target="${map}" property="userName"/>
<c:out value="${map.get('userName')}"/>  <br>
</body>
</html>

  • 运行结果

image-20230605093911807

3、 c:remove 标签

  • <c:set> 标签的作用相反,<c:remove> 标签用于移除指定作用域内的指定变量
  • 语法格式如下
<c:remove var="<String>" scope="<String>"/>
  • <c:remove> 标签的属性说明
属性说明是否必须
var待移除的变量的名称
scope待移除变量所在的作用域
可选项有 page、request、session、application
如果没有指定,则默认为page

6.2.4 条件标签库

JSTL 的条件标签库包括 <c:if>标签、<c:choose> 标签、<c:when>标签和<c:otherwise>标签

1、<c:if> 标签

  • <c:if> 标签用于实现 if 语句的功能
  • 语法格式如下
<c:if test="condition" var="varName" scope="scope"/>
	主体内容
</c:if>
  • <c:if> 标签的属性说明
属性说明是否必须
test该属性是判断条件,可以用 EL 表达式表示,当条件结果
为 true 时,会执行主体内容,如果为 false 则不会执行
var定义变量,该变量存放条件表达式的执行结果
scopevar 属性定义的变量的存储范围,可选值
有 page,request,session 和 appliaction

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

  • <c:choose> 标签和 <c:when> 标签、<c:otherwise> 标签配合实现互斥条件的执行
  • 类似于 Java 语言的 if-else 语句
  • 语法格式如下
 <c:choose>
   <c:when test="condition1">
     主体内容
   </c:when>
   <c:when test="condition2">
     主体内容
   </c:when>
   <c:otherwise>
     主体内容
   </c:otherwise>
 </c:choose> 
  • <c:choose> 标签是作为 <c:when><c:otherwise> 的父标签使用的,除空白字符外,<c:choose> 的标签体只能包含这两个标签
  • <c:when> 标签必须有一个直接的父标签 <c:choose>
  • 在同一个父标签<c:choose> 下,<c:otherwise>标签必须出现在 <c:when> 标签之后,而且<c:otherwise> 标签必须出现在<c:choose>标签的最后一个

6.2.5 迭代标签库

JSTL 中通过 <c:forEach> 标签,能够很方便地实现迭代操作

<c:forEach> 标签有两种语法格式:一种用于遍历集合对象的成员,另一种是常规循环,使语句循环执行指定的次数

1、遍历集合 语法

<c:forEach itemas="collectionName" var="varName" varSatus="varStatusName"
           begin="beginIndex" end="endIndex" step="step">
 	主体内容   
 </c:>
  • 遍历集合 属性说明
    | 属性 | 说明 |
    | --------- | ------------------------------------------------------------ |
    | items | 被迭代的集合对象,可通过 EL 表达式获取 |
    | var | 当前成员的引用,即如果当前循环到第一个成员,var 就引用第一个成员
    如果当循环到第二个成员,它就引用第二个成员,以此类推 |
    | varStatus | 用于存放 var 属性引用的成员的相关信息,如索引等 |
    | begin | 表示开始位置,默认为 0 ,可省略 |
    | end | 表示结束为止,可省略 |
    | step | 表示循环的步长,默认为1,可省略 |

2、常规循环 语法

<c:forEach  var="varName" varSatus="varStatusName"
           begin="beginIndex" end="endIndex" step="step">
 	主体内容   
 </c:>
  • 常规循环 属性说明
属性说明
var对当前成员的引用,就是循环的下标
varStatus用于存放 var 属性引用的成员的相关信息,如索引等
begin表示开始位置,默认为 0 ,可省略
end表示结束为止,可省略
step表示循环的步长,默认为1,可省略

2、常规循环 语法

<c:forEach  var="varName" varSatus="varStatusName"
           begin="beginIndex" end="endIndex" step="step">
 	主体内容   
 </c:>
  • 常规循环 属性说明
属性说明
var对当前成员的引用,就是循环的下标
varStatus用于存放 var 属性引用的成员的相关信息,如索引等
begin表示开始位置,默认为 0 ,可省略
end表示结束为止,可省略
step表示循环的步长,默认为1,可省略
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是javaweb实验ELJSTL的相关内容: EL(Expression Language)和JSTLJSP Standard Tag Library)都是JSP中用于简化开发的标准规范。EL主要用于访问和操作JSP页面上的变量,而JSTL则提供了一些标签库,包括流程控制标签、条件判断标签、循环标签、格式化标签等,可以方便地在JSP页面中实现数据渲染和逻辑控制。 在实验中,我们需要实现一个简单的图书管理系统,可以添加、删除、修改和查询图书信息。下面是该实验中使用ELJSTL的相关内容: 1. EL表达式 EL表达式的语法格式为${expression},其中expression可以是变量、运算符、函数或者属性等。在JSP页面中,我们可以通过EL表达式快速访问和操作页面上的变量,例如: ``` ${requestScope.name} //访问request作用域中的name变量 ${param.username} //访问请求参数中的username变量 ${sessionScope.user} //访问session作用域中的user变量 ``` 2. JSTL标签JSTL标签库的使用需要先导入对应的标签库文件,例如: ``` <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> ``` 其中,c标签库包含了流程控制标签、条件判断标签和循环标签等,例如: ``` <c:if test="${empty books}"> <p>暂无数据</p> </c:if> <c:forEach items="${books}" var="book"> <tr> <td>${book.id}</td> <td>${book.name}</td> <td>${book.author}</td> <td>${book.price}</td> <td> <a href="edit.jsp?id=${book.id}">编辑</a> <a href="delete.jsp?id=${book.id}">删除</a> </td> </tr> </c:forEach> ``` fmt标签库则提供了格式化标签,例如: ``` <fmt:formatNumber value="${book.price}" type="currency" /> ``` 以上就是实验ELJSTL的相关内容,希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值