16、JavaEE核心技术-EL与 JSTL

embedded/2025/3/19 2:52:28/

EL与 JSTL 实践


一. EL(Expression Language)

EL(表达式语言)是 JSP 2.0 中引入的一种简单的脚本语言,用于在 JSP 页面中简化数据的访问和显示。它通过一种类似于 JavaScript 的语法,允许开发者在 JSP 页面中直接访问 JavaBean 的属性、集合、甚至是 Java 类的静态字段和方法。


1、 EL 的基本语法

EL 表达式的语法格式为 ${},例如:

${requestScope.userName}  
2、 EL 的变量

EL 变量是自动创建的,您无需显式声明。以下是一些常见的变量:

  1. 隐式变量

    • pageScope:当前页面的作用域。
    • requestScope:请求作用域。
    • sessionScope:会话作用域。
    • applicationScope:应用作用域。
  2. 用户定义变量
    使用 JSTL 的 <c:set> 标签可以自定义变量,例如:

    <c:set var="title" value="EL 示例" scope="page"/>  
    ${title}  
    

3、EL 的操作符

EL 支持多种操作符,包括:

  • 算术操作符+, -, *, /, %, div, mul
  • 比较操作符==, eq, !=, neq, >, gt, <, lt
  • 逻辑操作符&&, and, ||, or, not, !
  • 空检查操作符empty(检查对象是否为空)。

示例

${10 + 5}  <!-- 算术操作 -->  
${user.age > 18}  <!-- 比较操作 -->  
${!empty user.name}  <!-- 空检查 -->  

4、EL 的使用场景
  1. 访问 JavaBean 的属性

    <jsp:useBean id="user" class="com.example.User" scope="request"/>  
    用户名称:${user.name}  
    
  2. 遍历集合

    <c:forEach items="${users}" var="user">  ${user.name}  
    </c:forEach>  
    
  3. 条件判断

    <c:if test="${user.age > 18}">  成人用户  
    </c:if>  
    
  4. 格式化输出

    <fmt:formatDate value="${user.birthday}" pattern="yyyy-MM-dd"/>  
    

二. JSTL(JavaServer Pages Standard Tag Library)

JSTL 是 Java 社区为了简化 JSP 页面开发而推出的一组标准标签库。它提供了多种功能标签,涵盖了常见的 Web 开发需求。


1、 JSTL 的核心标签库

JSTL 分为四个主要模块:

  1. 核心标签库:用于流程控制、集合操作、数据处理等。
  2. 格式化标签库:用于日期、时间、数字等格式化。
  3. 数据库标签库:用于简化 JDBC 操作。
  4. XML 标签库:用于 XML 数据的处理。
核心标签库(core)

以下是核心标签库中常用的标签:

  1. <c:out>
    用于输出数据,支持 HTML 转义。

    <c:out value="${user.name}" default="未知"/>  
    
  2. <c:forEach>
    用于遍历集合或数组。

    <c:forEach items="${users}" var="user" varStatus="status">  ${status.index}: ${user.name}  
    </c:forEach>  
    
  3. <c:forTokens>
    用于遍历字符串标记。

    <c:forTokens items="a,b,c" delims=",">  ${token}  
    </c:forTokens>  
    
  4. <c:if>
    用于条件判断。

    <c:if test="${user.age > 18}">  成人用户  
    </c:if>  
    
  5. <c:choose>
    用于多分支条件判断。

    <c:choose>  <c:when test="${user.age > 18}">成人用户</c:when>  <c:otherwise>未成年用户</c:otherwise>  
    </c:choose>  
    
  6. <c:set>
    用于设置变量。

    <c:set var="title" value="JSTL 示例" scope="page"/>  
    ${title}  
    
  7. <c:remove>
    用于删除变量。

    <c:remove var="title" scope="page"/>  
    
  8. <c:import>
    用于导入其他资源(如 HTML 文件、JSP 页面)。

    <c:import url="http://example.com/header.html"/>  
    
  9. <c:param>
    用于在导入资源时传递参数。

    <c:import url="detail.jsp">  <c:param name="id" value="123"/>  
    </c:import>  
    
  10. <c:redirect>
    用于页面跳转。

    <c:redirect url="/login.jsp"/>  
    

格式化标签库(fmt)
  1. fmt:setLocale
    设置Locale。

    <fmt:setLocale value="zh_CN"/>  
    
  2. fmt:bundle
    加载资源文件。

    <fmt:bundle basename="messages">  <fmt:message key="welcome.message"/>  
    </fmt:bundle>  
    
  3. fmt:formatDate
    格式化日期。

    <fmt:formatDate value="${user.birthday}" pattern="yyyy-MM-dd"/>  
    
  4. fmt:formatNumber
    格式化数字。

    <fmt:formatNumber value="12345.678" pattern="#,###.##"/>  
    

数据库标签库(sql)
  1. sql:setDataSource
    设置数据源。

    <sql:setDataSource var="dataSource"   driver="com.mysql.cj.jdbc.Driver"   url="jdbc:mysql://localhost:3306/testdb"  user="root"   password="password"/>  
    
  2. sql:query
    执行查询。

    <sql:query dataSource="${dataSource}" sql="SELECT * FROM users">  ${users}  
    </sql:query>  
    
  3. sql:update
    执行更新(插入、删除、修改)。

    <sql:update dataSource="${dataSource}" sql="INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com')"/>  
    

2、 JSTL 的使用场景
  1. 简化流程控制

    <c:forEach items="${users}" var="user">  <p>用户 ${user.name}</p>  
    </c:forEach>  
    
  2. 格式化数据

    <fmt:formatDate value="${user.birthday}" pattern="yyyy-MM-dd"/>  
    
  3. 数据库操作

    <sql:query var="users" sql="SELECT * FROM users">  <c:forEach items="${users.rows}" var="user">  ${user.name}  </c:forEach>  
    </sql:query>  
    
  4. 国际化

    <fmt:setLocale value="${param.locale}"/>  
    <fmt:bundle basename="messages">  <h1><fmt:message key="welcome.message"/></h1>  
    </fmt:bundle>  
    

三. 实践:数据显示与分页

以下是一个完整的实践示例,展示如何使用 EL 和 JSTL 实现数据显示与分页功能。


1、 准备工作
  1. 创建数据库表

    CREATE TABLE users (  id INT AUTO_INCREMENT PRIMARY KEY,  name VARCHAR(50),  email VARCHAR(100)  
    );  
    
  2. 添加测试数据

    INSERT INTO users (name, email) VALUES  ('John Doe', 'john@example.com'),  ('Jane Smith', 'jane@example.com'),  ('Bob Johnson', 'bob@example.com');  
    
  3. 添加依赖
    pom.xml 中添加 JSTL 和 MySQL Connector/J 的依赖:

    <dependency>  <groupId>jstl</groupId>  <artifactId>jstl</artifactId>  <version>1.2</version>  
    </dependency>  
    <dependency>  <groupId>mysql</groupId>  <artifactId>mysql-connector-java</artifactId>  <version>8.0.33</version>  
    </dependency>  
    

2、 JSP 页面实现

以下是一个完整的 JSP 页面示例,展示数据显示和分页功能。

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8" import="java.util.*" %>  
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>  
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>  <html>  
<head>  <title>用户管理 - 数据显示与分页</title>  
</head>  
<body>  <h1>用户管理系统</h1>  <%  // 定义每页显示的记录数  int pageSize = 5;  // 获取当前页码(默认为第 1 页)  int currentPage = 1;  if (request.getParameter("currentPage") != null) {  currentPage = Integer.parseInt(request.getParameter("currentPage"));  }  // 总记录数  int totalRecords = 0;  // 计算总记录数  try {  Class.forName("com.mysql.cj.jdbc.Driver");  Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb", "root", "password");  Statement stmt = conn.createStatement();  ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM users");  if (rs.next()) {  totalRecords = rs.getInt(1);  }  rs.close();  stmt.close();  conn.close();  } catch (SQLException e) {  e.printStackTrace();  }  %>  <c:set var="pageSize" value="<%=pageSize%>"/>  <c:set var="currentPage" value="<%=currentPage%>"/>  <c:set var="totalRecords" value="<%=totalRecords%>"/>  <c:if test="${totalRecords > 0}">  <sql:setDataSource var="dataSource"  driver="com.mysql.cj.jdbc.Driver"  url="jdbc:mysql://localhost:3306/testdb"  user="root"  password="password"/>  <sql:query dataSource="${dataSource}" sql="SELECT * FROM users LIMIT ${currentPage-1}, ${pageSize}" var="users"/>  <div>  <h2>用户列表(第 ${currentPage} 页 / 共 ${totalRecords} 条记录)</h2>  <table border="1">  <tr>  <th>序号</th>  <th>用户姓名</th>  <th>用户邮箱</th>  </tr>  <c:forEach items="${users.rows}" var="user" varStatus="status">  <tr>  <td>${status.index + 1}</td>  <td>${user.name}</td>  <td>${user.email}</td>  </tr>  </c:forEach>  </table>  </div>  <!-- 分页导航 -->  <div style="margin-top: 20px;">  <c:if test="${currentPage > 1}">  <a href="?currentPage=${currentPage-1}">上一页</a>  </c:if>  <c:forEach begin="1" end="${totalRecords / pageSize + 1}" var="page">  <c:choose>  <c:when test="${page == currentPage}">  <span style="color: red;">${page}</span>  </c:when>  <c:otherwise>  <a href="?currentPage=${page}">${page}</a>  </c:otherwise>  </c:choose>  </c:forEach>  <c:if test="${currentPage < totalRecords / pageSize + 1}">  <a href="?currentPage=${currentPage+1}">下一页</a>  </c:if>  </div>  </c:if>  </body>  
</html>  

3、 功能说明
  1. 数据显示
    • 使用 <sql:query> 标签执行 SQL 查询,获取用户数据。
    • 使用 <c:forEach> 标签遍历结果集,显示用户信息。
  2. 分页功能
    • 计算总记录数和每页显示的记录数。
    • 使用 <c:forEach> 标签生成分页导航链接。
    • 通过 currentPage 参数控制当前显示的页码。
  3. EL 的使用
    • 使用 EL 表达式 ${} 来访问变量和显示数据。
    • 支持复杂的逻辑操作和格式化输出。

四. 总结

通过本讲义,您已经掌握了 EL 和 JSTL 的核心功能及其在实际开发中的应用。EL 和 JSTL 的优势在于:

  1. 简化代码:通过标签代替 Java 脚本,降低代码复杂度。
  2. 提高可维护性:将逻辑和展示分离,使代码更易维护。
  3. 跨平台支持:支持多种数据源和数据库。

http://www.ppmy.cn/embedded/173743.html

相关文章

六十天前端强化训练之第二十二天之React 框架 15天深度学习总结(大师版)

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 一、React 核心架构思想&#xff08;深度解析&#xff09; 1.1 组件化思维革命 1.2 虚拟DOM的智慧 二、关键技术深度剖析 2.1 JSX 本质揭秘 2.2 Hooks 设计哲学 三、企业…

vue computed 计算属性简述

Vue 的 ‌计算属性&#xff08;Computed Properties&#xff09;‌ 是 Vue 实例中一种特殊的属性&#xff0c;用于‌声明式地定义依赖其他数据动态计算得出的值‌。它的核心优势在于能够自动追踪依赖关系&#xff0c;并缓存计算结果&#xff0c;避免重复计算&#xff0c;提升性…

如何学习VBA_3.2.20:DTP与Datepicker实现日期的输入

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的劳动效率&#xff0c;而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册&#xff0c;现在已经全部完成&#xff0c;希望大家利用、学习。 如果…

深入理解 HTML 表单与输入

在网页开发的广袤领域中&#xff0c;HTML 表单如同搭建用户与服务器沟通桥梁的基石。它是收集用户输入信息的关键渠道&#xff0c;承载着交互的重任。今天&#xff0c;就让我们一同深入探索 HTML 表单与输入的奥秘。​ HTML 表单在文档中划定出一片独特的区域&#xff0c;这片…

C++学习笔记(二十一)——文件读写

一、文件读写 作用&#xff1a; 文件读写指的是将数据从程序存储到文件&#xff0c;或从文件读取数据&#xff0c;以实现数据的持久化存储。 C 提供了 fstream 头文件&#xff0c;用于文件操作&#xff0c;主要包括&#xff1a; ofstream&#xff08;输出文件流&#xff09;—…

【实战解析】smallredbook.item_get_video API:小红书视频数据获取与电商应用指南

一、API功能定位 ​​​​smallredbook.item_get_video​​​​ 是小红书官方开放的笔记视频详情接口&#xff0c;核心能力包括&#xff1a; 获取视频直链&#xff08;无水印&#xff09;、封面图、时长等元数据提取笔记文本描述、标签、互动数据&#xff08;点赞/收藏/评论&…

​详细介绍 SetWindowPos() 函数

书籍&#xff1a;《Visual C 2017从入门到精通》的2.3.8 Win32控件编程 环境&#xff1a;visual studio 2022 内容&#xff1a;【例2.29】模态对话框 说明&#xff1a;以下内容大部分来自腾讯元宝。 ​1. 函数功能与用途 SetWindowPos() 是 Windows API 中用于动态调整窗口…

Figma介绍(基于云的协作式界面设计工具,主要用于UI/UX设计、原型制作和团队协作)

文章目录 注册和登录简单操作说明Figma介绍**核心特点**1. **云端协作与实时同步**2. **跨平台兼容**3. **高效设计工具**4. **原型交互与动效**5. **开发对接友好**6. **插件生态**7. **版本控制与历史记录** **适用场景**- **团队协作**&#xff1a;远程团队共同设计、评审、…